Leer el temporizador de vigilancia de AVR

1

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

Caso de uso previsto: para obtener una idea aproximada (muy aproximada, +/- 1 seg) 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.

He intentado buscar en la hoja de datos de attiny85 y no la he encontrado. ¿Alguna idea de gente?

    
pregunta user2702772

4 respuestas

4

Establezca el watchdog a 1s segundo, luego configúrelo en modo de interrupción, cuando la interrupción ocurre, el watchdog se configura nuevamente en el modo de reinicio y luego su código tiene que configurarlo manualmente en el modo de interrupción, de esa manera puede usar el temporizador de vigilancia. como un temporizador de 1 segundo y el controlador de función aún tiene la función 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 el temporizador expire y reinicie el micro. He usado el perro guardián de esta manera en un attiny10

    
respondido por el Kvegaoro
1

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

Si fuera yo, usaría mi propio temporizador, que se reiniciaba cada vez que se hacía 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.

    
respondido por el stefandz
1

Tenga en cuenta que no estoy recomendando esta solución, solo estoy demostrando 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 en casi todos los casos de uso de la vida real.

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

  1. Configura el modo de interrupción solo de vigilancia.
  2. Configura el preclasificador con el máximo de retraso de 8 segundos.
  3. Inicia el Watchdog.
  4. dormir.
  5. Despertar debido a algún INT externo distinto del Watchdog.
  6. Detén el Watchdog inmediatamente al despertarte.
  7. En un bucle, recorra los valores anteriores al más alto.

    d. borre la bandera de interrupción del perro guardián

    a. establezca el prescaler en el valor del bucle.

    b. compruebe si el indicador de interrupción de vigilancia se ha establecido.

    c. pasar 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 prescaller.

Tenga en cuenta que no he probado si el cambio del valor del prescaler actualizará de forma asíncrona el valor de WDIF incluso cuando el watchdog no se está ejecutando, pero se basa en this , mi conjetura es que lo hace. Incluso si no lo hace, entonces este método aún puede funcionar, solo necesita crear un controlador de interrupción de vigilancia que establezca un indicador en algún lugar que indique que se llamó. Luego simplemente verifique este indicador después de cada actualización del prescaler para ver si se disparó la interrupción.

Si puedes convencerme de que tienes uno de los casos de uso poco probables en los que esto realmente tiene sentido, ¡entonces haré girar un código para armar los detalles!

    
respondido por el bigjosh
0

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

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

    
respondido por el Nasr

Lea otras preguntas en las etiquetas