/*
* Resetting millis() and micros() for troubleshooting and
* learning purposes, very useful for timer overflow tests
*
* Sources:
*
* https://tomblanch.wordpress.com/2013/07/27/resetting_millis/
*
* https://forum.arduino.cc/t/reset-arduino-millis-and-micros/184426
*
*/
unsigned long currentSecond, initialMillis;
void setup()
{
// Stage an overflow 5 seconds from now
stage_reset_millis(5000);
Serial.begin(57600);
currentSecond = 0;
initialMillis = millis();
}
void loop()
{
Serial.print(currentSecond, DEC); // Not actual seconds, just a rough counter
Serial.print(" -- ");
Serial.print("millis = ");
Serial.print(millis(), DEC);
Serial.print("; micros = ");
Serial.print(micros(), DEC);
Serial.print("; delta millis: ");
Serial.print(millis() - initialMillis, DEC); // Keep an eye on this one
Serial.println("");
currentSecond++;
delay(1000);
}
void stage_reset_millis(unsigned long offset)
{
extern volatile unsigned long timer0_millis, timer0_overflow_count;
noInterrupts();
timer0_millis = timer0_overflow_count = -offset;
interrupts();
}
/************************************************************************
// here's a proof of concept for the solution
void reset_millis()
{
extern volatile unsigned long timer0_millis, timer0_overflow_count;
noInterrupts();
timer0_millis = timer0_overflow_count = 0;
interrupts();
}
************************************************************************/