Forum: Mikrocontroller und Digitale Elektronik Watchdog


von Helge (Gast)


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

von mikki merten (Gast)


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.

von Helge (Gast)


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

von Matthias (Gast)


Lesenswert?

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

von crazy horse (Gast)


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ß.

von Helge (Gast)


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

von Peter D. (peda)


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

von Helge (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.