mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Watchdog beendet Programm, aber startet nicht neu


Autor: sandmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem: Ich betreibe einen ATtiny13 mit dem 
Watchdog.

Hier mein Code:
#include <avr/io.h>        // Pins
#include <avr/wdt.h>       // Watchdog
#include <util/delay.h>    // Verzögerung

int main()
{
  DDRB |= (1 << DDB4);     // PB4 als Ausgang schalten
  _delay_ms(1000);         // 1 Sekunde warten
  wdt_enable(WDTO_2S);     // Watchdog auf 2 Sekunden stellen

  int on = 0;
  while (1)                // Mit 10Hz blinken
  {
    _delay_ms(100);
    if (on)
    {
      PORTB |= (1 << PB4);
      on = 0;
    }
    else
    {
      PORTB &= ~(1 << PB4);
      on = 1;
    }
  }
}

Außer der LED zwischen PB4 und GND und dem Pullup (4.7k) zwischen RESET 
und GND habe ich nichts angeschlossen.

Die Schaltung zeigt folgendes verhalten:
- Nach dem Einschalten passiert eine Sekunde nichts (wie geplant, siehe 
Code)
- Die Schaltung blinkt mit 10Hz für 2 Sekunden
- Die Schaltung blinkt nicht mehr

Erwartet hätte ich, dass die Schaltung nach einer weiteren Sekunde 
wieder anfängt zu blinken, da der Watchdog das Programm zurückgesetzt 
hat. Es fühlt sich allerdings so an, als habe er es nur gestoppt.

Wo liegt der Fehler?

Danke im Voraus für die Hilfe! :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies Dir nochmal den Abschnitt Watchdog im Datenblatt durch.

Was passiert mit dem Prescaler bei einem Watchdogreset?


Peter

Autor: sandmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde den entsprechenden Abschnitt leider nicht im Datenblatt. Aber 
selbst wenn dieser, wie ich aufgrund der hinweisenden Frage vermute, 
zurückgesetzt wird, so sollte dies doch keine Auswirkung haben, da ich 
den Watchdog doch erst nach dem Delay von einer Sekunde aktiviere?

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem ersten Delay nach einem Power-On-Reset.

Autor: sandmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nach dem ersten Delay nach einem Power-On-Reset.
Mit diesem Hinweis kann ich nun leider garnichts anfangen. Ich verstehe 
den Satz einfach nicht.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sandmann wrote:
> Ich finde den entsprechenden Abschnitt leider nicht im Datenblatt.

8.3 Watchdog Timer

"WDE is overridden by WDRF in MCUSR. This means that WDE is always set 
when WDRF is set. To clear WDE, WDRF must be cleared first."


Peter

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mit diesem Hinweis kann ich nun leider garnichts anfangen. Ich verstehe
>den Satz einfach nicht.

Setz den WDT-Enable einfach mal vor das Delay.

Autor: NurZuBesuch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gerade einen Blick in das Datenblatt des Tiny13 geworfen.
Dort steht, dass dessen Watchdog 3 verschiedene Modi kennt:
a) Interrupt bei Auslösen,
b) System-Reset bei Auslösen,
c) beides hintereinander.
Nun stellt sich die Frage, welchen dieser Modi der Befehl

> wdt_enable(WDTO_2S);     // Watchdog auf 2 Sekunden stellen

aktiviert. Sollte er den Interrupt-Modus einschalten, ohne dass der
zugehörige Vektor gesetzt ist, kann das Programm "hängen", ohne dass ein 
Reset ausgelöst wird.  :-(

Autor: sandmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also,

so funktioniert es jetzt schonmal ganz gut:
// [...]
int main() {
wdt_enable(WDTO_2S);     // Watchdog auf 2 Sekunden stellen
DDRB |= (1 << DDB4);     // PB4 als Ausgang schalten
_delay_ms(1000);         // 1 Sekunde warten
// [...]

Wenn ich es richtig verstanden habe, dann lag es daran, dass nach dem 
Reset der Watchdog-Prescaler zurückgesetzt wurde und der Watchdog 
weiterhin aktiv war. Daher wurde das Programm immer vor ablauf des 
ersten Delays zurückgesetzt.

So funktioniert es allerdings auch nicht:
// [...]
int main() {
wdt_disable()            // Watchdog ausschalten
DDRB |= (1 << DDB4);     // PB4 als Ausgang schalten
_delay_ms(1000);         // 1 Sekunde warten
wdt_enable(WDTO_2S);     // Watchdog auf 2 Sekunden stellen
// [...]
Und ich verstehe nicht, wieso. Schließlich sollte der Watchdog ja 
zuallererst deaktiviert werden und somit das Programm nicht mehr 
neustarten, unabhängig von seinem zurückgesetzten Prescaler.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sandmann wrote:
> Und ich verstehe nicht, wieso. Schließlich sollte der Watchdog ja
> zuallererst deaktiviert werden und somit das Programm nicht mehr
> neustarten, unabhängig von seinem zurückgesetzten Prescaler.

Nochmal gaaanz langsam:

To

clear

WDE,

WDRF

must

be

cleared

first.


Peter

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Hund losgelassen wurde, rennt er, bis er angeleint wird.
D.h. wenn du deinen Watchdog startest läuft er, wenn er einen
Reset auslöst läuft er immer noch. Du stopst ihn nicht und
setzt ihn nicht zurück.
Im Datenblatt unter System Control and Reset ist es beschrieben.

gruß hans

Autor: sandmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch! Ich stoppe ihn mit wdt_disable()! Deshalb verstehe ich es ja 
nicht!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich auch nicht

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst Du was über den Watchdog lernen oder ernsthaft Deine 
Programmschleife mit Hilfe des Watchdog timen?

Ersteres: Dir wurden alle Hilfen angeboten, lesen und verstehen muß Du 
selbst.

Zweiteres: Ist nicht Dein ernst?

Autor: Moni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich bin verzweifelt. Mein Rechner zeigt mir sowie ich die Tastatur 
bediene, das Problemberichtfenster und will, dass ich sende oder nicht 
sende. Bei allen Programmen, auch Foxmail, Word u. v. a. m. Wer kann mir 
einen Rat geben woran kann das liegen? Danke im voraus, Moni

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.