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
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..
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 ) 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.
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 und das einzige mit der Kristallkugel?
Grüße Uwe