Watchdog programmieren

OP #2256721
Lesenswert?

Wie gehe ich richtig mit dem Watchdog im MEGA32 um ?

Ich muss die Headerdatei wdt.h (#include <avr/wdt.h>) in das Programm 
einbinden.
Mit wdt_enable (wert 0-7) stelle ich die Time Out bis zum Reset ein.
Die Funktion wdt_reset() kommt regelmäßig im Programm vor und erzeugt 
einen Watchdog-Reset vor Ablauf der Time Out Zeit (bei mir jetzt bei 
eine Abfrage von Portzuständen).

Was ist aber nachdem der WD einen Reset ausgelöst hat. Soweit ich 
gelesen habe werden die Prescaler Bits mit dem Reset gelöscht d.h. ich 
muss sie mit wdt_enable (wert 0-7) neu setzten. Passiert das denn 
ohnehin nicht nach dem Reset weil ja die Funk aufgerufen wird?
Bleibt der WD auch nach dem Flashen weiter aktiv, wenn ja wie kann ich 
ihn wieder deaktivieren. Gibt es da irgendwelche Fuses ?
#2256736
Lesenswert?

Ingo Laabs schrieb:
> Mit wdt_enable (wert 0-7) stelle ich die Time Out bis zum Reset ein.
> Die Funktion wdt_reset() kommt regelmäßig im Programm vor und erzeugt
> einen Watchdog-Reset vor Ablauf der Time Out Zeit (bei mir jetzt bei
> eine Abfrage von Portzuständen).
>
> Was ist aber nachdem der WD einen Reset ausgelöst hat. Soweit ich
> gelesen habe werden die Prescaler Bits mit dem Reset gelöscht...

Nach dem Reset kommst du doch wieder von oben in dein main() und machst 
erneut die Initialisierung, oder nicht?
#2256747
Lesenswert?

Ingo Laabs schrieb:
> Bleibt der WD auch nach dem Flashen weiter aktiv, wenn ja wie kann ich
> ihn wieder deaktivieren. Gibt es da irgendwelche Fuses ?

Lt. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Watchdog 
bleibt er aktiv.
Daraus:
1
Der WDT läßt sich auch softwaremäßig durch Setzen des WDE-Bits im WDTCR Register aktivieren.
2

3
WDT_on:
4
 
5
  in Temp1, WDTCR      ; Write logical one to WDE
6
  ori Temp1, (1<<WDE)
7
  out WDTCR, Temp1
8
  ret
9

10
Dieses hat den Vorteil, dass man den WDT auch softwaremäßig wieder deaktivieren kann.
11

12
Ein Deaktivieren des WDTs ist nicht möglich, wenn die WDTON - Fuse gesetzt ist!

In C gibt es ein wdt_disable() dafür; siehe 
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren