läuft millis() hier über ?

Hallo allerseits,
ich versuche gerade zu verstehen wann und wo millis() überläuft (soll ja nach ca 49 Tagen so sein).

Ich habe hier ein Beispiel Sketch :

int intervall_1= 2000;          //Intervallzeit 2 sekunden
int intervall_2 = 5000;         //Intervallzeit 5 sekunden
unsigned long Zeit_1;           // Zeit-Variable 1
unsigned long Zeit_2;           // Zeit-Variable 2

void setup()
{
 Serial.begin(9600);
 Serial.println(F("Starte Test-Program..."));
}

void loop()
{
  
  if((millis() - Zeit_1) > intervall_1){
    Zeit_1 = millis();
   
  Serial.print(F("Zeit_1 :"));
  Serial.println(Zeit_1);
  Serial.println(F("  "));
  
  }
  
  if((millis() - Zeit_2) > intervall_2){
    Zeit_2 = millis();
  
  Serial.print(F("Zeit_2 : "));
  Serial.println(Zeit_2);
  Serial.println(F("  "));
  }
  
  
}

Läuft millis() hier nach 49 Tagen über oder läuft das Unendlich bzw.bis ich den Arduino neu starte ?

Ich habe in WWW gesucht nach millis() restten, aber so wirklich habe ich nichts gefunden.
Aber wenn in meinem Test-Sketch kein überlauf statt findet, hat sich das restten ja erledigt.

Ich würde mich freuen, wenn mir jemmand Licht ins dunkle bringen könnte :blush:

Hallo,

hier: millis() - Arduino Reference

Grüße,
Jürgen

Hallo Jürgen,
habe ich gelesen.
Aber wie und was kann ich machen das millis() nicht überläuft ?

Wie kann ich es anstellen, das der Arduino nicht resettet werden muss ?
Delay kann ich nicht nehmen, dann ja stoppt der Durchlauf.

Cetax:
Aber wie und was kann ich machen das millis() nicht überläuft ?

gar nichts.

Aber so wie das Beispiel oben geschrieben ist, macht das nichts. Unsignd long sorgt dafür, dass keine negativen Zeiten auftreten, die sonst das Programm in eine Endlosschleife schicken können. Zum Testen kannst du micros() nehmen (http://arduino.cc/en/Reference/Micros). micros() läuft 1000mal schneller in rund 70min über.

Ok, vieleicht erzähle ich kurz den Hintergrund.
Also, der Arduino soll 3 Funktionen unabhänging von einander ausführen.
Einmal wird ein S0-Stromzähler ausgelesen, also die Impulse gelesen.
Und als zweite Funktion, soll jede Sekunden ein LDR abgefragt werden,
die dritte wäre die gezählten Impule auf eine Website (der Arduino selbst ist der Webserver) darzustellen.

Also, Impulse zählen und auf der Website anzeigen klappt und auch die geschichtemit den LDR.
Nur halt auf 2 Arduino´s. Ich möchte das gern mit nur einem machen.

Aber da millis() ja irendwann überläuft, muss ich den Arduino doch dann neu starten, oder versteh ich das falsch ?

Cetax:
Aber da millis() ja irendwann überläuft, muss ich den Arduino doch dann neu starten, oder versteh ich das falsch ?

Nein.
Millis läuft über. Und Deine Intervallzählung läuft trotz des Überlaufs ganz normal weiter, so als wenn da kein Überlauf wäre.

So wie Du es oben gepostet hast, mit der "unsigned long" deklarierten Variablen und der Differenzbildung:
if((millis() - unsigned_long_variable) > intervall) ...
ist es absolut "überlauf-sicher" codiert.

Der Überlauf tritt zwar auf, aber der Code läuft trotzdem richtig.

Cetax:
Aber da millis() ja irendwann überläuft, muss ich den Arduino doch dann neu starten, oder versteh ich das falsch ?

Der Überlauf macht nichts. Wichtig ist <unsigned long Zeit_1;>. Nimmt man nur long, dann kann das Programm durch den Überlauf in eine Endlosschleife geraten.

Teste es mal mit micros() und entsprechend vergrößerten Intervallen, da ja jetzt Mikrosekunden statt Millisekunden gezählt werden..

Hallo,
vielen Dank für Eure HIlfe,
denke ich habe es verstanden und umgetzt.

Also läuft millis() zwar über, abder das macht nichts, weil unsigned long keinen Negativ Wert hat.

Habe ich das so richtig verstanden ? :blush:

weil unsigned long keinen Negativ Wert hat.

Nicht ganz.
Es funktioniert, weil Du eine Zeitdifferenz bildest und durch richtiges subtrahieren (Reihenfolge in der Rechnung) ist die Differenz immer richtig egal ob zwischen den beiden Werten ( Minuend und Subtrahend; mußte selbst nachschauen :wink: :wink: ) ein Überlauf stattgefunden hat.

Der einzige Limit bei millis ist daß keine größeren Zeitdifferenzen als 49,5 Tage möglich sind da mit einfachen mitteln nicht zu ermitteln ist ob ein Überlauf stattgefunden hat oder nicht. Also wenn Du mit millis() eine verzögerung von 60 Tagen willst funktioniert das mit millis() alleine nicht.

Abhilfe: http://www.faludi.com/2007/12/18/arduino-millis-rollover-handling/ Die Funktion zählt praktisch die Overflows. (rollover)

Grüße Uwe

Hallo Uwe,
danke für die Klasse Erklärung.
Dann kann ich ja endlich weitermachen, ohne Angst haben zu müssen,
das ich den Arduino Zwangs neu starten muss.

Und auch nochmal ein Danke alle ander, für die tolle Unterstützung!
In anderen Foren ist das leider nicht so...

Cetax:
Und auch nochmal ein Danke alle ander, für die tolle Unterstützung!
In anderen Foren ist das leider nicht so...

Was machst Du in anderen Foren? Ist das hier nicht das einzig wahre gute nette kompetente hilfsbereite Arduino-Forum :wink: :wink: :wink: :wink: :wink: :wink: und das einzige mit der Kristallkugel? :wink: :wink: :wink: :wink:
Grüße Uwe

XD XD XD XD Jaaa ....
Ich bereue.... :grin: