Programmation UART pic16f84 assembleur

Fermé
kixxxx Messages postés 1 Date d'inscription samedi 6 décembre 2008 Statut Membre Dernière intervention 6 décembre 2008 - 6 déc. 2008 à 14:17
 Nim65s - 3 févr. 2009 à 19:14
bonjour,

j'ai créer ce programme en m'inspirant d'autre programme, le but étant de lire les 8 bits des portB0-7 et de les envoyer par le portA1 suivant le protocole 9600bds, pas de bit de parité 1 bit d'arret .
soit 1 bit tous les 104µs.
j'utilise un quartz 4Mhz soit 1cycle/1µs.
j'envoi un signal sur le portA,0 pour demander le traitement.

je vous présente mon prog, il ya surement un erreur.( je sais beaucoup de nop mais bon...)

************************************************
; 9600 bauds/s 8 bits de données Pas de bit de parité
; 1 bit de STOP Pas de contrôle de flux

List p=16F84A ; processeur utilisé
#include <p16F84A.inc>

__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;bits de configuration :
;code protect OFF
;watchdog timer OFF
;power up timer ON
;oscillateur HS (quartz 4 MHz)

;xxxxxx
; macro
;xxxxxx

bank1 macro ; passage en banque 1
bsf STATUS,RP0
endm

bank0 macro ; passage en banque 0
bcf STATUS,RP0
endm

;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx

CBLOCK 0x000C ; début de la zone des registres d'usage général du 16F84A

compteur_tempo104 : 1

ENDC

;xxxxxxxxxxxxxxxxxxxx
; démarrage sur reset
;xxxxxxxxxxxxxxxxxxxx

org 0x0000
goto initialisation

;xxxxxxxxxxxxxxx
; initialisation
;xxxxxxxxxxxxxxx

initialisation

bank0
clrf PORTA ; mise à 0 des sorties du port A
clrf PORTB ; mise à 0 des sorties du port B

bank1
movlw B'00000001'
movwf TRISA
; bit 0 du port A (RA0) = 1 : configuration en entrée (RX)
; bits 1 à 4 du port A (RA1 à RA4) = 1 : configuration en sortie

movlw B'11111111'
movwf TRISB
; bit 0 du port B (RB0) = 0 : configuration en entrée
; bit 1 du port B (RB1) = 0 : configuration en entrée
; bit 2 du port B (RB2) = 0 : configuration en entrée
; bit 3 du port B (RB3) = 0 : configuration en entrée
; bit 4 du port B (RB4) = 0 : configuration en entrée
; bit 5 du port B (RB5) = 0 : configuration en entrée
; bit 6 du port B (RB6) = 0 : configuration en entrée
; bit 7 du port B (RB7) = 0 : configuration en entrée

bank0
movlw B'00011110'
movwf PORTA

movlw D'17'
movwf compteur_tempo104
goto debut_programme

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

; on attend un front montant sur A0
btfss PORTA , 0
goto debut_programme ; RX = 1

bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
nop
nop
btfsc PORTB,0
bsf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,1
bsf PORTA,1
btfss PORTB,1
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,2
bsf PORTA,1
btfss PORTB,2
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,3
bsf PORTA,1
btfss PORTB,3
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,4
bsf PORTA,1
btfss PORTB,4
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,5
bsf PORTA,1
btfss PORTB,5
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,6
bsf PORTA,1
btfss PORTB,6
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
btfsc PORTB,7
bsf PORTA,1
btfss PORTB,7
bcf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
nop
nop
nop
bsf PORTA,1
call tempo104
nop
nop
nop
nop
nop
nop
nop
nop
nop

goto debut_programme

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; routine de temporisation de 104 µs (104 cycles avec un quartz 4 MHz)
tempo104

decf compteur_tempo104 , f
movf compteur_tempo104 , f
btfss STATUS , Z
goto tempo104 ; compteur_tempo104 <> 0
movlw D'17'
movwf compteur_tempo104
nop
nop
nop
nop
return

END


kix

1 réponse

Bonsoir
Je sais pas si ton problème persiste, mais j'ai déjà fait ce programme pour mon PPE l'an dernier ; en regardant vite fait, je pense que la seule différence est le bit de stop : je crois qu'il dure un bit et demi chez moi... Enfin, ca te servira peut être :)

Les sources se trouvent là : http://vectoriailes.free.fr/FTP/Bonus%20=)/PS-v2/
0