|
millis(), das unbekannte Wesen
|
|
|
05.02.2016, 22:01
(Dieser Beitrag wurde zuletzt bearbeitet: 07.02.2016 22:01 von ardu_arne.)
Beitrag #1
|
|||
|
|||
|
millis(), das unbekannte Wesen
frei nach Oswalt Kolle: Dein Kind, das unbekannte Wesen.
![]() Ich weiß nicht wie viele verzweifelte und resignierende Arduino Benutzer es gibt, die wegen der millis(); ihre Hardware schon in die Ecke geworfen haben. Ganz zu schweigen von Ehekrach, Wutausbrüchen und sinnlosen Trinkorgien. ![]() Vereinfacht dargestellt gilt für den Arduino: Es gibt im Microcontroller einen Zähler mit 32 Bit deren Zählerstand jede Millisekunde um 1 erhöht wird. In einer Sekunde wird der Zählerstand dieses Registers also 1000 mal um 1 erhöht. millis(); macht nichts anderes als den Zählerstand zum Teitpunkt des Aufrufs in das laufende Programm zu übernehmen um damit rechnen zu können. Das war es eigentlich schon. Mehr muss man nicht erklären um zu verstehen was ein Aufruf von millis(); macht. Was dann evtl. bei manchen noch für Magenverstimmungen sorgen kann ist die Anwendung, Verarbeitung, ect. der so gewonnen Zeitinformationen. Will man z.B. die Zeitdifferenz zwischen zwei Zeitpunkten ermitteln, so muss man sich erst den Zählerstand des Zeitzählregisters der CPU zu dem Zeitpunkt im Programm merken, an dem die Zeit zu laufen beginnt. Weil der Zeitzähler 32Bit (4 Byte) groß ist, braucht man dazu Variablen vom Typ "unsigned long" oder "uint32_t". Code: unsigned long startzeit;Jetzt kann man die Startzeit zum gewünschten Zeitpunkt im Programm in die Variable schreiben. Code: startzeit = millis();Später im Programmablauf kann man dann berechnen welche Zeit in Millisekunden inzwischen vergangen ist. Diese erhält man wenn man von der aktuellen Zeit die Startzeit abzieht. Code: vergangene_zeit = millis() - startzeit;Die Variable "vergangene_zeit" enthält jetzt die Zeitdifferenz zwischen der Startzeit und der aktuellen Zeit in Millisekunden. Wie man dann mit der berechneten Zeitdifferenz weiter arbeiten kann wird im Beitrag Blink Without Delay - mal anders erklärt anhand eines Beispiels erklärt. Was hier für millis(); beschrieben ist, gilt analog auf für micros(); 1 Sekunde entspr. 1000 Millisekunden. 1 Sekunde entspr. 1000 * 1000 = 1.000.000 Mikrosekunden. Das kürzeste Zeitintervall das ein Arduino mit 16MHz Takt auflösen kann beträgt 4µS. Viele Grüße Arne Gruß Arne Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort. |
|||
|
06.02.2016, 22:17
(Dieser Beitrag wurde zuletzt bearbeitet: 06.02.2016 22:18 von Claus_M.)
Beitrag #2
|
|||
|
|||
|
RE: millis(), das unbekannte Wesen
Super zusammengefasst
, danke für die Mühe, sollte sich jeder mal durchlesen. LG, Claus |
|||
|
|
|
| Möglicherweise verwandte Themen... | |||||
| Thema: | Verfasser | Antworten: | Ansichten: | Letzter Beitrag | |
| Von delay über millis zur Funktion und Klasse | Tommy56 | 5 | 17.232 |
06.03.2020 18:05 Letzter Beitrag: Blende8 |
|
| Zeitkontrolle ohne delay mit millis() | Franz54 | 4 | 18.759 |
25.11.2019 10:32 Letzter Beitrag: Franz54 |
|
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste






In einer Sekunde wird der Zählerstand dieses Registers also 1000 mal um 1 erhöht.
