Dienstag, 25. August 2015

millis

In diesem Post geht es um die Funktion millis, welche die Millisekunden seit Programmstart zurück gibt. Dadurch kann man, ähnlich wie bei delay, das Programm für eine gewisse Zeit warten lassen. Der Vorteil von millis ist jedoch, dass man während der Wartezeit etwas ausführen lassen kann.
[Quelle: pixabay.de]


Die Funktionsweise

Über den Aufruf der Funktion millis erhält man die Millisekunden seit Start des Mikrocontrollers. Das selbe funktioniert auch mit der Funktion micros, wobei man hier die Mikrosekunden seit Start erhält. 

Wenn man bedenkt, dass 1000 Millisekunden nur eine Sekunde ergeben, kann man sich vorstellen, dass die Werte, die man erhält, sehr groß sind. Aus diesem Grund ist der Variablentyp, den man für den Rückgabewert verwenden sollte, unsigned long. Hier sind die verschiedenen Variablentypen erklärt.

Außerdem sollte einem bewusst sein, dass bei der Funktion millis nach ca. 50 Tagen es zu einem Rollover kommt. Das bedeutet, dass die maximale Variablengröße erreicht ist, und der Wert wieder von vorne beginnt. In der offiziellen Arduino Dokumentation findet ihr hier einen Lösungsansatz dafür.

Anwendung von millis

Wie erwähnt, ist ein häufiger Anwendungsfall, für eine bestimmte Zeit zu warten. Der Vorteil von millis gegenüber der Funktion delay ist jedoch, dass man während der "Wartezeit" bei millis etwas machen kann, und bei delay nicht. 

Um über die Funktion millis eine Wartezeit zu erzeugen benötigt man zwei Variablen, vom Typ unsigned long. In die erste wird die Zeit(in Millisekunden seit Start des Mikrocontrollers) bei Beginn der Schleife gespeichert. Nun wird die Wartezeit in Millisekunden zu diesem Wert dazu addiert. Dadurch erhält man die Millisekunden die seit dem Start vergangen sind, wenn die Wartezeit abgelaufen ist. In der zweiten Variable wird nach jedem Schleifendurchgang die aktuelle Zeit(in Millisekunden seit Start des Mikrocontrollers) abgespeichert. 

Solange diese Zahl kleiner als die Millisekunden am Anfang plus die Wartezeit ist, wird die Schleife ausgeführt, ansonsten wird sie abgebrochen, da die Wartezeit vorbei ist. Dabei ergibt sich auch das "Problem" von millis. Man erhält nicht genau die Wartezeit, sondern eine Größere. Das liegt daran, dass am Anfang der while Schleife die Zeit noch nicht erreicht ist. Deshalb wird die Schleife noch einmal ausgeführt. Ihre Ausführung dauert jedoch vielleicht nicht exakt die verbleibende Zeit sondern etwas länger. Diese Abweichungen sind aber im Normalfall zu gering, als dass sie eine Rolle spielen würden.

Programmbeispiel


In diesem Beispiel blinkt die LED für genau 10 Sekunden. 

Keine Kommentare:

Kommentar veröffentlichen