Leer el temporizador de vigilancia AVR

Temporizadores de vigilancia AVR. ¿Hay alguna forma de leer el temporizador de vigilancia desde el código?

Caso de uso previsto: para tener una idea aproximada (muy aproximada, +/- 1 segundo) de cuánto tiempo ha pasado desde que se reinició por última vez el temporizador de vigilancia. Esto permitiría que mi código adivine cuánto tiempo ha estado dormido, sin un RTC externo o similar.

Intenté buscar en la hoja de datos de attiny85 y no la encontré. ¿Alguna idea gente?

Respuestas (4)

Configure el perro guardián en 1 segundo, luego configúrelo en modo de interrupción, cuando ocurre la interrupción, el perro guardián se configura nuevamente en modo Restablecer y luego su código tiene que configurarlo manualmente en modo de interrupción, de esa manera puede usar el temporizador de vigilancia como un 1 segundo temporizador y todavía tienen el perro guardián funcional porque si después de la ejecución de la interrupción hay una ventana de un segundo para configurar el perro guardián en modo de interrupción antes de que expire el temporizador y restablecer el micro. He usado el perro guardián de esta manera en un attiny10

Esta es la solución más sencilla. Dado que el tiempo más largo que podrá medir con el perro guardián en un solo sueño es de todos modos 8 segundos, esto significará que, como máximo, se despertará 8 veces más a menudo. Puede hacer que el código que se ejecuta en cada activación sea muy, muy rápido, simplemente incremente un contador de segundos en un registro, configure WDIE, duerma. Probablemente incluso pueda poner este código directamente en la tabla de vectores para ahorrar un salto (suponiendo que no necesita los vectores USI).
Esta es la mejor respuesta aquí, creo. El truco de la tabla de vectores también sería una exhibición inteligente :)

Por lo que entiendo en la hoja de datos, el restablecimiento de WDT es una señal AND de un conjunto de relojes divididos de 128 kHz que se ejecutan a través del preescalador WDT y, como tal, no se almacena en un registro para que usted lo lea.

Si este fuera yo, usaría mi propio temporizador que se reiniciaba cada vez que se activaba el WDT. Luego podría sondear esto para estimar el tiempo transcurrido desde el último reinicio. Esto es más independiente del hardware y, por lo tanto, más portátil.

¿El modo de reposo no pondría también los temporizadores en reposo? ¿O los temporizadores no están vinculados al reloj de la CPU?
Si duerme en modo inactivo, el temporizador 1 sigue funcionando y se puede usar para activar el AVR si es necesario, o se puede sondear cuando alguna otra interrupción active el AVR. Consulte la Sección 7.1.1 de la hoja de datos.
Incluso con la configuración de potencia más baja posible con un reloj RC de 128 kHz, el modo inactivo utiliza del orden de 50-100 uA. El modo de apagado con Watchdog habilitado solo usa del orden de 3-9 uA, por lo que Watchdog con apagado es mucho más eficiente que un temporizador normal en reposo.
@bigjosh, ese puede ser el caso, pero no es la pregunta: todavía no le permite saber cuánto tiempo ha estado dormido cuando otra fuente de interrupción lo despierta

Tenga en cuenta que no estoy defendiendo esta solución, solo mostrando que creo que es posible. Creo que la respuesta de Kvegaoro es más práctica e incluso es probable que use menos energía para casi todos los casos de uso de la vida real.

Creo que podrías hacer algo como esto...

  1. Configure el modo de solo interrupción del perro guardián.
  2. Configure el precaller con un retraso máximo de 8 s.
  3. Inicie el perro guardián.
  4. Dormir.
  5. Wake debido a alguna INT externa que no sea Watchdog.
  6. Detenga el Watchdog inmediatamente después de despertar.
  7. En un bucle, avance a través de los valores del precalador de mayor a menor.

    d. borrar el indicador de interrupción de Watchdog

    a. establezca el preescalador en el valor del bucle.

    b. verifique si el indicador de interrupción de Watchdog se ha establecido.

    C. desplazar el bit de la prueba anterior a un registro de desplazamiento.

Al final de todo esto, el registro de desplazamiento ahora debería tener los bits superiores del valor dentro del contador de prellamada.

Tenga en cuenta que no he probado para ver si cambiar el valor del preescalador actualizará de forma asíncrona el valor de WDIF incluso cuando el perro guardián no se esté ejecutando, pero en base a esto , supongo que sí. Incluso si no es así, entonces este método aún puede funcionar, solo necesita crear un controlador de interrupción de vigilancia que establezca una bandera en algún lugar que indique que fue llamado. Luego, simplemente verifique este indicador después de cada actualización del preescalador para ver si se disparó la interrupción.

Si puede convencerme de que tiene uno de los casos de uso poco probables en los que esto realmente tiene sentido, ¡entonces desarrollaré un código para elaborar los detalles!

Esto resolvería mi problema. Es una idea terrible , y no veo ninguna ventaja sobre la solución de Kvegaoro. Pero realmente responde a mi pregunta y es una solución increíble. También creo que sería gracioso ver esto implementado. ¡Aunque no puedo justificarlo de ninguna manera!

El temporizador de vigilancia se utiliza para restablecer el microcontrolador si entra en un bucle infinito. Solo puede habilitar WDT con el tiempo preferido o deshabilitarlo. No puede leer el valor del temporizador de vigilancia .

Puede usar el temporizador normal para despertar su AVR del modo de suspensión cuando se desborda.