ATMega644p Problem mit Softwarereset / Watchdog

Gast #1010245
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
Gast #1010333
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
Moderator Persönliche Seite #1010342
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. :-)
#1010368
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.