Watchdog Verständnissfrage

Gast #3991794
Lesenswert?

Hallo Gemeinde,
ich möchte gern einen Watchdog nutzen um ein Gerät neu zu starten wenn 
mal was schief geht. Nun habe ich damit versuche gemacht und es läuft. 
Jetzt habe ich aber eine Frage. Muss ich das Watchdog Bit bei den Fuses 
setzten oder reicht es wenn ich das so mache: (Tiny44)
1
void WDT_on(void){
2
  //WDT
3
  MCUSR |= (1 << WDRF);  // WDT ein
4
  WDTCSR |= (1 << WDE) | (1 << WDP3); //WDT Systemreset ein, Timer Prescaler 4.0
5
}

Danke & Gruß Steffen
#3991798
Lesenswert?

steffen schrieb:

> Nun habe ich damit versuche gemacht und es läuft.

Wenn es läuft, dann MUSST du offenbar den WD nicht in den Fuses 
aktivieren.

> Jetzt habe ich aber eine Frage. Muss ich das Watchdog Bit bei den Fuses
> setzten oder reicht es wenn ich das so mache: (Tiny44)

Welchen Fall könnte es geben, so dass ein nicht per Fuse aktivierter 
Watschdog versagt.
Na der Fall ist offenbar der, wo der Prozessor zwischen Reset und dem 
softwaremässigen Aktivieren des WD abschmiert.

Ob das bei dir ein Problem sein könnte, musst du entscheiden. Ein per 
Fuse aktivierter WD ist von Beginn an aktiv. Ein per Programm 
aktivierter WD ist dann eben erst ab dem Zeitpunkt der Aktivierung 
aktiv.
#3991925
Lesenswert?

Karl Heinz schrieb:
> Ein per Programm
> aktivierter WD ist dann eben erst ab dem Zeitpunkt der Aktivierung
> aktiv.

Nicht immer. Nach einem Reset, Resetpin auf GND oder WD-Reset, ist der 
WD weiterhin aktiv. Allerdings ist der Timer auf den kürzesten Wert 
zurückgesetzt. Abgeschaltet wird der WD erst bei Power Off.

steffen schrieb:
> ok, vielen Dank. Eine Frage stellt sich mir dann doch noch, kann
> man den per Fuses aktiven Watchdog genau so ein und ausschalten wie den
> Software gesetzten?

Nein. Sinn und Zweck der Fuse ist es, dass man das eben nicht kann.

> Wie konfiguriere ich da den Timeout?

Die Konfiguration muss in einer "Timed Sequence" erfolgen. D.h., dass 
innerhalb von 4 Takten 2 Befehle ausgeführt werden müssen:

1
//Teste ob Watchdog ein, setze auf 8s
2
if(WDTCSR & (1 << WDE))
3
{
4
  WDTCSR = (1<<WDCE) | (1<<WDE);
5
  WDTCSR = (1<<WDE) | (1<<WDP3) | (1<<WDP0);
6
}

Sinnvollerweise sollte dies als allererstes in der main erfolgen.

mfg.

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