Go Down

Topic: Verständnisfrage zu Modulo und der zeitlichen Ausgabe einer "Aktion" (Read 325 times) previous topic - next topic

Chris72622

Aug 18, 2013, 02:24 pm Last Edit: Aug 18, 2013, 02:26 pm by Chris72622 Reason: 1
Hallo,

ich würde gerne einmal pro Sekunde einen bestimmten Code ausführen.

Code: [Select]
if(millis()%1000 == 0)
{
 mach dies und das..
}


Frage zu folgendem Code:

Wenn Modulo "0" ist, weil z.B. 1000ms vergangen sind, wird dann so lange der auszuführende Code ausgeführt, bis Modulo nicht mehr "0" ergibt?

Ich frage deshalb, weil es ja sein kann, dass diese Stelle während dieser einen Millisekunde ja mehrmals "durchlaufen" werden kann.

Wie kann ich es bewerkstelligen, dass der auszuführende Code tatsächlich auch nur ein einziges Mal pro Sekunde ausgeführt wird?

Gruß Chris

jurs


Frage zu folgendem Code:


Es ist mir völlig schleierhaft, wieso Du die Frage nicht in genau dem Thread stellst, den es betrifft.


Wie kann ich es bewerkstelligen, dass der auszuführende Code tatsächlich auch nur ein einziges Mal pro Sekunde ausgeführt wird?


Den Teil des Codes, der das macht und den ich gepostet hatte, hast Du beim Quoten hier in diesem Thread weggelassen.
Un-be-greif-lich!!!


Serenifly

#3
Aug 18, 2013, 03:33 pm Last Edit: Aug 18, 2013, 03:56 pm by Serenifly Reason: 1

Wenn Modulo "0" ist, weil z.B. 1000ms vergangen sind, wird dann so lange der auszuführende Code ausgeführt, bis Modulo nicht mehr "0" ergibt?

Eine if-Abfrage wird nur einmal ausgeführt.

Generell macht man das so (jedenfalls in der Loop):
Code: [Select]

unsigned long previousMillis = 0;

void loop()
{
 unsigned long currentMillis = millis();

 if(currentMillis - previousMillis > 1000)
 {
      previousMillis = currentMillis;
     
     ....
 }
}


Der Code von jurs in deinem Thread ist eine Abwandlung davon, weil es statt dessen in einer Funktion gemacht wird und man den Wert der Sekunden speichern will. "millis()/1000" inkrementiert jede Sekunde. Wenn sich dieser Wert ändert ist also eine Sekunde vergangen.

Ansonsten ist es das gleiche Prinzip: Zeit einlesen -> mit alter Zeit vergleichen -> wenn Intervall abgelaufen ist, alter Zeit die neue Zeit zuweisen

Die Modulo-Divsion darin ist dazu da um auf gerade und ungerade Zahlen abzufragen

uwefed

Code: [Select]
if(millis()%1000 == 0)

Wäre für mich zu unsicher da es nur bei genau 1000 das heißt nur 1 mS alle 1000mS zutrifft. Falls etwas im Code die Ausführung verspätet wird in dieser Sekunde der Kode im if nicht ausgeführt.

Grüße Uwe

Go Up