Pages: [1] 2 3   Go Down
Author Topic: millis o unixtime?  (Read 2013 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 106
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buon giorno,

vorrei realizzare un controllo che mi permetta di eseguire determinate operazioni a intervalli regolari, senza però bloccare il programma con il delay; guardando in rete ho trovato una soluzione basata sulla funzione millis(): questa soluzione prevede l'utilizzo di variabili unsigned long che, presto a tardi, andranno in overflow. La domanda è: quando questo accadrà cosa ne sarà di tutti i controlli basati su queste variabili? L'overflow porterà ad un azzeramento della variabile?
Per ovviare a questo "inconveniente" pensate che sia implementabile qualcosa basato sul now.unixtime()?

Grazie
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Millis va in overflow dopo 49,7 giorni.

Io ho sviluppato alcune alternative che non soffrono di questo inconveniente:
libreria secTimer: un semplice contasecondi che utilizzi come milis(), ma che va in overflow dopo 136 anni!
swRTC: una libreria per implementare un RTC software: con essa puoi avere il tempo in oo:mm:ss e la data in gg:mm:aa per poter programmare eventi anche a distanza di anni
leOS: un semplice scheduler che esegue azioni in background indipendenti dal loop principale, a cadenza impostabile

Trovi tutto qui:
http://www.leonardomiliani.com/?page_id=374
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 106
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie per il suggerimento! me li spulcio e vedo come utilizzarli  smiley

ma cosa accade se la variabile definita come unsigned long va in overflow? si ri-azzera?
grazie
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma cosa accade se la variabile definita come unsigned long va in overflow? si ri-azzera?

Semplicemente riparte da 0 o dal valore in eccesso dovuto all'operazione matematica, esempio pratico con una variabile di tipo byte, per semplicità di calcolo, ma valido con tutti i tipi di variabile.

byte A;
A = 250;
A += 8:    // ora A vale 2 perché 250 + 8 = 258 però è in eccesso a 256 quindi 258 - 256 = 2

Oppure :

byte A;
A = 255;
A++;
// ora A vale 0, siamo in overflow perché un valore byte non può rappresentare il valore 0x100 e tutti i bit in eccesso vengono eliminati.

A++;   // ora A vale 1

Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma cosa accade se la variabile definita come unsigned long va in overflow? si ri-azzera?
Sì. Riparte il conteggio da zero.

EDIT:
preceduto
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11993
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma cosa accade se la variabile definita come unsigned long va in overflow? si ri-azzera?
Sì. Riparte il conteggio da zero.

EDIT:
preceduto
di solito millis si usa assegnandone il valore temporaneo a due diverse variabili, a distanza di tempo, e poi confrontandole tramite un IF, per stabilire se è passato un tot tempo o meno; questo è il pochissimo che so e che potrebbe amche essere sbagliato; cosa succede se vado a fare la differenza tra una lettura fatto subito dopo l'overflow ed una fatto subito prima? ottengo un valore negativo?
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottieni un valore incoerente. Ci sta che il tutto passi inosservato, come no. Dipende dal tuo codice.
Esempio.

(2^32)-1=4294967295
Questo è il valore massimo che può contenere un unsigned long (4 byte, 32 bit).
Mettiamo cheil prossimo io faccia un test poco prima dell'overflow, quando cioè millis contiene ad esempio 4294967000, e che il codice che uso sia questo:
if (millis()>tempMillis) {
  ......ecc....
  tempMillis = millis() + 1000;
}

Entro nell'if, eseguo il mio codice, poi prima di uscire imposto la prossima ripetizione a 1000 ms di distanza.
Però millis() diciamo che ora valga 4294967050 (ho impiegato 50 ms per eseguire i miei compiti), quindi tempMillis() dovrebbe valere 4294967050+1000= 4294968050. Ma il massimo è 4294967295, per cui tempMillis contiene 4294968050-4294967295=755.
Il controllo riparte, poi millis va in overflow e riparte da zero. Però siccome il check è fatto con millis > tempMillis, arriva dopo 1000 ms il controllo 756 > 755.
Qui vedi che l'overflow non ha dato problemi.

Se invece il controllo è:
if ((millis() + 1000)) > tempMillis) {
  ....ecc.....
  tempiMillis() = millis();
}

Allora il problema può saltar fuori.
Prendiamo i valori di prima. All'uscita dell'if tempMillis vale 4294967050 perché memorizzo millis().  Al successivo check faccio:
(4294967051 + 1000) > 4294967050?
Eseguiamo 4294967051+1000, dà come risultato 756. Ma siccome 756 non è maggiore di 4294967051, il ciclo if non viene ripetuto finché millis() + 1000 non diventa maggiore, cioè dopo quasi 49,7 giorni
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10112
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per ovviare a questo "inconveniente" pensate che sia implementabile qualcosa basato sul now.unixtime()?

e cosa succede quando va in overflow la now.unixtime()?  smiley-twist
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11993
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Azz, Leo, non pretendevo così tanta attenzione smiley-sweat, mi bastava capire se i miei timori fossero fondati, però ora capisco anche che fondamentalmente il timore è reale ma anche frutto della mia ignoranza in materia di programmazione, basta usare correttamente la funzione e il problema non si pone più. Grazie, risposta spettacolare e chiara smiley-wink
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Azz, Leo, non pretendevo così tanta attenzione , mi bastava capire se i miei timori fossero fondati, però ora capisco anche che fondamentalmente il timore è reale ma anche frutto della mia ignoranza in materia di programmazione, basta usare correttamente la funzione e il problema non si pone più. Grazie, risposta spettacolare e chiara

@Menniti
@leo72

Seguo sempre i vostri messaggi ed imparo ogni volta qualcosa in più e,come dici tu (Menniti) ,riuscite entrambi a dare spiegazioni semplici,precise ed anche con esempi che aiutano tutti quelli che come me hanno tanto da imparare......continuate sempre così smiley-mr-green 
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per ovviare a questo "inconveniente" pensate che sia implementabile qualcosa basato sul now.unixtime()?

e cosa succede quando va in overflow la now.unixtime()?  smiley-twist
Dai, davvero, hai unix sul Arduino?
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21654
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dai, davvero, hai unix sul Arduino?
ROFTL  smiley-lol
Logged


Offline Offline
Edison Member
*
Karma: 24
Posts: 2032
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dai, davvero, hai unix sul Arduino?
ROFTL  smiley-lol
http://www.instructables.com/id/AVRSH-A-Command-Interpreter-Shell-for-ArduinoAVR/
Eccolo  smiley-twist
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10112
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

stavo per dire "occhio che portebbe anche essere, magari non un linux ma un *nix", ed eccomi preceduto con tanto di link
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lí non devi contare i millisecondi ma le ore  smiley-wink smiley-wink smiley-wink
Ciao Uwe
Logged

Pages: [1] 2 3   Go Up
Jump to: