problema recepcion uart pic16f876

hola buena tarde he estado trabajando con la uart del pic16f876, necesito recibir datos, lo estba haciendo con l siguiente rutina y todo bien:

RECIBE ;///////////// RUTINA DE RECEPCION SERIAL
BANKSEL PORTA
CLRF RCREG
CLRF RCREG
BSF RCSTA,CREN
BTFSS PIR1,RCIF
GOTO $-1
MOVF RCREG,W
BCF RCSTA,CREN
BANKSEL TRISA
RETURN

el problema ahora es que los datos a recibir son variables, es decir en ocasiones recibo 10 datos y en ocasiones 20 u otra cantidad, enonces necesito saber cuando ya no reciba datos para poder retornar de la rutina para recibir todos estos datos, implementé la siguiente rutina para recibir pero no me funciona, utilizo el tmr0, si se desborda despues del tiempo en que tarda un dato en ser recibido retorna con .10 que es una literal de control que tengo, de lo contrario recibe el dato y retorna con el en w. pero no me funciona, simplemente no hace nada.





RECIBE ;////////// RUTINA DE RECEPCION SERIAL
BANKSEL OPTION_REG
MOVLW B'00000111'
MOVWF OPTION_REG
BANKSEL PORTA
BCF INTCON,T0IF
CLRF TMR0
CLRF RCREG
CLRF RCREG
BANKSEL RCSTA
BSF RCSTA,CREN
LOOP_REC
BTFSS PIR1,RCIF
GOTO COMP_TMR0
GOTO FIN_REC
COMP_TMR0
BTFSS INTCON,T0IF
GOTO LOOP_REC
BCF INTCON,T0IF
BCF RCSTA,CREN
BANKSEL TRISA
RETLW .10

FIN_REC
BCF INTCON,T0IF
MOVF RCREG,W
BCF RCSTA,CREN
BANKSEL TRISA
RETURN

ya lo he simulado en mplab y al parecer corre todo bien.
algun tip que me pueda ayudar? gracias de antemano. saludos
 
Última edición:
No entiendo el problema, pero estoy casi seguro que estás "perdiendo" datos...

Para recibir datos de la USART y asegurarte de que no hay pérdidas deberías usar la rutina de interrupción, que te avisa al recibir un dato...

Un saludo,
Gonzalo
 
mucgas gracias por responder, de hecho tambien lo realicé con interrupciones pero tenia un problema diferente, ya que hay rutinas que estrictamente no deben ser interrumpidas, me estoy comunicando con un modem entonces me llegan datos de forma aleatoria que interrumpirian estas rutinas, asi, de esta forma como lo pienso hacer yo controlo cuando recibir datos.
se que hay mas formas de hacerlo, pero mi programa es muy grande y tengo varias restricciones, entonces de esta forma me funcionaria perfectamente.

me ayudarian mucho si me pudieran dar una pista de como resolver este problema de la forma que lo requiero ya que he probado de varias formas.

saludos y muchas gracias
 
Atrás
Arriba