03_WatchDog - jospicant/Attiny GitHub Wiki
WatchDog
-
el WatchDog tiene su propio reloj interno de 128KHz
-
Hay 3 modos de operación:
-
WDR (WatchDog Reset): Cuando el temporizador se desborda provoca el reset del micro, nos vale para salir de cuelgues cuando un programa se queda colgado por algún motivo.
-
WDT Interrupt: Cuando el temporizador se desborda (Interrupción por WatchDog habilitada) se ejecuta la ruitna de interrupción (El Flag de WDT Interrupt se activa) en vez de resetearse el micro, ejecuta la rutina de interrupción y continua donde se quedó.
-
Si ambos modos están habilitados, el primer timeout del WDT que se produzca trabaja como si solo estuviera el WDT Interrupt funcionando, por lo que se ejecutará la rutina de interrupción (se puede aprovechar para guardar información en EPROM ) pero el WDT Interrupt será deshabilitado automáticamente por el sistema y en el segundo timeout del WDT, volverá a tomar el mando el WDR (producirá un reset por WDT). En la inicialización del micro se debe volver a habilitar el WDT interrupt si quieres mantener los dos modos habilitados. El tener los dos modos habilitados es interesante por ejemplo para cuando quieras poder guardar los valores de las variables cuando se produzca un cuelgue inesperado ( no se sabe en que momento se puede producir ) y se aproveche la rutina de interrupción para hacer la copia de las variables importantes en el primer timeout antes de que el segundo timeout produzca un reset (el manejador de interrupciones debe terminar con un bucle infinito con el fin evitar daños desconocidos, provocar el segundo timeout y con este el reset del micro ) y no hayamos guardado las variables importantes ( nos puede valer para saber donde estábamos antes de colgarse el micro ), se usarán flags escritos en la EPROM para comprobarlos durante la inicialización para saber si realmente se han guardado las variables deseadas (podría ser que el maneajador de interrupciones no se hubiese ejecutado) y en la propia inicialización se resetearán dichos flags.
-
-
Si se programa el fuse WDTON solo es posible el modo WDR WatchDog Reset
-
Un Reset causado por otro motivo distinto del WatchDog dejará el WatchDog con su configuración por defecto establecida por sus fuses.
-
Podemos ver el flujo que se produce cuando el timer del WDT se desborda, si el borde se dibuja con líneas discontinuas, es porque dicha operación la realiza el micro de forma automática y si el borde está en línea continua, en dicha operación interviene el código del programador:
- El flujo que se debe tener en cuenta cuando ambos WDT están habilitados y queremos hacer un BACKUP de nuestra información ante un cuelgue inesperado de nuestro programa es el siguiente (los cuadros con líneas discontinuas son operaxciones donde no interviene el programador, las realiza automáticamente el HW del micro ):
WDT Interrupt como fuente para despertar al micro.
-
Al tener su propio reloj independiente, nos permite tener solo los timers del WDT activos cuando el micro está durmiendo, conseguir bajos consumos ( 3uA ) y usar el WDT como fuente para despertar al micro cada x tiempo.
-
Un posible flujo para gestionar el WDT como fuente para despertar el micro se muestra en el siguiente gráfico:
- Si se quiere dormir y despertar de forma periódica el micro, no deshabilitaríamos WDT Interrupt.
- Nota: el WDR debe estar deshabilitado.
Acciones al inicializar
-
El código de inicio debe chequear el Flag de Reset de WDT ( WDRF ) y deshabilitar el modo WDR si nunca se va a usar. Esto es válido cuando el fusible WDTON no está programado, Si el fusible WDTON está programado el modo de WDR no estará activo.
-
Si se usa el modo WDR, se debe gestionar el flag WDRF, lo más fácil es ignorarlo (consideramos un cuelgue ocasional) pero si existe cuelgues repetidos, gestionar el WDRF nos puede ayudar a manejar los errores.
-
Se puede usar la memoria no volátil para llevar una cuenta de los resets realizados por WDR e informar si excede de cierta cantidad.
Cómo cambiar la configuración del wDT
-
Con el fin de que no orucrran cambios en la configuración del WDT de forma inesperada, para poder cambiar la cofiguración del WDT, se necesitan unas secuencias temporales concretas para poder desactivar el modo WDR o el periodo del timeout.
-
Para deshabilitar el modo WDR WDE=0 se debe:
- En la misma operación poner WDE=1 y WDCE=1
- antes de 4 ciclos de reloj debe poner WDE=0
-
Para cambiar el periodo del timeout WDP se debe:
- Poner WDCE=1
- antes de 4 ciclos de reloj debe poner WDP deseado
-
Cofigurar WDT interrupt mode (WDIE =1/0 ) o habilitar WDR (WDE=1) no necesita consideraciones especiales.
-
Las interrupciones deben deshabilitarse cuando se quiera cambiar la configuración del WDT (no haya posibilidad de interrumpir los 4 ciclos necesarios)
-
Podemos ver los pasos necesarios en los siguientes flujos: