Hola,
Que rutina creeis que es más robusta ante un fallo del TMR0.
En el tipo de fallo que estoy pensando es que no se active el flag del desborde.
En el primer ejemplo, habilito la interrupcion del TMR0 y tengo que "consumir" tiempo,
hasta que se produzca la interrupción, pero de la forma que lo tengo tendría problemas.
Se os ocurre alguna forma de no hacer nada hasta que se produzca la interrpción,
pero que no tengas problemas cuando regreses de ella???
En el segundo ejemplo, simplemente no habilito la interrupción,
pero testeo el flag hasta que se produzca el desborde.
Pero si nunca se activa el flag, estaríamos en un bucle infinito.
El tercer ejemplo es igual que el segundo pero con protección SW.
si se supera el tiempo, en el que se debería haber producido el desborde, y por tanto activado el flag,
pero éste no se ha activado, me salgo del bucle.
Gracias,
Pd, PIC18F4585
Instrucciones PC = PC + 2
INTERRUP ENABLE
--------------------------------------------------------------------------------------------------------
bsf T0CON,7 ; TMR0 sets ON
NOP ; cuando volvamos aqui del retfie PROBLEMA
bra $-2 ; Return Previous instruction
INTERRUP DISABLE
--------------------------------------------------------------------------------------------------------
bsf T0CON,7 ; TMR0 sets ON
DL_P0: btfss INTCON,2 ; TMR0 overflowed ¿?
bra DL_P0 ; NO --> TMR0F == 0 continue waiting for TMR0 overflow
return ; YES --> TMR0F == 1
INTERRUP DISABLE
--------------------------------------------------------------------------------------------------------
setf dttmr ; dttmr = b'11111111'
bsf T0CON,7 ; TMR0 sets ON
DL_P0: btfsc INTCON,2 ; TMR0 overflowed ¿?
bra overflow ; YES --> TMR0F == 1
decfsz dttmr,0 ; NO --> TMR0F == 0
bra DL_P0 ; continue waiting for TMR0 overflow
bsf Flags,err ; TIMEOUT (2 + 1 + 2) * 255 * 0.1us * 4 == 510 us --> TMR0 overflow doesn´t occur
return
overflow: bcf Flags,err ; OK
return