Arduino con Atmega328: no se puede borrar el perro guardián

Estoy usando la función de vigilancia del software a bordo de un Atmega328 como se documenta aquí .
Mi propósito es limitar a 2 segundos la ejecución de una parte del código que podría conducir a un cálculo interminable.

Este es el esquema de pseudocódigo:

enable watchdog (2 seconds)
run may-be-endless code
clear watchdog
run the rest

El resto del código debe ejecutarse si el código puede ser interminable logra ejecutarse en la cantidad de tiempo dada, de lo contrario, se debe reiniciar todo el programa.

Este es el código de Arduino que cargué en la placa:

#include <avr/wdt.h>

void setup() {

  Serial.begin(9600);

  Serial.println("Started");

  wdt_enable(WDTO_2S);
  Serial.println("watchdog ON");

  wdt_reset();
  Serial.println("watchdog OFF");

}

void loop(){
  Serial.println("loop...");
  delay(1000);
}

En este punto, la salida esperada debería ser una impresión interminable de loop...mensajes, después de los de la configuración ( Started, watchdog ON/ OFF).

Sorprendentemente, lo que obtengo en su lugar es esto:

Started
watchdog ON
watchdog OFF
loop...
loop...
loop...
Started
watchdog ON
watchdog OFF
loop...
loop...
loop...
Started
watchdog ON
watchdog OFF
loop...
loop...
[...]

Aparentemente, el perro guardián se está configurando pero no se puede borrar. ¿Cómo?

Respuestas (2)

wdt_reset() 

no deshabilita el perro guardián, simplemente reinicia su temporizador, retrasando la expiración.

probablemente quieras

wdt_disable()

Sin embargo, su enfoque general puede no ser el más sólido: dejar que el perro guardián caduque puede ser inteligente, pero también es bastante estricto en comparación con enfoques como el uso de una interrupción de temporizador normal o que su código se limite a sí mismo. Normalmente, el perro guardián es para errores imprevistos.

Gracias... Me da vergüenza no haberlo comprobado wdt_disableantes, fue así de fácil. Me distrajeron varios procedimientos que leí que decían que ese wdt_resetera el camino, y también la documentación era un poco ambigua para mí.

Para deshabilitar el temporizador de vigilancia, llame a wdt_disable() . Todo wdt_reset()lo que hace es restablecer el tiempo de espera del perro guardián, que en su caso es redundante: simplemente enciéndalo dos líneas arriba. wdt_reset()no apaga el temporizador de vigilancia (al contrario de su salida en serie).