Pages: [1]   Go Down
Author Topic: Verständnisfrage zu Modulo und der zeitlichen Ausgabe einer "Aktion"  (Read 304 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

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

Code:
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
« Last Edit: August 18, 2013, 07:26:44 am by Chris72622 » Logged


Germany S-H
Offline Offline
Faraday Member
**
Karma: 166
Posts: 3202
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!!
Logged

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schande über mich.  smiley-confuse
Logged


Offline Offline
Faraday Member
**
Karma: 128
Posts: 4122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: August 18, 2013, 08:56:51 am by Serenifly » Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 270
Posts: 21865
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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
Logged

Pages: [1]   Go Up
Jump to: