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?
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
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.
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...
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!
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.
Faraón