Beim schreiben eines Codes für ein DIY-Projekt wundere ich mich allerdings immer wieder wie der Code vom Arduino abgearbeitet wird. Ich weiß, dass loop() immer ausgeführt wird aber zB. millis() auserhalb von loop() funktioniert trozdem obwohl es ja eigentlich nicht ausgeführt werden dürfte.
Ich habe einen Screenshot angehängt mit einem kurzen Skech um zu verdeutlichen was ich genau meine.
millis() ist hier in einer Funktion auserhalb von loop() und so wie ich das verstanden habe wird die Funktion nur dann aufgerufen wenn sie im loop() über die blabla()-Funktion durchlaufen wird. Der Serialmonitor allerdings sagt anderes. Laut ihm zählt millis() durchgehend hoch nicht nur dann wenn die Funktion blabla() aufgerufen wird.
Die Arduino Software konfiguriert Timer0 so er alle 64 Takte (4 µs) eins höher zählt und alle 1 ms überlauft (genau alle 1,024 ms was aber kompensiert wird) und dann per Interrupt eine Variable inkrementiert. millis() gibt diese einfach zurück. micros() verechnet sie zusätzlich noch mit dem aktuellen Zählerstand
Bitte gewöhn Dir an, sprechende Variablen und Funktionsnamen zu verwenden.
Statt "blabla" könntest Du "holeMillisSekunde" schreiben.
Statt "asdf" "millisSekunden"
Time sollte einen unsgned long Variable sein weil das Vorzeichen Probleme macht.
Der Sketch wird früher oder später eine Zahl auslassen da delay(1000) 1 Sekunde wartet aber auch der Rest des Sketches Zeit braucht. Ein loop() Zyklus braucht grob geschätzte 1005 mS.
Du solltest die Ausgabe der Zahl nicht über delay() sondern über millis() steuern.
Im Hintergrund eines Sketches können viele Dinge passieren. Die Interruptroutine welche micros() und Millis() updatet ist nur eine Sache. Auch Bibliotheken können Teile enthalten die im Hintergrund zwischen der Ausführung des Sketches passieren.
Und ja isch weiß asdf und blabla sind nicht gerad die besten Bezeichnungen aber als ich mein Problem schildern wollte dachte ich mir ich schreib schnell einen Sketch um alles ein wenig klarer zu machen.