Pues bueno, estoy haciendo un programa en el que tengo que contar tres tiempos y lo estoy haciendo con los tres TIMERs, es en un 16F886, cada uno cuenta su tiempo y al terminar provoca una interrupcion, pero simulando me pasaba que se provocaba una interrupcion por desbode de TMR1 o TMR2 y cuando llegaba a la interrupcion se me activaba lo que se tenia que activar con la interrupcion del TMR0.
Lo tenia asi:
INICIO_ISR
movwf W_Temp ; Copiamos W a un registro Temporal
swapf STATUS, W ; Invertimos los nibles del registro STATUS
movwf STATUS_Temp
ISR
btfsc INTCON,T0IF ; miramos si la interrupcion es por TIMER0
goto ACTIVAR_R ; es por TIMER0 vamos a activar TRIAC_R
btfsc PIR1,TMR1IF ; Consultamos si es por TMR1
goto ACTIVAR_S ; es por TIMER1 vamos a activar TRIAC_S
btfsc PIR1,TMR2IF ; consultamos si es por TIMER2
goto ACTIVAR_T ; es por TIMER2 vamos a activar TRIAC_T
goto FIN_ISR ; si no fue ninguna, va a salir de la interrupcion
Analizando el problema veo que efectivamente no salto la interrupcion del TMR0 porque estaba desactivada ya que INTCON,T0IE esta a 0 y por tanto enmascara dicha interrupcion, pero como TMR0 cuenta siempre y no se puede parar (si alguien sabe como se hace que me lo diga) y el flag INTCON,T0IF se activa aunque la interrupcion no este activa da como resultado que se produce una interrupcion, cualquiera que este activada y si en la rutina ISR chequeamos primero si fue por TMR0 nos dira que si aunque sea mentira.
Bueno la solucion que veo y que estoy aplicando, es simplemente chequear T0IF de ultimo, ya que los otros dos TMRs si se comportan bien y cuando no estan activados no cuentan y cuando quieras que cuenten los activas y listo.
Queda de esta manera:
INICIO_ISR
movwf W_Temp ; Copiamos W a un registro Temporal
swapf STATUS, W ; Invertimos los nibles del registro STATUS
movwf STATUS_Temp
ISR
btfsc PIR1,TMR1IF ; Consultamos si es por TMR1
goto ACTIVAR_S ; es por TIMER1 vamos a activar TRIAC_S
btfsc PIR1,TMR2IF ; consultamos si es por TIMER2
goto ACTIVAR_T ; es por TIMER2 vamos a activar TRIAC_T
btfsc INTCON,T0IF ; miramos si la interrupcion es por TIMER0
goto ACTIVAR_R ; es por TIMER0 vamos a activar TRIAC_R
goto FIN_ISR ; si no fue ninguna, va a salir de la interrupcion
Bueno asi de momento en la simulacion funciona bien.
No se si es exactamente un fallo de Microchip, o simplemente que al estar asociado al WDT tiene que funcionar de esta manera, aunque el WDT tambien esta desactivado.