¿Cuánta precisión necesitas? Lo digo porque con ese timer nada más, te va a costar tener buena precisión.
Si esta estudiando y recien comienza parece que no necesita tanta precisión. Primero que aprenda a manejar el TMR y luego las demas cosas, no introducirle todo junto, esa es la idea del profesor.
En resumen (Debo poder medir una señal que entre por cualquier puerto y en un display lcd mostrar la frecuencia a la cual opera dicha señal.) La meta era que con este manejo de timer se pudiera interpretar la señal de un control remoto con protocolo IR y mostrar el boton oprimido. Es por eso que no puedo dar uso de otros
Simple, pone a correr el TMR0... la idea ya te la dijeron como es..
Detecto un flanco descendente
Valor anterior = el valor del TCNT0
Detecto otro flanco descendente
Valor actual = el valor del TCNT0
Luego tenes que Valor actual - Valor anterior = Cantidad de ciclos que pasaron.
Sabiendo la entrada de reloj y de preescaler, podes calcular cuanto tiempo tarda en contar 1 el TMR0
Ejemplo con 10Mhz y preescaler de clk/1 te vas a encontrar conque cuenta 1 cada:
Preescaler * \frac{1}{Frecuencia} = Periodo del Timer
En este caso es de T = 0.1us
Si usas un preescaler de 1024, quedaria T = 102.4us
Conociendo el tiempo que pasa en cada cuenta, y conociendo cuantas cuentas pasaron ( gracias a tu resta de lso valores tomados del TMR0 ) podes conocer cuanto tiempo paso:
Suponiendo que
Valor actual - Valor anterior = 100
Y el periodo es T = 102.4us
Quiere decir que el periodo de la señal fue:
100 * 102.4us = 10.24ms
Y por consecuente su frecuencia es 1 / 10.24ms = 97.65625 Hz
----------------
Limitaciones y consideraciones en esto.
El TMR0 es de 8 bits si no mal me equivoco. Y existe un problema si es que ocurre un overflow.
El mayor problema esta en que si no se fija uno en este indicador, nos puede jugar una mala pasada.
Supongamos una frecuencia de 100Hz, pero esta ves vamos a usar un preescaler mas pequeño clk/1
El tema es que para conseguir este valor el Timer debe contar 100000, lo cual es imposible ya que su maxima cuenta es de 255.
Este caso es muy extremo, pero esto te da una idea que para una frecuencia baja tendrias que tener en cuenta esto. Si tu profesor te indica un rango de frecuencia msomenos fijo, entonces eso te sirve como para seleccionar adecuadamente el preescaler y no hacer demasiados artilugios para llevar bien la cuenta.
Sino vas a tener que observar siempre el indicador de overflow. Y como actuo sobre este?
Supongamos que tu primer flanco y el primer valor te dio 24, mientras esperas el segundo flanco, lees continuamente el bit de overflow y el del timer, si resulta que : TOV0 = 1 y TCNT0 >= 24 entonces a tu valor de resta le tenes que sumar 256, procedes a borrar el bit de TOV0, y esperar nuevamente el flanco y mirando esas 2 cosas.
Si pasa suponete en total 2 veces y el "Valor actual" es de 50, entonces el valor total va a ser de :
Ciclos totales = (Valor actual - Valor anterior) + (CantDeOV * 256)
En el ejemplo:
Ciclos totales = (50 - 24) + (2 * 256) = 538 ciclos
Y superaste el limite de contar solo 255 como maximo
PD: Valor actual y Valor anterior si o si son de 8 bits, asi aprovechar el overflow de estos al restar.
PD2:
) La meta era que con este manejo de timer se pudiera interpretar la señal de un control remoto con protocolo IR y mostrar el boton oprimido.
Es cierto que difiere bastante de la pregunta inicial, pero tu pregunta ya esta resuelta con este post.