So verwenden Sie den Watchdog-Timer in ATmega128

Ich arbeite mit einem ATmega128 und muss den Mikrocontroller zurücksetzen, nachdem etwa 10 Sekunden vergangen sind und der Benutzer nicht mit dem Mikrocontroller interagiert hat. Wenn der Benutzer beispielsweise 10 Sekunden lang keine Taste auf einer Tastatur gedrückt hat, sollte der Controller zurückgesetzt werden.

Ein Watchdog-Timer ist im ATmega128 verfügbar, aber ich kann maximal 2 Sekunden Verzögerung erhalten, bevor er zurückgesetzt wird. Aber ich benötige 10 Sekunden.

Vielleicht kann ich es mit Timern machen, aber ich weiß nicht, wie ich vorgehen soll?

Sogar ich habe es mit der Header-Datei #include<avr/wdt.h> versucht und verwendet wie: wdt_enable(WDTO_8S); wdt_reset(); Habe aber keine Antwort von diesen Funktionen bekommen. Ich arbeite unter Linux AVR-GCC.
Benötigen Sie wirklich den System- Reset oder können Sie das Programm einfach von oben neu starten?
Für Timer - hier ist ein gutes Tutorial: avrfreaks.net/…
@JohnU: Danke für deine Antwort und eigentlich frage ich in meinem Projekt den Benutzer nach dem Passwort, wenn er ein falsches Passwort eingibt, wird es nur in dieser Schleife sein, bis er das richtige Passwort eingibt. Was ich also brauche, ist, wenn der Benutzer dem Controller keine Eingaben gemacht hat, sollte er von oben im Programm beginnen.
Warum also nicht einfach das Programm so schreiben, dass es das tut?
@JohnU: Ja, ich habe Label verwendet und dieses bestimmte Label "goto" verwendet. Aber was ich brauche, ist, wenn der Benutzer nichts eingibt, sollte mein Programm etwa 5 bis 10 Sekunden warten, dann sollte es zum Anfang des Programms zurückkehren. Bitte helfen Sie mit Beispielcode, wenn möglich.
Am einfachsten ist es, einen wait () -Befehl zu verwenden ... wenn dieser nicht existiert (fast alle Sprachen haben einen), ist es einfach, einen zu erstellen, indem Sie etwas tun, das nur von einer großen Zahl herunterzählt for(i=99999;i>0;){i--;}. Dies wird im Allgemeinen als schlechte Methode zum Hinzufügen von Verzögerungen angesehen, da die CPU dadurch daran gehindert wird, irgendetwas anderes zu tun, aber es ist die grundlegendste Methode.
@JohnU: Ich habe deinen Standpunkt verstanden, aber wenn ich diese Verzögerung zum Hauptprogramm hinzufüge, kann ich während dieser Wartezeit die Tastatur nicht richtig lesen.
Eine andere Idee: Starten Sie einen Timer, bevor Sie Eingaben vom Benutzer akzeptieren, setzen Sie diesen Timer jedes Mal zurück, wenn der Benutzer etwas eingibt ... Wenn der Benutzer für eine bestimmte Zeit inaktiv ist, läuft der Timer über ... Setzen Sie das Flag im Timer und wenn dieses Flag gesetzt ist, brechen Sie aus Ihre Schleife "Eingabe akzeptieren"!
@sanju - was Swanand gesagt hat, ist die richtige Idee. Dies ist eine ziemlich grundlegende Sache, und die Verwendung des Watchdogs ist keine gute Methode, dies zu tun. In unserem System haben wir einen 1-kHz-Hardware-Timer, der auf einer Interrupt-Routine läuft, die einen "Tick"-Wert wie eine Uhr erhöht. Wenn wir in unserer Hauptsoftware nach 10 Sekunden etwas zurücksetzen möchten, merken wir uns jetzt den "Tick" -Wert, und wenn es 10.000 weitere Ticks gibt, setzen wir den Status zurück.
@Swanand: Ja, das ist eine gute Idee. Ich werde versuchen. Danke für die Idee.
@JohnU: Ja, ich werde dasselbe versuchen.

Antworten (2)

Anstatt für diesen Zweck den Watchdog-Timer zu verwenden,

Starten Sie einen Timer, bevor Sie Eingaben vom Benutzer akzeptieren, setzen Sie diesen Timer jedes Mal zurück, wenn der Benutzer etwas eingibt ... Wenn der Benutzer für eine bestimmte Zeit inaktiv ist, wird der Timer überlaufen ... Eingabe"-Schleife!

Beachten Sie auch, dass zehn Sekunden eine lange Zeit sind und es möglicherweise nicht möglich ist, das Hardware-Timer-Peripheriegerät so weit zu dehnen, oder wenn Sie können, könnten Sie einen wertvollen Timer sperren und nicht zulassen, dass er für etwas anderes verwendet wird. Den Timer periodisch zu unterbrechen, sagen wir 1 Sekunde oder weniger, und eine Art Countdown zu dekrementieren, kann ein optimalerer Weg sein.

Es ist möglich, dasselbe zu erreichen. Verwenden Sie den Watchdog (dh intern oder extern). Wenn es extern ist, müssen Sie das Datenblatt und die Antwort darauf überprüfen. Der interne Watchdog muss für 2 Sekunden eingestellt werden und dann in einer Schleife für mehr als 1 Sekunde zurückgesetzt werden. es ist günstig, für den gleichen Zweck einen Timer zu verwenden. Lassen Sie den Watchdog einfach nach jeder Sekunde ruhen und setzen Sie den Watchdog-Zähler nach 5 Mal zurück.