Cómo medir la duración durante la cual una señal de entrada permanece alta en un microcontrolador AVR

Escribo esta respuesta asumiendo que tiene conocimientos básicos de microcontroladores y sistemas integrados.

  1. Seleccione un pin en su microcontrolador que tenga funcionalidad de interrupción. Vas a conectar tu señal de entrada a este pin.
  2. Inicialice el controlador habilitando una interrupción de borde ascendente en el pin.
  3. En el borde ascendente ISR:
    1. Enciende un temporizador. Debe saber la duración máxima del temporizador. Asociar una interrupción al temporizador.
    2. Deshabilite la interrupción de borde ascendente y habilite una interrupción de borde descendente en el mismo pin.
  4. Cuando el temporizador se desborda, en el temporizador ISR incrementa una variable de desbordamiento.
  5. Cuando se produce la interrupción del borde descendente:
    1. Inhabilite el temporizador y recupere su conteo y conviértalo en tiempo. Multiplique la duración total del temporizador por el número almacenado en la variable de desbordamiento. Agregue este valor al tiempo que obtuvo después de recuperar el conteo del temporizador para obtener el tiempo.
    2. Inhabilite la interrupción del borde descendente y vuelva a cambiar el nombre de la interrupción del borde ascendente. Inicialice el desbordamiento y la variable del temporizador a cero y estará listo para su próximo pulso.

Les dejo que descubran cómo configurar el temporizador y la interrupción, y lo mismo se puede hacer leyendo la hoja de datos. También es posible que tenga que considerar muchas condiciones como la anidación de interrupciones. Por ejemplo, un desbordamiento que ocurre cuando su código está en el ISR de borde descendente, etc.

Ahora que se conoce la lógica, espero que pueda desarrollar su propio programa.

Feliz codificación !!!

Puedo decirle al Algoritmo, no el código.

  1. Habilite las interrupciones para el borde ascendente y el borde descendente para el GPIO de donde proviene la señal.
  2. Detectar el borde ascendente. En la rutina de servicio de interrupción, comience a contar el tiempo hacia arriba. Continúe incrementando en tiempo real, hasta que se detecte un flanco descendente.
  3. En el enrutamiento del servicio de borde descendente, registre el valor obtenido en la ubicación de memoria que desea
  4. Fin

Creo que este es un algoritmo simple, improvisar según el caso de uso de implementación.

Puede usar el contador para contar el temporizador o el tiempo hasta que la señal de entrada permanezca alta en AVR. Tenga en cuenta que la lógica del contador depende de la oscilación en la que trabaja el microcontrolador. Tienes que calcular en consecuencia. Aquí está el enlace más descriptivo del contador:

http://www.electroschematics.com

Fuente: http://www.electroschematics.com

Use el módulo de captura del microcontrolador. Proporcionará una interrupción cuando la señal cambie de alta a baja o viceversa (debe configurarla en consecuencia) y el tiempo durante cuánto tiempo fue alta / baja.

Simplemente conecte ese pin al CRO.