Bumbum
21.01.2013, 11:14
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:
#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
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:
#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