Endlich mal wieder eine millis()-Frage..

Hallo,

bei mir kommt es immer mal wieder vor, dass ich zu einem bestimmten Zeitpunkt etwas "auslösen" möchte.

Meine Sketches baue ich mittlerweile zwar generell ohne delay() auf. Trotzdem habe ich bedenken, dass wenn ich z.B. so etwas schreibe..

if(millis() - zeitpunkt == zeitraum)
{
  "mach was"
}

..ich Gefahr laufe, dass der Prozessor zum Zeitpunkt "zeitpunkt" gerade nicht an dieser Zeile steht, sondern sich an irgendeiner anderen Stelle des Sketches befindet und er "mach was" nicht auslöst.

Sind meine Bedenken begründet und falls ja, wie kann ich dieses Problem umgehen/vermeiden?

Gruß Chris

hi,

indem Du nicht == verwendest, sondern >= oder <=, je nachdem.

gruß stefan

Deine Bedenken sind sehr begründet!

Die Wahrscheinlichkeit, dass das funktioniert ist sehr gering.

Deshalb schreibt man auch:

if(millis() - zeitpunkt >= zeitraum)
{
  "mach was"
}

Dann wird doch aber..

"mach was"

..ab diesem Zeitpunkt permanent ausgelöst, oder?

"mach was"

..soll aber zum Zeitpunkt..

 zeitpunkt

nur einmal ausgelöst werden.

Natürlich mußt du zeitpunkt neu setzen:

Wenns einmalig ausgeführt werden soll:

if(millis() - zeitpunkt >= zeitraum)
{
  zeitraum = 0xFFFFFFFF;  // wird erst nach 50 Tagen erreicht
  "mach was"
}

Wenns regelmäßig ausgeführt werden soll:

if(millis() - zeitpunkt >= zeitraum)
{
  zeitpunkt = millis()+zeitraum;
  "mach was"
}

Und was mache ich, wenn ich den Zeitpunkt..

zeitpunkt

..noch in anderen Zusammenhängen nutze, so dass ich ihn für dieses Vorhaben nicht verändern möchte?

Gruß Chris

oder, geschickter, du machst eine logische Abfrage mit rein:

static boolean Einmal = true;
if(Einmal && millis() - zeitpunkt >= zeitraum)
{
  Einmal = false;
  "mach was"
}

Danke, danke, danke!!

Gruß Chris

guntherb:
Natürlich mußt du zeitpunkt neu setzen:

Wenns einmalig ausgeführt werden soll:

if(millis() - zeitpunkt >= zeitraum)

{
 zeitraum = 0xFFFFFFFF;  // wird erst nach 50 Tagen erreicht
 "mach was"
}

Nicht ganz.
Da Zeitpunkt sicher größer als 0 ist ist die Differenz zwischen millis() - zeitpunkt immer kleiner als 0xFFFFFFFF und wird deshalb nicht nach ca 50 Tagen erreicht sondern nie.
Grüße Uwe

Chris72622:
Und was mache ich, wenn ich
zeitpunkt
noch in anderen Zusammenhängen nutze, so dass ich ihn für dieses Vorhaben nicht verändern möchte?

Du nimmst natürlich für jeden logisch unterschiedlichen Zeitpunkt eine andere Variable, bitte sehr.
Und/Oder für jede getrennt gesetzte Funktion einen anderen "Einmal"-Merker...

Man sollte immer berücksichtigen, dass loop() so schnell sein kann, dass der gleiche millis()-Wert in mehreren Durchläufen nacheinander auftreten kann, und auch dass loop() so langsam sein kann, dass nicht jeder millis()-Wert getroffen wird.

Wenn es um exakte Wiederhol-Zyklen geht ( im Rahmen dessen, was millis() an Genauigkeit liefert ),
sollte man auch den nächsten Zeitpunkt nicht per

zeitpunkt = millis() + INTERVALL;

sondern mit

** **zeitpunkt = zeitpunkt + INTERVALL;** **

weitersetzen.

zeitpunkt += INTERVALL; // ist eine beliebte Kurz-Schreibweise hierfür

Da kann sich die aktuelle Ausführung ruhig um ein paar millis verzögern...