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 ...
- Configura el modo de interrupción solo de vigilancia.
- Configura el preclasificador con el máximo de retraso de 8 segundos.
- Inicia el Watchdog.
- dormir.
- Despertar debido a algún INT externo distinto del Watchdog.
- Detén el Watchdog inmediatamente al despertarte.
-
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!