You are here

Millis() Rollover

Die Zahl, die von millis() zurückgegeben wird ist ein unsigned long (32bit ohne Vorzeichen) . Wenn das jede Millisekunde seit dem Start der MCU um 1 erhöht wird, dann passiert nach knapp 50 Tagen der "overflow". Da ist zu einem Zeitpunkt das Ergebnis von millis() noch eine große Zahl und kurz danach ist die wieder ganz klein.

Warum? Overflow?  Sehen wir uns mal einfach ein Beispiel für 4 bit an: die Dezimalzahl 15 in Binärschreibweise (4 Bit) ist: 1111. Wenn da jetzt noch eins dazuaddiert wird hätte man auf dem Papier 10000. Das passt aber nicht in 4 Bit. Es werden die unteren 4 Bit genommen und als Ergebnis gespeichert: 0000.

In der nachstehenden Diskussion wird klar, wie man das Dilemma vermeiden kann. Im Prinzip dürfen nicht die Rückgabewerte von millis() verglichen werden, sondern mit diesen Werten muss gerechnet werden. Und zwar so, dass in der Rechnung derselbe Overflow stattfindet wie bei Millis() selbst.

https://arduino.stackexchange.com/questions/12587/how-can-i-handle-the-m...