Überlaufsicheren Timer - etwas alle x Sekunden machen

Da mir alle Antworten geholfen haben, werd ich jetzt keinen als "Solution" markieren, wenn das so ok ist. Auf jeden Fall nochmals Danke an alle.

Hi zusammen,

trotz all der guten Beispiele will ich eine Sache nicht begreifen:

Nehmen wir mal an, millis() würde bei 500000 überlaufen (normalerweise sinds ja glaub ich 4 Billionen?).

Wenn dann die If-Bedingung bei einem millis()-Stand von 499999 eintritt, wird in die Variable "millisMerker" ja 499999 geschrieben.

Dann läuft millis über und ist beim nächsten Durchgang der Schleife dann z.B. 1.

Die If-Bedingung lautet dann ja

if (1-499999) > dauerBisRepeat) {
Mach Alarm!
}

1-499999 = - 499998

und beim nächsten Durchlauf ist millis z.B.2

if (2-499999) > dauerBisRepeat) {
Mach Alarm!
}

2-499999 = - 499997

usw.

D.h. dann dauert es doch ewig, bis die Bedingung wieder eintritt, oder?

Sorry für diese für euch wahrscheinlich saudumme Frage.
Wahrscheinlich denk ich hier zu kompliziert und dieser Fall wird so nie eintreten.

Aber wäre nett, wenn ihr nochmal Geduld und Gnade mit mir zeigt.

LG Daniel

Eben nicht. Deine Variable ist unsigned. Da gibt es keinen negativen Bereich!
Nehmen wir Dein Beispiel:

499999 +1 -> 0 +1 - > 1
Umgekehrt aber auch!
1 -1 -> 0 -1 -> 499999

Eben nicht! 2-499999 gibt 3 :slight_smile:

Gruß, Jürgen

1 Like

Unsigned....stimmt :wink:
Wie kann man nochmal dumme Fragen löschen ? :see_no_evil:

Danke dir und schönes Wochenende!

schaus dir mal mit einem byte an:

byte bMillis = 128;
byte previousMillis = 0;
byte interval = 5;

void setup() {
  Serial.begin(115200);

  for (int i = 0; i < 1000; i++)
  {
    bMillis++;
    Serial.print(bMillis);
    Serial.print(" ");
    Serial.print(previousMillis);
    byte result = bMillis - previousMillis;
    Serial.print(" ");
    Serial.print(result);
    if (result > interval)
    {
      previousMillis = bMillis;
      Serial.print(" fire");
    }
    Serial.println();
    delay(100); // dirty delay to slow down
  }
}

void loop() {

}
1 Like

Hallo
Es gibt keine dummen Fragen, es gibt nur dumme Antworten :nerd:

1 Like

Das könnte auch eine Durchhalteparole für DAUs sein....
:japanese_ogre: :japanese_ogre: :japanese_ogre:

Zu spät :wink:

Ich überleg mir grad schon neue Fragen :partying_face:

Nee, ich versuch mich nur im Notfall zu melden :wink:

1 Like

Millis läuft alle 49,6 Tage über, dh es beginnt wieder von null.
Ein Überlauf ist bei richtiger schreibweise der If Bedingung kein Problem. Der Intervall ist immer richtig.
Ein unlösbares Problem ist wenn das Intervall größer als 49,6 Tage sein soll. Das kann man mit millis alleine nicht machen. Da muß man mitzählen wieviele Überläufe seit Start passiert sind.
Bei so großen intervallen ist die Überlegung eine RTC zb die genaue DS3231 zu nehmen einen Gedanken wert.
Grüße Uwe

Och...
Da mache dir mal bitte keine unnützen Hoffnungen!

Denn die "dumme Frage" ist eigentlich eine Folge der Erkenntnis!
Vor der Erkenntnis ist die Frage existenziell.
Und eben die Erkenntnis, erfolgt oftmals erst nach der Frage.

Es ist also insgesamt gesehen, schon ein rekursives Problem.

Absolut! :exploding_head:

Da fällt mir gerade der Spruch des Redners neulich bei der Jugendweihe meines Großens ein.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.