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
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.
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
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
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ß.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.