Una idea del temporizador puede ser la siguiente:
Utiliza el timer 1 (que es un registro de 16 bit) para contar los 2 minutos. Para hacer esto tienes que hacer unos pequeños cálculos con la frecuencia del reloj y activar el timer 1. Despues vas chequeando el flag de paso por cero del registro y vas incrementando una variable dentro del bucle. Cuuando la variable llegue a x cuentas serán 2 minutos, ahí tendrás que hacer lo que debas hacer Si entre medias ocurre algún evento entonces puedes inicializar la variable de la cuenta y el proceso de cuenta vuelve a comenzar. También puedes hacer este proceso con una interrupción en vez de con polling.
No se si me he exlicado o no pero te pongo un ejemplo que yo he utilizado para un timer de 1 minuto con un 16F628 a 20 MHz y que funciona bien.
APO VAR PORTB.5 " Pin del AUTO POWER OFF, a cero equipo encendido (SALIDA)
"DEFINICION DEL TIMER 1
T1CON=%00110001 "TIMER 1 CONTROL REGISTER
"Ajusto el Timer1 para que cuente con el oscilador interno y utilice
"el prescaler por 8
"Prescaler a 8 bit<5-4> --> 11
"T1OSCEN Timer 1 osc enable control bit, bit
> --> 0 (disable)
"T1SYNC no importa, bit<2> --> 0
"TMR1CS clock source, bit<1> --> 0 (internal clock, Fosc/4)
"TMR1ON timer1 On, bit<0> --> 1 (enable)
"Fosc=20000000, entrada prescaler=Fosc/4=5000000
"Salida prescaler=5000000/8=625KHz
"periodo=1/625KHz=1.6 microsegundos
"En un contador por 16 contara 65536 cuentas.
"En un segundo la señal cambia 625000 veces con lo que
"el contador se desbordara en un segundo 9.5 veces. Si deseo
"contar un minuto, 9.5*60= 570 veces que debe desbordarse el TMR1.
"Este valor puedo guardarlo en una variable WORD (16 bit).
"Podria ajustar el valor del tiempo a un maximo de 65536/570=114 minutos
"DEFINICION DE CONSTANTES
limitetiempo con 570 "Limite de cuentas de la variable tiempo para
"contar 1 minuto. Si se desea contar mas tiempo incremenar este valor
bucle:
.
.
."programa
.
if PIR1.0=1 THEN GOSUB temporizar "Si se desborda el timer controlo el evento
goto bucle
"*********************************************************************
"** SUBRUTINA: temporizar
"** Una vez que se desborda el TMR1, se viene a esta rutina
"** para controlar las veces que se ha desbordado y comprobar
"** si ha transcurrido un minuto (570 veces)(o el valor que haya ajustado
"*********************************************************************
temporizar:
tiempo=tiempo+1 "aumento en uno las veces que se ha desbordado
If tiempo>limitetiempo then
gosub apagar "Si ha trancurrido el tiempo apago
else
PIR1.0=0 "reseteo el flag para seguir contando
endif
Return
"** FIN RUTINA: temporizar
"*********************************************************************
"** SUBRUTINA: apagar
"** Pita y apaga el terminal
"*********************************************************************
apagar:
veces=2 "Pito 2 veces
j=1 "Durante 0.2 segundos
color_led=2 "Led rojo
GoSub pitar
APO=0
pause 5000 "espera para que se apague el termina mientras tanto.
Return
"** FIN RUTINA: apagar
Bueno espero que te sirva como idea.
Saludos
Ricky