Blinkwithoutdelay If-Funktion

Hallo Zusammen,

ich habe mir einen Arduino mega 2560 gekauft und probiere so das eine oder andere aus.

Um die "böse" delay() Funktion zu vermeiden habe ich mir das Beispiel von Blink without delay angeschaut. Zu der If-Bedingung habe ich eine Frage:

...schnipp...

unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

...schnapp...

Wenn ich das richtig verstanden habe fängt millis() nach ca. 50 Tagen von vorne an zu zählen (unsigned long wäre "voll").
Dann müsste aber die Funktion ab diesem Zeitpunkt nicht mehr funktionieren, denn currentMillis wäre dann wieder deutlich kleiner als previousMillis und die Bedingung könnte nicht (nie) mehr erfüllt werden
(currentMillis - previousMills wäre dann für mindesten 49 Tage kleiner als 1000, falls es überhaupt je wieder über 1000 kommen würde).
Oder stehe ich da gedanklich auf dem Schlauch?

Grüße

che2016

Keine Angst, das wird nicht passieren, da deine Loop ja häufiger die Position durchläuft und damit previousMillis immer wieder aktualisiert.

Eine kleine Zahl Minus einer sehr großen Zahl ergibt wieder eine sehr große Zahl (wenn die Datentypen unsigned sind). Und die ist größer als das Intervall

che2016:
Wenn ich das richtig verstanden habe fängt millis() nach ca. 50 Tagen von vorne an zu zählen (unsigned long wäre "voll").

Genau nach 232-1 Millisekunden.

che2016:
Dann müsste aber die Funktion ab diesem Zeitpunkt nicht mehr funktionieren, denn currentMillis wäre dann wieder deutlich kleiner als previousMillis und die Bedingung könnte nicht (nie) mehr erfüllt werden
(currentMillis - previousMills wäre dann für mindesten 49 Tage kleiner als 1000, falls es überhaupt je wieder über 1000 kommen würde).

Diese Frage wurde hier im Forum schon mehrfach erläutert: millis Überlauf oder Millis-überlauf: von Theorie zu Praxis?

che2016:
Oder stehe ich da gedanklich auf dem Schlauch?

Die Fragestellung ist durchaus berechtigt, nur die Antwort ist eine andere. :slight_smile:

http://forum.arduino.cc/index.php?topic=285280.0

Dann wirkt unsigned so ähnlich wie abs(), wenn ich das richtig sehe.
Es wäre ja auch ein Wunder, wenn ich was besonders entdeckt hätte;-)

che2016:
Dann wirkt unsigned so ähnlich wie abs(), wenn ich das richtig sehe.

Ja, ist dann von vornherein ohne Vorzeichen.

Dann erst einmal Danke fürs vom Schlauch schubsen.
Werde mich mal weiter in die Tiefen des Mikrocontrollers begeben.

Dann wirkt unsigned so ähnlich wie abs()

Sehe ich nicht so:

int x = -1;

unsigned int x_a = abs(x); // +1  : aus 0xFFFF wird 0x0001 gemacht

unsigned int x_u = (unsigned int)x; // +65535  : 0xFFFF wird als positive Zahl interpretiert

michael_x:
Sehe ich nicht so:

Ein "Ja" erschien mir für den TO zielführender als ein "Nein". Darum habe ich mit "Ja" geantwortet, wohl wissend, daß der Begriff "ähnlich" schon einer gefährlichen Dehnung der Bedeutung bedarf. Ich hoffe, Du kannst mir diese Priorisierung der Verständlichkeit gegenüber der Genauigkeit nachsehen. :wink:

Das Gute an diesem Forum ist ja die jederzeit mögliche Präzisierung. Ich bin manchmal auch pingelig, wenn ich meine, es sein zu müssen :slight_smile:

Ein "Ja" erschien mir für den TO zielführender als ein "Nein". Darum habe ich mit "Ja" geantwortet, wohl wissend, daß der Begriff "ähnlich" schon einer gefährlichen Dehnung der Bedeutung bedarf. Ich hoffe, Du kannst mir diese Priorisierung der Verständlichkeit gegenüber der Genauigkeit nachsehen. :wink:

Ich wollte auch nicht unbedingt dich, agmue, belehren oder korrigieren oder gar bekehren, sehe es eben nur anders rum: Auch der TO oder wer immer hier mitliest, sollte den Unterschied zwischen einem unsigned Datentyp und der Funktion abs() verstehen. Und gar nicht erst in Ideen "so ähnlich wie" bestärkt werden...

Meine Antwort wäre "Nein, schade dass du da was durcheinander wirfst" gewesen :wink:
( Auch leicht verständlich, finde ich, und mit meinem vorigen Beitrag zusammen evtl. gar überzeugend ? )

Ob das jetzt pingelig ist, will ich keinen Streit anfangen, danke che2016 jedenfalls, für den Anlass
:stuck_out_tongue:

michael_x:
... evtl. gar überzeugend ?

Also zumindest ich bin überzeugt :slight_smile:

Da müssen wir einen gepflegten Streit wohl auf ein andermal mit einem lohnenderen Anlaß verschieben!