Watchdog

Gast #33520
Lesenswert?
• ▲
▼
Hallo
Ich habe den Mega128 und benutze in meinem Programm den Watchdog. Nun 
ist ein Stück Prog bei wo auf ein bestimmtes Zeichen der USART gewartet 
wird. Dies kann unter Umständen 7sec dauern. Mein Watchdog wartet max 
2.2sec. Kann ich die Zeit irgendwie erhöhen? Es kann auch möglich sein 
das dieses bestimmte Zeichen nicht auftaucht. Dann soll der Watch in 
aktion treten und neu starten.
Ich hoffe jemand hat ne Idee :-)

Gruß Helge
Gast #33521
Lesenswert?
• ▲
▼
nein, kann man nicht weiter erhöhen. Der Einstellbereich ist für eine 
Watchdog auch recht groß. In deiner Anwendung solltest du über 
Timernutzung mit evtl. zusätzlichem Zähler nachdenken.
Gast #33522
Lesenswert?
• ▲
▼
Den Gedanken hatte ich auch schon.Aber bei dem getchar-Befehl wartet er 
ja auf ein Zeichen. Wenn nun keins kommt hängt er da fest. Da siehts ja 
dann mit nem Zähler auch schlecht aus.
Gruß Helge
Gast #33524
Lesenswert?
• ▲
▼
aber immer noch besser, als den WD in einer Timer-ISR zu triggern..., so 
bleibt der WD wenigstens für den Rest des Programms aktiv.
Du prüfst vor getchar(), ob überhaupt ein Zeichen gekommen ist, wenn 
nicht, wieder prüfen, ansonsten Zeichen abholen.
Mit dem internen Watchdog bin ich übrigens nicht allzu glücklich, mir 
gefallen externe besser, die ich auf 2 Flanken triggern muß.
Gast #33525
Lesenswert?
• ▲
▼
Ich werde da wohl was externes basteln evtl. übern Int.
Wenn ich erst prüfe ob ein Zeichen da ist, und dann keins kommt habe ich 
ja das selbe Problem. Das Prog hängt an dieser Stelle fest.
Dank euch für die Tips
Gruß Helge
#33526
Lesenswert?
• ▲
▼
Dafür gibt es eine Lösung:

Man triggert den Watchdog innerhalb des Timerinterrupts.

Das ist z.B. immer bei größeren Programmen nötig, wenn mehrere Prozesse 
mit unterschiedlichen Timeout-Zeiten überwacht werden müsen.


Jeder Prozess erhält dabei seinen eigenen Timeout-Zähler, der dann bei 
ordnungsgemäßer Ausführung von dem Prozess selbst immer auf den 
Startwert gesetzt wird.

Der Timerinterrupt zählt nun jeden dieser Zähler runter und wenn auch 
nur einer den Wert 0 erreicht, bleibt er einfach in einer Endlosschleife 
hängen, bis dann der Hardware-Watchdog zuschlägt.


Damit ist es z.B. auch möglich, wenn ein wichtiger Prozess nur einmal je 
24h aktiv werden muß auch dann nur für diesen einen 24h-Timeout 
aufzusetzten.


Dadurch, daß alle anderen Interrupts gesperrt sind, kann auch keiner 
diese Endlosschleife unterbrechen.


Bei hohen Anforderungen an die Sicherheit, kann ja der Timerinterrupt 
auch noch den Stackpointer auslesen und wenn dieser z.B. zu weit in den 
Datenbereich reingelaufen ist, dann auch die Endlosschleife ausführen.


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.