Arduino mit Atmega328: Watchdog kann nicht gelöscht werden

Ich verwende die integrierte Software-Watchdog-Funktion eines Atmega328, wie hier dokumentiert .
Mein Ziel ist es, die Ausführung eines Codeabschnitts, der zu endlosen Berechnungen führen könnte, auf 2 Sekunden zu begrenzen.

Dies ist das Pseudo-Code-Schema:

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

Der Rest des Codes sollte ausgeführt werden, wenn der möglicherweise endlose Code es schafft, in der angegebenen Zeit ausgeführt zu werden, andernfalls muss das gesamte Programm neu gestartet werden.

Dies ist der Arduino-Code, den ich in das Board geladen habe:

#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);
}

An diesem Punkt sollte die erwartete Ausgabe ein endloses Drucken von loop...Nachrichten sein, nach denen im Setup ( Started, watchdog ON/ OFF).

Überraschenderweise bekomme ich stattdessen Folgendes:

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

Anscheinend wird der Watchdog gesetzt, kann aber nicht gelöscht werden. Woher?

Antworten (2)

wdt_reset() 

deaktiviert den Watchdog nicht , er setzt lediglich seinen Timer zurück und verzögert den Ablauf.

Du willst wahrscheinlich

wdt_disable()

Ihr Gesamtansatz ist jedoch möglicherweise nicht der solideste - den Watchdog ablaufen zu lassen, kann clever sein, ist aber auch ziemlich schwerfällig im Vergleich zu Ansätzen wie der Verwendung eines normalen Timer-Interrupts oder der eigenen Codebegrenzung. Normalerweise ist der Watchdog für unvorhergesehene Fehler.

Danke... Ich schäme mich, dass ich es nicht vorher überprüft habe wdt_disable, es war so einfach. Ich wurde von mehreren Anleitungen abgelenkt, die ich las und die besagten, dass dies wdt_resetder Weg sei, und auch die Dokumentation war für mich etwas mehrdeutig.

Um den Watchdog-Timer zu deaktivieren, rufen Sie wdt_disable() auf . Alles wdt_reset(), was Sie tun müssen, ist das Watchdog-Timeout zurückzusetzen, was in Ihrem Fall überflüssig ist: Sie schalten es einfach zwei Zeilen darüber ein. wdt_reset()schaltet den Watchdog-Timer nicht aus (im Gegensatz zu Ihrer seriellen Ausgabe).