Este es un ejemplo del timer 1 para retardar. Se producen 2 cuentas por segundo. En tu caso deberás ajustar el timer para que saltara cada 0.5 segundos. Se explican cada uno de los registros y se hacen los cálculos metodicamente:
"*************************************************************************
"** SUBRUTINA: retardar
"** conecta el timer1 para medir los retardos y activa f_retardo
"*************************************************************************
"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) comienza la cuenta
"Fosc=4000000, entrada prescaler=Fosc/4=1000000
"Salida prescaler=1000000/8=125KHz
"periodo=1/125KHz=8 microsegundos
"En un contador por 16 contara 65536 cuentas, pero para que salga un numero
"entero de veces que se desborda por segundo tiene que contar 62500 cuentas.
"por lo tanto tengo que cargar en el Timer 1 65536-62500=3036
"En un segundo la señal cambia 125000 veces con lo que
"el contador se desbordara en un segundo (125000/62500) =2 veces. Si deseo
"contar 30 seg., 2*30= 60 veces que debe desbordarse el TMR1.
"Este valor puedo guardarlo en una variable WORD (16 bit).
"El valor máximo del retardo es 255 segundos que son 510 desbordamientos
retardar:
tiempo=0 " inicializo las cuentas de desbordamiento
TMR1H=%00001011:TMR1L=%11011100 "cargo timer1 al valor 3036--> 101111011100
PIR1.0=0 "reseteo el flag para seguir contando
T1CON=%00110001 "TIMER 1 CONTROL REGISTER arranco el timer1
Return
"** FIN SUBRUTINA: retardar
En tu caso, todas estas cuentas te valen porque el tiempo transcurrido en un desbordamiento según está son 500000 microsegundos. Con lo que un desbordamiento son 0.5 segundos. Ya tienes la base de tiempo calculada.
--------------------------------------
Por otra parte debes ajustar el Timer cero para que cuente los pulsos exteriores. Te pongo este ejemplo que tengo aquí pero tienes que modificarlo, porque está conectado al oscilador interno y tu debes conectarlo al pin externo tambien es posible que tengas que ajustar el prescaler.
"DEFINICION DEL TIMER 0
"OPTION_REG=%10000111 "OPTION REGISTER (TIMER0)
"<bit7> /RBPUA pull up port B. No aplicable. 1 deshabilitadas
"<bit6> INTEDG flanco activo para la INT. No aplicable.
"<bit5> T0CS Timer0 Clock Source. 0 para reloj interno
"<bit4> T0SE Flanco activo si clock entra por RA4. No aplicable.
"<bit3> PSA El prescaler lo asigno a Timer0. 0 para Timer0
"<bit2> <bit1> <bit0> PS2,PS1,PS0, Divido el reloj por 256, --> 1,1,1
"TMR1ON timer1 On, bit<0> --> 1 (enable) comienza la cuenta
"Fosc=4000000, entrada prescaler=Fosc/4=1000000
"Salida prescaler=1000000/256=3906,25Hz
"periodo=1/3,90625KHz=256 microsegundos
"En un contador por 8 contara 256 cuentas, pero para que salga un numero
"entero de veces que se desborda por segundo tiene que contar 244 cuentas.
"por lo tanto tengo que cargar en el Timer 1 256-244=12 (%00001100)
"En un segundo la señal cambia 3906,25 veces con lo que
"el contador se desbordara en un segundo (3906,25/244) =16,0092 veces. Si deseo
"contar 60 seg., 16*60= 960 veces que debe desbordarse el TMR0.
"Este valor puedo guardarlo en una variable WORD (16 bit).
"El valor máximo del retardo es 255 segundos x 16 son 4080 desbordamientos