precisione arduino

astrobeed:

jacock:
l' ho fatto andare per un ora attaccato a un carica-usb (quindi non dovrebbero esserci quegli effetti di rallentamento dovuti all' uso con l' usb del pc) e il risultato è che DOPO UN ORA, HA PERSO GIA' 5 SECONDI..... uso arduino 2009 è normale? è il quarzo che è rovinato o di scarsa qualità?

Mettendo da parte per un attimo le considerazioni sulla reale precisione del quarzo/risuonatore montato sulla 2009/UNO, si va da +/- 50 ppm fino a +/-250 ppm (ovvero un errore reale compreso tra +/- 2 minuti/mese e +/- 10 minuti/mese), il vero problema è che la millis non è 1 ms esatto.

In Wiring.c viene definita in questo modo:

// the prescaler is set so that timer0 ticks every 64 clock cycles, and the

// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))




Ovvero il Timer0 è settato con un prescaler 1:64 in modo da ottenere un count ogni 4us, dato che la millis funziona contando gli overflow abbiamo 256*4 = 1024 us per ogni count della millis e non 1000 come porta a pensare il nome della funzione.
Tradotto in tempi, ipotizzando che il quarzo sia da 16 MHz precisi, vuol dire che quando la millis segna 1024 ms in realtà sono passati solo 1000 ms.

chissà se di questa particolarità ha tenuto conto Leo nel suo SWrtc (o RTCsw, ora non ricordo bene...)?