Autor Tema: interrupción TMR0  (Leído 1582 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado norak

  • PIC10
  • *
  • Mensajes: 33
interrupción TMR0
« en: 03 de Abril de 2009, 06:44:25 »




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