Que tal amigo, mira hace algun tiempo me di a la tarea de realizar un velocimetro pero sin meterme a trabajar con los timer pero si trabajé con la interrupción en RB0, no es como lo planteas pero puede funcionar una precisión aceptable pero no exacta ya que empleo un retardo asignado para el calculo de la velocidad. El programa está realizado en Mikrobasic,no recuerdo de momento todos los detalles per tiene areas de mejora pero te puede servir.
program Km_hr
'Este programa describe el trabajo de un velocímetro con indicador de velocidad
'y kilómetros recorridos en un trayecto. Emplea un Pic 16F873 con cristal 4 MHZ
'emplea variable float las cuales permiten trabajar con números fraccionarios se
'usa la interrupción externa INT por RB0
dim velocidad,distancia,perimetro as float
dim avance, km as float
dim tiempo as integer
dim salida1 as string[17]
dim salida2 as string[7]
sub procedure interrupt
if testbit(INTCON,1) then 'Pregunta si interrupción es x cambio en RB0
distancia = distancia + perimetro
avance = avance + perimetro
delay_ms(5)
end if
clearbit(INTCON,1) 'Limpia flag de interrupción por RB0
end sub
main:
ADCON1 = %00000111
portb = 0 'Limpia puerto B
trisa.0 = 1 'Pin0 como entrada
trisb = %00000001 'Puertoa B como salida RB0 entrada
setbit(intcon,4) 'Habilito interrupción INT/RB0
setbit(intcon,7) 'Habilito GIE interrupciones generales
distancia = 0 'Reseteo distancia
tiempo = 1 'Tiempo = 1 segundo
perimetro = 0.125 'Perímetro en metros
avance=0
Lcd_Init(PORTB) 'Initialize LCD on PORTB
Lcd_Cmd(Lcd_CURSOR_OFF) 'Cursor apagado
Lcd_Out(1, 1, "Velocimetro V1.0")'Imprime text en LCD
Lcd_Out(2, 1, "PRODIEL 2009 ") 'Imprime text en LCD
delay_ms(1000)
Lcd_Cmd(Lcd_Clear)
Lcd_Out(1, 10, "km/h") 'Print text at LCD
Conteo:
distancia = 0
delay_ms(1000) 'Deja pasar 1 segundo antes de calcular
velocidad=((distancia/tiempo)*3.6)'Fórmula de velocidad
km = avance/1000 'Calcula los kilómetros acumulados
if porta.0=1 then 'Reseteamos el acumulador de km
delay_ms(50)
km=0
end if
FloatToStr(velocidad, salida1) 'Convierte variables Float a string
FloatToStr(km, salida2)
Lcd_Cmd(Lcd_CURSOR_OFF) 'Cursor off
Lcd_Out(1, 1, salida1) 'Print text at LCD
Lcd_Out(2, 1, salida2)
Lcd_Out(2, 14, "km") 'Print text at LCD
goto Conteo
end.
Saludos