Fonte di quanto segue
https://www.gammon.com.au/forum/?id=12127&reply=1#reply1
A causa del modo in cui funziona il codice della libreria, il numero restituito da millis () andrà lentamente alla deriva.
Supponendo un orologio da 16 MHz:
C’è un interrupt (Timer 0 overflow interrupt) chiamato ogni 1024 μs che aggiorna la variabile usata da millis (). Pertanto millis () uscirà di 24 μs dopo il primo interrupt, 48 μs dopo il secondo interrupt e così via. Il codice alla fine compensa quindi questa inesattezza non è cumulabile nel tempo.
In altre parole, millis () funzionerà lentamente (dovrebbe aggiornarsi ogni 1000 μs ma in realtà aggiorna ogni 1024 μs).
Tuttavia l’interrupt di overflow, che viene chiamato ogni 1024 μs, tiene traccia della quantità che è fuori, e alla fine aggiunge uno al millis () conteggio per recuperare (e riduce l’importo di overflow per compensare). Ciò avverrà all’incirca ogni 42 interruzioni di overflow. A questo punto, ovviamente, il conteggio restituito da millis () “salterà” quando viene aggiunta questa quantità di compensazione aggiuntiva.
In dettaglio, aggiunge 3 (FRACT_INC) a una variabile chiamata timer0_fract ogni overflow. Continua a farlo finché timer0_fract è> = 125 (FRACT_MAX). Quando ciò accade aggiunge 1 al contatore millis (timer0_millis) e sottrae 125 da timer0_fract. Poiché 125/3 è 41,67 questo succede ogni 42 overflow o giù di lì. (E poiché stiamo aggiungendo uno ogni 42 overflow, significa che ne stiamo aggiungendo uno ogni 42 * 24 μs, ovvero ogni 1008 μs).
Se si eseguono piccoli intervalli di sincronizzazione, micros () sarà molto più accurato, dato che legge direttamente dall’hardware e non soffre di questo errore di scorrimento. Tuttavia si avvolge dopo circa 71 minuti. Inoltre, micros ha una risoluzione di 4 μs (non 1 μs) a causa del modo in cui è configurato il timer. (Conta fino a 256, utilizzando un prescaler di 64. Un ciclo di clock è 62,5 nS, quindi “spunta” ogni 4 μs e overflow ogni 256 * 4 μs).
Non vorrei essere troppo semplicistico, ma mi sembra molto più semplice ed accurato inizzializzare il Timer0 a 6 cosichè possa contare 250 x 4uS = 1000uS giusti.
Che ne pensate ?