Forum: Mikrocontroller und Digitale Elektronik Watchdog Verständnissfrage


von steffen (Gast)


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

von Karl H. (kbuchegg)


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.

von steffen (Gast)


Lesenswert?

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? Wie konfiguriere ich da den Timeout?

von Thomas E. (thomase)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.