Ayuda Recepción USART PIC

Bueno, Gracias Leo_programmer por la respuesta!. Acá te muestro un pequeño programita que hice para la recepción de los 4 bytes sin usar interrupción, por ahora no se si funcione bien... No se que dices?


;....................................................................................
DATA4 equ 0x09
DATA3 equ 0x0A
DATA2 equ 0x0B
DATA1 equ 0x0C
;...............................
Configuración del USART
;.................................

waitD4
btfss PIR1,RCIF ; byte recibido?
goto waitD4 ; NO!..ESPERAR
bcf PIR1,RCIF ; Si, restaura el flag de recepción
movf RCREG,W
movwf DATA4 ; mueve dato recibido a DATA4

waitD3 btfss PIR1,RCIF ; byte recibido?
goto waitD3 ; No! esperar!!
bcf PIR1,RCIF ; Si! restaura flag de interrupción
movf RCREG,W
movwf DATA3 ;

waitD2 btfss PIR1,RCIF ; byte recibido?
goto waitD2 ; No! esperar!!
bcf PIR1,RCIF ; Si! restaura flag de interrupción
movf RCREG,W
movwf DATA2 ;
goto waitD2 ;

waitD1 btfss PIR1,RCIF ; byte recibido?
goto waitD1 ; No! esperar!!
bcf PIR1,RCIF ; Si! restaura flag de interrupción
movf RCREG,W
movwf DATA1 ;
end
 
de nada turkito, mira, la idea del contador que ud pregunta es por que dependiendo del numero almacenado en esa variable, es que vamos a almacenarlo el dato recibido en otra variable destinada para eso, veo que si me entendió la idea, mas sin embargo, 2 cosas:

1- eso de data1 equ 0x09 no me parece, yo le doy ese equ para decir en que parte de la ram va a estar, es decir, su direccion de memoria, si mal no estoy, para los pic 16f87x la direccion de memoria disponible para proposito general es la 0x20, cambia el codigo a
data1 equ 0x20
data2 equ 0x21...

y lo que venga, por que en la 0x09 estas ocupando la direccion de porte, 0x0a=pclath,0x0b= intcon, y bueno, los registros de funcionamiento del micro, y entonces no estas guardando nada, para darle valor a dichas variables, tendrias que hacer

movlw valor_a_cargar
movwf data1
...
ojo con eso.

2- es mejor que siga con las interrupciones, por que no se ud pero yo nunca sé cuando voy a recibir un dato, y si el micro puede hacer mas cosas mientras espera ese dato, es mucho mejor, fijate en este ejemplo:

conta equ 0x20
data1 equ 0x21
data2 equ 0x22
data3 equ 0x23
data4 equ 0x24

org 0x04
goto interrupcion
...
clrf conta
...

interrupcion btfss pir1,rcif ;si no es la interrupcion de
goto sale ;recpcion, no lo tratamos
movlw 0x00
subwf conta,w ;es el dato 1?
btfsc status,z
goto dato1
movlw 0x01
subwf conta,w ;es el dato 2?
btfsc status,z
goto dato2
movlw 0x02
subwf conta,w ;es el dato 3?
btfsc status,z
goto dato3
movlw 0x03
subwf conta,w ;es el dato 4?
btfsc status,z
goto dato4
goto sale

dato1 movf rcreg,w
movwf data1 ;guardamos el dato
movlw 0x01
addwf conta,f ;incrementamos el contador
goto sale

dato2 movf rcreg,w
movwf data2 ;guardamos el dato
movlw 0x01
addwf conta,f ;incrementamos el contador
goto sale

dato3 movf rcreg,w
movwf data3 ;guardamos el dato
movlw 0x01
addwf conta,f ;incrementamos el contador
goto sale

dato4 movf rcreg,w
movwf data4 ;guardamos el dato
clrf conta ;borramos el contador
goto sale

sale bcf pir1,rcif
retfie

esa es la idea que yo le digo que haga, para mi es mucho mejor asi, se puede hacer un programa mucho mas eficiente con tablas y todo eso, pero nunca aprendi a manejarlas, un dia de estos me pongo a estudiarlas, no es tan dificil, cualquier cosa me avisa, cuidese...
 
Atrás
Arriba