I've done a project with an ESP8266 board but after approximately 2 month it stops working correctly, I suspect the problem is related to the millis() value overflow but since the board it's mounted in an inconvenient position I would like to do the debugging process on another board at my desk and most importantly I don't want to wait 59 days.
My question is: can I start the program with the Millis value set so that there are only a few minutes left before the overflow? I swear I've read an answer to this exact problem but I can't find it anymore, can someone help me?
I’ve followed that guide and I’ve already done some research on the millis overflow subject. My code seems structured correctly but before creating a topic where I ask for help I would like to to provide more information about the program behavior so that’s why I wanted to know what happens when the value overflows
We could walk you through every possible millis permutation, but your answer will appear within two or three replies if you post your code (in code tags).
Please post your complete sketch here so that we can see what you have done
Basically, if you use unsigned longs for timing variables, subtraction to test for end of period and the period is not longer than 49 days then the millis() overflow will not cause a problem
If you are using variables for current, previous, and duration then these are typically unsigned long (32 bit), and logic will/can overflow in approximately 49 days.
If you use unsigned int (16 bit), you will overflow in about 66 seconds.
The example below demonstrates this.
unsigned int current;
unsigned int previous;
unsigned int duration = 10000; // 10 seconds
void setup()
{
Serial.begin(115200);
previous = millis();
}
void loop()
{
current = millis();
if (current - previous > duration) // Won't overflow
// if (current > previous + duration) // Will overflow
{
Serial.println(current);
previous = current;
}
}
Yes, this is one reason I like micros() better than millis(). If something is going to fail, you want it to fail fast so that you know about it and can fix it.
I was hoping that it was as simple as doing timer0_millis = 4294367295 as I seemed to have read but at this point I should just open another topic to ask the problem directly
If you want to experiment with rollover then test it using micros() or write your own myMillis() function that increments a variable and use that as a substitute for the value returned by millis() in your sketch
As previously requested, please post your full problem sketch here
That would result in your new topic getting flagged up to the moderators for cross posting, which is against forum rules.
Continue on this topic. If you want to change the topic title, you can do that by editing the first post. If you want to move the topic to another forum section, flag the first post to the moderators and ask them to move it, or just ask. Some forum members, like me for example, can move posts even though we are not moderators.
If you handle time differences through unsigned subtraction, rollover is a non-issue that confuses beginners.
Unsigned time is a round clock. If it is now 5 and I want a single simple 1-step formula to know how many hours elapsed since any start hour in the last 12 hours, I start at 5 and move the hour hand left start-hour times. 5 - 10 = 7, 5 - 4 = 1. Always works.
I could unsigned add 7 to 10 on my base 12 clock and get 5 but then how to test for time's up when 11 > 5? Use an if for rollover makes 2 steps necessary where 1 step will do. I tried that stuff myself long ago, haven't forgotten why it's no good.