Millis non e' molto preciso, perche' dipende dalla precisione del clock della MCU, che non e' il massimo, specie se usa un risuonatore ceramico o il clock interno ... se ci devi contare intervalli brevi in modo saltuario, o anche un'intervallo relativamente lungo ma non ripetitivo su periodi di giorni, puo andare, ma se ci dovessi fare, ad esempio, un contatore o timer programmabile su tempi di parecchi giorni o un'orologio, l'errore sarebbe eccessivo ...
Etemenanki io utilizzo un oscillatore esterno di 16 mhz. Prendendo come esempio quello che hai detto tu, "un'intervallo relativamente lungo", il codice sopra descritto può andare bene ? Devi far conto che ogni 15 minuti mi vado a memorizzare nella EEprom i minuti trascorsi e per ogni ora vado a memorizzare le ore totali.
fabio22:
... Devi far conto che ogni 15 minuti mi vado a memorizzare nella EEprom i minuti trascorsi e per ogni ora vado a memorizzare le ore totali.
... e tu devi fare conto che i 'minuti' NON sono 'minuti' ma sono 'minuti +/- secondi' e la stessa cosa è per le ore.
Se non ti serve una esatta ripetitività, ma è una cosa una tantum, va bene, ma se è una cosa che deve ripetersi ad intervalli regolari, tutti i giorni ... ti occorre necessariamente un RTC.
Guglielmo mi ha preceduto, ma comunque volevo chiarire solo una cosa ... se per contaore intendi un timer ciclico, cioe', ogni giorno devi contare tot ore/minuti o ripetere ciclicamente alcune operazioni per parecchi giorni, allora si, ti serve un'RTC come ha detto lui ...
Se invece per contaore lo intendi nel senso "classico" del termine, cioe' un qualcosa che conta il tempo cumulativo in cui un'applicazione, un macchinario o un'operazione e' in funzione, anche se fra piu giorni, allora se non ti serve la precisione ed alcuni secondi di scarto sono accettabili, potresti anche usare millis ... ricordando pero' che ogni 49 giorni e rotti (dove "e rotti" e' un'unita' di misura della scala spannometrica, internazionalmente riconosciuta :D) millis si resetta ... quindi se l'intervallo in cui effettuare la misura e' piu lungo, devi tenerne conto ...
Etemenanki:
... ricordando pero' che ogni 49 giorni e rotti (dove "e rotti" e' un'unita' di misura della scala spannometrica, internazionalmente riconosciuta :D) millis si resetta ... quindi se l'intervallo in cui effettuare la misura e' piu lungo, devi tenerne conto ...
Questo SOLO se ha un periodo di ciclo > 49gg ... per qualsiasi altro ciclo la cosa è inifluente.
Ovvero se deve fare una cosa di X ore ogni Y giorni con Y > 49 allora ne deve tenere conto, ma se deve fare, anche all'infinito, una cosa di X ore/minuti ogni Y ore/giorni con Y < 49 gg. allora il problema NON esiste.
Lo scopo principale e capire per quante ore o minuti il segnale in uscita rimane alto.
Ogni volta che il segnale da 0 passa a 1 ecco che comincio a contare i secondi e successivamente i minuti e le ore. Una volta che il segnale da 1 passa a 0 ecco che non entrerà più nella routine del millis
Gugliemo l'artico da te riportato già l'avevo letto se pur con molta leggerezza:
Leo riporta questo esempio:
Ecco il trucco. Basta cambiare nel primo esempio il confronto in modo da verificare se la differenza fra il valore attuale di millis() e l’intervallo, trasformata in un tipo signed long, è inferiore a 0: se ciò è vero, significa che millis() è ripartito da 0 ed il test restituirà un numero negativo fino a quando millis() non avrà un valore maggiore di zero e di intervallo. Ecco un esempio di codice che non soffre del problema dell’overflow di millis():
Fortunatamente l'errore è sia positivo che negativo (... es. in funzione della temperatura che varia la frequenza dell'oscillatore) ... su un periodo di un paio di mesi aspettati un errore +/- di qualche ora.