Hallo,

ich wollte gerade den Watchdog zu meiner fertigen Software hinzufügen. Der Controller ist ein ATmega 162. Aber es klappt nicht. Hier mal das Code-Schnipsel, dass ich zum testen verwende:

Code:
#include <avr/wdt.h>

#define Summer1    PORTE = (PORTE | 1<<PE1)
#define Summer0    PORTE = ~(~PORTE | 1<<PE1)
int main (void)
{
 wdt_reset ();
 WDTCR = (1<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); // Watchdog aktivieren

 Summer0;      // Summer Ausgang konfigurieren
 DDRE = (DDRE | 1<<PE1);

wdt_reset ();
Summer1;
_delay_ms (20);
Summer0;

while (1)
wdt_reset ();
}
Nicht viel wie man sieht. Es wird lediglich der Watchdog initalisiert. Als Zeit wollte ich die ca. 2,2 Sekunden verwenden. Wie im Datenblatt angegeben müssen dazu alle drei WDP Bits gesetzt werden.

Nach dem konfigurieren des Watchdog wird noch der Ausgang für einen Piezo-Summer konfiguriert und dieser für 20 ms eingeschaltet. Das Programm resetet aber ständig. (Wiederholtes kurzes Piepsen des Piezo) Wenn ich die Wartezeit des Summers auf 10 ms reduziere piepst es genau einmal. Ich vermute also, dass der Watchdog noch auf der Default-Wartezeit von 17 ms steht.

Ich habe schon alle möglichen Kombinationen der WDP Bits probiert, diese auch mal vor oder nach setzen des WDE Bits gesetzt, Das WDTCR Register manuell gesetzt (0b00011111) aber immer das gleich Verhalten.

Die WDTON Fuse ist nicht gesetzt. Der Controller läuft an einem Quarz mit 3,6864 Mhz. Die CKDIV8 Fuse ist nicht gesetzt. Brown-Out Fuse ist auch nicht gesetzt. Die SUT_CKSEL steht auf Ext. Crystal 3-8 Mhz, Startup-Time 16 CK + 65 ms.

Was mache ich falsch? Wie konfiguriere ich den Watchdog richtig, dass er erst nach den ca. 2,2 Sekunden einen Reset durchführt?

Viele Grüße
Andreas

- - - Aktualisiert - - -

Jetzt habe ich die Lösung selbst rausgefunden. Durch Googeln bin ich auf ein Beispiel aufmerksam geworden, dass den Watchdog über die Funktion wdt_enable aus der Bib WDT aktiviert und so funktioniert es:

wdt_enable (WDTO_2S);

Warum ist mir allerdings unerklärlich...

Viele Grüße
Andreas