uC-Anfänger schrieb:
> void wdt_init(void)
> {
> MCUSR = 0;
> wdt_disable();
> return;
> }
> kann ich dann einfach beim Auftreten von error wdt_reset() schalten und
> mein Programm resetet?
> if( error == 1 )
> {
> wdt_reset();
> }
> würde das so passen ich check das irgenwie immer noch nicht so ganz mit
> der Watchdog-Geschichte.
Nein.
Sinn und Zweck eines Watchdog ist es, den Controller zu resetten, wenn
sich das Programm an irgendeiner Stelle aufgehängt hat. Man kann den
Watchdog natürlich auch zum gezielten Resetten benutzen, indem man
diesen Zustand herbeiführt.
Erstmal wird der Watchdog gestartet: wdt_enable(value)
"value" ist ein Wert für die Zeit, genaugenommen wird damit der
Prescaler eingestellt, nach der ein Reset durchgeführt wird.
Damit startet man den Watchdogtimer. Wenn dieser Timer überläuft, wird
ein Reset ausgeführt. Damit das nicht passiert, gibt es die Funktion
"wdt_reset()". Damit wird der Zähler wieder auf 0 gesetzt.
Diese Funktion baut man nun an geeigneter Stelle im Programm ein, meist
in der Hauptprogrammschleife. Kehrt das Programm jetzt beispielsweise
nicht rechtzeitig aus einer Interruptbehandlung zurück, läuft der Zähler
über und es gibt einen Reset.
Um einen gezielten Reset herbeizuführen, muß der WDT erstmal beim Start
des Programms abgeschaltet werden: wdt_disable();
In der Funktion, die den Reset ausführen soll, startest du dann den
Watchdog mit der kürzest möglichen Zeit: wdt_enable(0);
Das sind ungefähr 15 oder 16 ms, schneller geht nicht, und wartest auf
den Reset: while(1){}
uC-Anfänger schrieb:
> Das geliche ist, wenn ich auf ein Flag warten will und das wird
> innerhalb einer bestimmten Zeit nicht gesetzt, wie muss ich da vorgehen?
Das machst du so ähnlich.
Du lässt einen Timer laufen, der nach der Time-Out-Zeit überläuft und
einen Interrupt auslöst.
Den Timer startest du, wenn du auf das Flag wartest und stoppst ihn,
nachdem du das Flag erhalten hast. Oder wenn du etwas über den UART
gesendet hast und auf Antwort wartest.
Dauert es zulange, läuft der Timer über und löst einen Interrupt aus.
Für längere Zeiten oder wenn du den Timer auch noch für etwas anders
nutzen willst, baut man eine oder mehrere Variablen ein und fragt die
entsprechend ab.
mfg.