ten en cuenta el concepto y el por qué funciona.
El TMR0 como timer no lo puedes parar pero si re-setear, el solito se incrementa dependiendo del prescaler, la solucion que usaste es cambiarlo a modo contador de pulsos por la entrada en RA4
Gracias JHOZATETienes razon,se me ha hecho muy dificil pararlo o simular pararlo de esa forma, pero me ha servido ese ejemplo...
cblock 0x0C
Contador
segundo
endC
org 0x04 ;Vector de interrupción
goto Interrupcion
org 0x05
Interrupcion
bcf INTCON,T0IF ;Repone flag del TMR0
decfsz Contador,F ;Decrementa contador. Ha habido 100 interrupciones?
goto Seguir ;No, no han pasado los 1000 mS = 1 SEGUNDO
Con_si_0
incf segundo,f ; INCREMENTA SEGUNDOS
movlw .100
movwf Contador ;Repone contador para contar 100 interrupciones
Seguir
movlw ~.39
movwf TMR0 ;Repone el TMR0 con 39
retfie ;Retorno de interrupción
;=================================================================
; Ejemplo resumido, sin antirebotes ni muchos detalles
; Se trata de chequear si SEGUNDO llega a 20
pulsador1
PRESIONADO ?
NO, goto pulsador1
SI, ENCIENDE
goto pulsador2
pulsador2
PRESIONADO ?
SI, goto cortar ;Si se presiona, interrumpe la Rutina
NO, segundo = 20 ? ; Ejemplo: Mira si segundo llegó a 20
SI, goto cortar ;Terminó la cuenta programada
NO, goto pulsador2 ; Aun no, sigue contando
cortar
CORTA
resetea segundo
goto pulsador1
Hasta ahi todo bien, funciona de maravilla, pausa el conteo, o si le reseteo el registro segundo inicia de cero.
Ahora he intentado, hacer lo mismo pero, a la interrupción del TMR0 le agregué una rutina ( MINU ) de 1 minuto y en cada minuto me incrementa un registro.
Luego chequeo un pulsador para cortarlo.
cblock 0x0C
Contador
MINU ;Rutina que cuenta de minutos deseados a contar.
endC
org 0x04 ;Vector de interrupción
goto Interrupcion
org 0x05
Interrupcion
bcf INTCON,T0IF ;Repone flag del TMR0
decfsz Contador,F ;Decrementa contador. Ha habido 100 interrupciones?
goto Seguir ;No, no han pasado los 1000 mS = 1 SEGUNDO
Con_si_0
call minuto ; LLAMA RUTINA DE MINUTO
incf MINU,f ; REGISTRO QUE INCREMENTA MINUTOS A CONTAR.
movlw .100
movwf Contador ;Repone contador para contar 100 interrupciones
Seguir
movlw ~.39
movwf TMR0 ;Repone el TMR0 con 39
retfie ;Retorno de interrupción
;=================================================================
Ejemplo resumido, sin antirebotes ni muchos detalles
Se trata de chequear si MINU llega a 20
pulsador1
PRESIONADO ?
NO, goto pulsador1
SI, ENCIENDE
goto pulsador2
pulsador2
PRESIONADO ?
SI, goto cortar ; Si se presiona, interrumpe la Rutina
NO, MINU = 20 ? ;Ejemplo: Mira si MINU llegó a 20
SI, goto cortar ;Terminó la cuenta programada
NO, goto pulsador2 ;Aun no, sigue contando
cortar
CORTA
resetea MINU
goto pulsador1
Y ahora pareciera que el TMR0 queda pegado en la rutina de 1 MINUTO y no chequea el pulsador2.
Me parece raro, ya que se supone que el TMR0 es independiente al resto del programa .....
Y porque en el primer programa ejemplo funciona y en el segundo no ? ....
Gracias a quien pueda sacarme la dura !!!