[RISOLTO] Contaore, overflow e pura teoria

Premesso che sarà un discorso "puramente teorico"...vista la remotissima probabilità che accada!

Vorrei approfondire questa problematica:

Ho un contaore (per fase di studio contasecondi) che somma i tempi in cui un contatto è chiuso.

Sappiamo, tuttavia, che dopo 4.294.967.295 ms dall'avvio il MC va in overflow.

Per evitare errori di calcolo mi "tutelo" con questa condizione che evita la somma:

 if (millis() > Timer){TotSecondi=TotSecondi+((millis()-Timer)/1000);}

Che trucco potrei usare per garantirmi anche in caso di overflow di eseguire tale somma ?

Tradotto: nell'assurda ipotesi che il conteggio parta a 4.294.967.000 e termini a 9.705, perderei questi 10 secondi... come lo evito?

Grazie :)

Zamundo:
nell’assurda ipotesi che il conteggio parta a 4.294.967.000 e termini a 9.705, perderei questi 10 secondi… come lo evito?

Semplicemente resettando la millis() prima di iniziare il computo del tempo :slight_smile:

Perfetto grande Astro! Quindi potrei scrivere così?

Dichiaro

extern unsigned long timer0_millis;

Poi scrivo:

 if (millis() > Timer){TotSecondi=TotSecondi+((millis()-Timer)/1000);}
 else {resetMillis();}


void resetMillis() {
  cli();
  timer0_millis = 0;
  sei();
}

Oppure devo azzerare la millis prima di ogni conteggio ?

Zamundo: Oppure devo azzerare la millis prima di ogni conteggio ?

Se non devi usare per altre cose la millis() puoi azzerarla sempre prima di iniziare un nuovo conteggio, altrimenti verifica prima a quanto è arrivata ed eventualmente la resetti tenendo conto degli effetti per altri eventuali conteggi in corso.

Ottimo. Grazie

PS Alla fine ho optato per resettare il millis() ogni 30 giorni (ovviamente verificando che tutti i conteggi in essere siano correttamente "terminati") :)

In questo modo non ho necessità di "valutare" se sono o meno arrivato a 49,7 !!! :D

[edit] --- Post scriptum errato --- PPS Un grazie anche a Leo... la funzione che permette di fermare gli interrupt, azzerare il millis, e far ripartire gli interrupt... è sua ! [edit]

Zamundo: PPS Un grazie anche a Leo... la funzione che permette di fermare gli interrupt, azzerare il millis, e far ripartire gli interrupt... è sua !

Mi spiace, ma il modo per azzerare la millis() è mio, l'ho scritto diversi anni fa sul forum, molto prima di Leo :)

Caspita scusa Astro, ho letto questa discussione sul Forum e pensavo fosse sua. http://forum.arduino.cc/index.php?topic=135516.0

Allora doppio ringraziamento ! ;D