Cómo funciona Watchdog Timer en Arduino
Cómo utilizar el Perro Guardián en Arduino
La placa Arduino UNO tiene como unidad de control el chip ATmega328P.
El ATmega328P tiene un Watchdog Timer que es una característica útil para ayudar al sistema a recuperarse de escenarios en los que el sistema se cuelga o congela debido a errores en el código escrito o debido a condiciones que pueden surgir debido a problemas de hardware.
¿Cómo funciona el Watchdog Timer?
El temporizador watchdog debe ser configurado de acuerdo a las necesidades de la aplicación.
El Watchdog Timer utiliza una fuente de reloj interna de 128 kHz.
Cuando está habilitada, empieza a contar desde 0 hasta un valor seleccionado por el usuario. Si el Watchdog Timer no se reinicia cuando alcanza el valor seleccionado por el usuario, el watchdog reinicia el microcontrolador.
El Watchdog Timer ATmega328P puede configurarse para 10 ajustes de tiempo diferentes, el tiempo después del cual el Watchdog Timer se desborda, causando así un reinicio.
Los distintos momentos son los siguientes 16ms, 32ms, 64ms, 0.125s, 0.25s, 0.5s, 1s, 2s, 4s y 8s.
Ejemplo
Veamos como configurar el Watchdog Timer para una placa Arduino UNO.
Aquí usaremos un ejemplo simple de parpadeo de LEDs.
Los LEDs parpadean durante cierto tiempo antes de entrar en el bucle while(1). El bucle while(1) se utiliza como sustituto de un sistema en estado colgado.
Dado que el Watchdog Timer no se reajusta cuando está en el bucle while(1), el watchdog provoca un reinicio del sistema y los LEDs empiezan a parpadear de nuevo antes de que el sistema se cuelgue y se reinicie de nuevo. Esto continúa en un bucle.
Aquí, usaremos el LED de la placa conectado al pin 13 de la placa Arduino UNO. Para este sketch de ejemplo, lo único que se necesita es la placa Arduino UNO.
A tener en cuenta con el Watchdog Timer
El Watchdog Timer se desactiva al inicio del código. Se utiliza un retardo de 3 segundos antes de habilitar el Watchdog.
Este retraso es importante para que el gestor de arranque de Arduino pueda comprobar si se está cargando un nuevo código y para darle tiempo de grabar el código en el flash.
Esto es importante como precaución. Puede ocurrir una situación en la que, debido a una codificación defectuosa o a consideraciones inadecuadas, el código escrito restablezca el microcontrolador a duraciones muy cortas de forma infinita.
Esto dañará la placa Arduino y provocará que los códigos no se carguen en la placa.
Este puede no ser el caso para el nuevo cargador Optiboot que viene con la nueva versión de Arduino, pero definitivamente ocurrirá con los más antiguos.
En caso de que rompas el Arduino de esta manera, tendrás que quemar el cargador de arranque usando un Arduino diferente como ISP en el Arduino bloqueado.
Código
#include<avr/wdt.h> /* Header for watchdog timers in AVR */
void setup() {
Serial.begin(9600); /* Define baud rate for serial communication */
Serial.println("Watchdog Demo Starting");
pinMode(13, OUTPUT);
wdt_disable(); /* Disable the watchdog and wait for more than 2 seconds */
delay(3000); /* Done so that the Arduino doesn't keep resetting infinitely in case of wrong configuration */
wdt_enable(WDTO_2S); /* Enable the watchdog with a timeout of 2 seconds */
}
void loop() {
for(int i = 0; i<20; i++) /* Blink LED for some time */
{
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
wdt_reset(); /* Reset the watchdog */
}
while(1); /* Infinite loop. Will cause watchdog timeout and system reset. */