mikrocontroller.net

Forum: Compiler & IDEs ATMega644p Problem mit Softwarereset / Watchdog


Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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__...

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

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

Gruß GH

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.