INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
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. Smile

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. Big Grin


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.
Exclamation In einer Sekunde wird der Zählerstand dieses Registers also 1000 mal um 1 erhöht.
Exclamation 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;
unsigned long vergangene_zeit;

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;
millis() liefert auch hier wieder den momentanen Wert des Zeitzählregisters aus der CPU der ja zwischenzeitlich weiter hochgezählt hat.
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

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
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 Smile, danke für die Mühe, sollte sich jeder mal durchlesen.

LG, Claus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste