Hay 2 errores mas podria agregar,
El primero es hacer calculos/escribir en el LCD en una interrupcion. Aunque depende de que tan rapido lo haga y si no necesita de otra interrupcion.
El segundo es que tiene un mal concepto de que es una interrupcion en el Timer. al ver que en la interrupcion pregunta por que valor tiene el timer. Si ocurre la interrupcion por el Timer es por que paso de 0xFF a 0x00 ( si es 8 bits ) por lo tanto siempre leerias 0x00.
Empecemos como vas a medir la velocidad de la rueda, si pienso en timers se me ocurren 2 formas.
- Medir entre 2 pulsos del sensor para saber cuando tardo en dar una vuelta.
- Medir en un tiempo conocido cuantas vueltas pulsos dio el sensor ( Si lo hago cada un segundo, lo unico que tendria que hacer al numero que me de es multiplicarlo por 60 y ya tendria las RPM para pasarlo a velocidad deberia saber el radio de la rueda )
Vamos por parte dijo Jack.
El primer caso:
Significa que deberia tener 2 interrupciones, una de una entrada externa (sea por RB0 o por CCP) y otra del timer. Lo ideal un timer de 16bits
Al producirse la primer interrupcion por flanco ascendente pongo a 0 el timer y recien ahi habilito la interrupcion del timer.
La segunda interrupcion por flanco ascendente, tomo el valor del timer y luego lo pongo a 0, salgo aviso con un flag que ya esta listo el dato y que se procese en el main.
Proxima interrupcion por flanco ascendente, nuevamente tomo el valor y lo pongo a 0 nuevamente, aviso con un flag que entro y que se procese en el main.
Posibles problemas:
Que puede pasar que se tarde mucho en cruzar el sensor (se detenga la rueda o vaya muy lento), entonces deberias tener un "seguro" o la capacidad de contar mucho mas.
Con la interrupcion del timer vas a saber si el timer rebalso por completo y si pones un contador vas a saber cuantas veces sucedio, esto si o si tiene que estar.
Para este caso no conviene usar el Timer 0, conviene usar el Timer 1 o 3, que se usa con el modulo CCP. Esto hace que apenas se detecte un flanco ascendente/descendente se guarde automaticamente en otro registro el valor del timer y Se genera una interrupcion, de todas formas deberias de tener en cuenta lo anterior con respecto a los timers. Si es de 16 bits como cuando lo usas con el CCP incluso podes no ponerlo a 0 al timer y luego hacer la diferencia, valor nuevo - valor viejo = tiempo que paso
Segundo caso:
En este caso tambien seria ideal un timer de 16 bits o tal ves con 8 alcance, asi intentar llegar al segundo o tal ves valores como 0.2s,0.1s,etc
Aqui solamente configuras tu Temporizador a un tiempo predeterminado como dije antes y habilitas el modulo CCP para que cuente los flancos ascendentes ( si son muchos podes incluso dividirlo con su preescaler )
Cuando ocurre la interrupcion del Timer, guardas el valor que quedo del CCP, lo pones a 0 y avisas mediante un flag al main que ya esta listo para procesarse la informacion. Tambien recargas tu timer.
En tu main Si fuera de 0.1s el timer deberias multiplicar por 600 el valor almacenado en el CCP para saber cuantas RPM tenes.