Montag, 22. Juni 2015

Timerinterrupt und Watchdogtimer

In diesem Artikel geht um den Timerinterrupt und den Watchdogtimer. Durch den Timerinterrupt kann man festgelegt alle paar Sekunden eine Aufgabe ausführen und durch den Watchdogtimer kann man, falls eine gewisse Zeitspanne überschritten wird, den Arduino zurücksetzen.

Der Timerinterrupt


Durch den Timerinterrupt kann man unabhängig von der Hautpschleife(loop) alle paar Sekunden, den Wert kann man festlegen, eine gewisse Aktion ausführen. Das passiert auch, wenn man gerade in einer großen Schleife ist. Die Zeile wird dann abgebrochen, die Aktion ausgeführt, und dann die Schleife fortgesetzt. Ein Anwendungsbeispiel wäre eine Ampel. Eine Ampel hat, nehmen wir Mal an, verschiedene Aufgaben. Zum Beispiel schauen, ob eine Knopf gedrückt wurde, oder Informationen von anderen Ampeln/Fahrzeugen erhalten. Nichtsdestotrotz muss die Ampel jedoch alle fünf Sekunden von rot auf grün oder umgekehrt schalten. Für eine solche Aufgabe würde man dann einen Timerinterrupt verwenden. Dazu verwendet man die TimerOne Library, die ihr hier herunterladen könnt. Die .zip Datei müsst ihr dann in euren Libraries Ordner so entpacken, dass es dort einen TimerOne Ordner gibt, der den Inhalt der .zip Datei hat. Diese Bibliothek müsst ihr dann im Sketch nachladen. Um einen Timerinterrupt zu verwenden, muss man erst die Zeit festlegen, nach der die besondere Aktion ausgeführt werden soll. Das geschieht über Nametimer.initialize(Zeit in Sekunden * 1000000). Um den Timer jetzt noch zu "starten" muss man den Befehl Nametimer.attachInterrupt(Name der Funktion) eingeben. In den Klammern muss man den Namen der Funktion eingeben, die jedesmal ausgeführt werden soll. Diese müsst ihr auch definieren. Das habe ich bereits hier erklärt. Dann wird sie jedesmal, nach der festgelegten Zeit, ausgeführt. Mein Ampel Sketch sieht so aus:


Der Watchdogtimer

Den Watchdogtimer, muss man sich wie einen Wachhund vorstellen. Wenn man ihn nicht alle festgelegten Sekunden streichelt, beißt er dich/deinen Sketch und der Arduino wird neu gestartet. Das ist sinnvoll, wenn man sicherstellen muss, dass ein Programm läuft, und nicht in einer Schleife hängen bleibt. Beispielsweise wenn man die Funktion millis() verwendet. Diese speichert die Millisekunden seit Programmstart, und da das sehr viele werden können, und die Variable "überläuft" gibt es nach 46 Tagen einen Neustart bei Null. Wenn dann eine Schleife ungünstig gesetzt ist wartet der Arduino 46 Tage bevor er kurz weitermacht. Für einen solchen, oder andere Fälle ist ein Watchdogtimer sinnvoll. Für diesen muss man im Sketch wieder eine Bibliothek nachladen, die aber mit der IDE bereits mit installiert wurde. Im Setupteil muss der Watchdog über wdt_enable() gestartet werden. In den Klammern gibt man die Zeit an. Man kann sie jedoch nur in bestimmten "Portionen" angeben. Diese sind:

Nun beißt uns der Wachhund, und setzt den Arduino zurück, sobald wir ihn die angegebene Zeit nicht "streicheln". Das tuen wir über wdt_reset();.


Der Timerinterrupt und der Watchdogtimer sind zwei gute Möglichkeiten um, einerseits immer etwas in einem bestimmten Rhythmus zu erledigen, oder aber zu überprüfen, ob sich der Arduino "aufgehängt" hat.

Wenn dir der Artikel gefallen hat, gib ihm einen Daumen hoch, oder folge mir auf Google Plus um immer über neue Post informiert zu werden.

Keine Kommentare:

Kommentar veröffentlichen