Watchdog

Gast #33520
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
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
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
Hi

du triggerst während der Warteschleife ständig den Watchdog. Das ist 
aber nicht besonders sinnvoll und untergräbt das Prinzip eines Watchdog 
etwas.

Matthias
Gast
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
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
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
Gast
Hallo Peter
Danke dir für die umfangreiche erklärung.Das hört sich recht logisch 
an.Ich werde mich heute Abend daran mal versuchen.
Gruß Helge

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.