Forum: Compiler & IDEs ATMega644p Problem mit Softwarereset / Watchdog


von Greenhorn (Gast)


Lesenswert?

Hallo,

ich habe hier einen Webserver mit dem Pollinboard und einem ATMega 644p 
laufen. Ich hätte jetzt gerne die möglichkeit von der Website aus, den 
Webserver zu resetten. Eigentlich bietet sich ja dafür der Watchdog an.

Wenn ich jetzt ein Reset-Kommando per TCP bekomme dann starte ich den 
WDT mit wdt_enable(WDTO_15MS). Wenn ich es richtig verstanden habe, 
müsste das schon reichen. Aber der Webserver startet nicht wie erwartet 
neu, sondern ist danach einfach nicht mehr zu erreichen. Irgendwo hier 
im Forum hatte ich gelesen wenn Interrupts im Spiel sind, sollte ich die 
vorher disablen. Habe ich auch gemacht aber das Verhalten ist dasselbe. 
Ich habe auch in der ersten Programmzeile meiner main.c den Wdt mit 
wdt_disable() wieder disabled, (stand hier auch irgendwo) funktioniert 
aber leider auch nicht.
Auch die WDTON fuse habe ich schon gesetzt und gelöscht, haut aber auch 
nicht hin.

Hat irgendjemand eine Idee was ich hier noch falsch mache, oder eine art 
Checkliste worauf man noch achten muss ?

Gruß GH

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Entsorgst du denn den Wachhund nach dem Reset fachgerecht?

Datenblatt, Abschnitt 10.2, Suche nach "WDRF".

Einleitung in:

http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html

von Greenhorn (Gast)


Lesenswert?

Hallo Jörg,

ich dachte das macht die Funktion wdt_disable() !
Da heisst ich muss das WDRF bit noch auf 0 setzen.

Ist die reihenfolge so korrekt ?

1. Http funktion empfängt das Resetkommando
2. cli();
3. wdt_enable(WDTO_15MS)
4. while(1);
5. Watchdog löst aus

6. Sprung zu main.c 1.zeile
7. MCUSR &= ~(1<<WDRF);
8. wdt_disable();
9. ....Start des eigenlichen Programms

Brauche ich in diesem Fall die WDTON fuse ?
Ich will nur über die HTTP Funktion den Reset auslösen, ansonsten 
brauche ich den WDT nicht.

Gruß GH

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Greenhorn wrote:

> ich dachte das macht die Funktion wdt_disable() !

Nein, das hätte keinen Sinn.  wdt_disable() will man ja u. U.
mehrfach innerhalb einer Applikation benutzen können, dieses
Prozedere dagegen muss man nur genau einmal nach einem
Watchdog-Reset erledigen, und dies möglichst schnell nach dem
Reset (damit nicht aus Versehen die 15 ms des initialen
Timeouts bereits verstrichen sind).

> Da heisst ich muss das WDRF bit noch auf 0 setzen.

Ja.


> 6. Sprung zu main.c 1.zeile
> 7. MCUSR &= ~(1<<WDRF);
> 8. wdt_disable();

Im Prinzip schon, aber du kannst auch das Beispiel aus der
Doku einfach übernehmen.  Durch das Spiegeln von MCUSR in einer
Variablen kannst du später noch auswerten, ob dein Reset vom
Watchdog kam oder nicht.  (Das attribute da im Beispiel muss
aber vorn und hinten zwei Unterstriche haben, das ist ein Bug,
der bereits im Sourcecode repariert ist.)

> Brauche ich in diesem Fall die WDTON fuse ?

Die ist nur dafür da, dass du den Watchdog nie abschalten kannst.
Ich glaube, das ist nicht das, was du willst. :-)

von Greenhorn (Gast)


Lesenswert?

Hallo Jörg,

danke für den Schubser, ich habs einfach ausprobiert, nu lööpts.

Gruß GH

von Peter D. (peda)


Lesenswert?

Greenhorn wrote:
> ich dachte das macht die Funktion wdt_disable() !

Nein, die ist eigentlich überflüssig und sogar gefährlich, da nicht 
interruptfest.
Es hat auch keinen Sinn, das Setzen des Sleep-Modus und Enable 
Sleep-Modus getrennt zu machen.


Üblicher Weise stellt ja ein Timerinterrupt fest, wann es Zeit zum Sleep 
ist und setzt + enabled den Modus, das Main macht dann Sleep.
Und nach dem Aufwachen ist es wieder ein Interrupt (z.B. Pin-Change), 
der Sleep disabled.
Nimmt man dann im Main die Funktionen wdt_enable(), wdt_disable(), ist 
der MC irgendwann tot (wacht nie mehr auf).

Ich benutze daher immer das direkte Setzen des MCUSR-Registers, dann 
gibts keine Probleme mit den Interrupts.


Peter

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.