Loading...
Pages: 1 [2] 3   Go Down
Author Topic: Come faccio a gestire tempi lunghi?  (Read 602 times)
0 Members and 1 Guest are viewing this topic.
Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 74
Posts: 7348
"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

non hai problemi di overflow.

La sua è solo una scusa per spronarti a realizzare il LeOS II  smiley-mr-green
Logged


Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16460
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il leOS2 esiste già  smiley-wink
Ho già iniziato a lavorare al leOS3 ma non ho molto tempo per starci dietro  smiley-sweat
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 74
Posts: 7348
"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

Il leOS2 esiste già  smiley-wink

Allora vuole almeno il Service Pack 1  smiley-mr-green
Logged


Cagliari
Offline Offline
Faraday Member
**
Karma: 49
Posts: 3011
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se il controllo su millis() lo fai nella forma esposta nel mio articolo, ossia
MILLIS - TEMPO_PRECEDENTE > INTERVALLO

non hai problemi di overflow.

E se fai:
abs(Millis - tempo_precedente) > Intervallo
non è meglio?
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 74
Posts: 7348
"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

E se fai:
abs(Millis - tempo_precedente) > Intervallo
non è meglio?

Ancora più semplice, e nel caso non ti servono ritardi maggiori di 6.5 secondi basta utilizzare valori interi invece di long int.

Code:
/* Millis reset
 
 */
extern unsigned long timer0_millis; // dichiarazione per accedere al contatore di millis

timer0_millis = 0; // per resettare millis()

Logged


Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16460
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E se fai:
abs(Millis - tempo_precedente) > Intervallo
non è meglio?
Non serve, usando dati di tipo unsigned long si parla sempre di numeri positivi.
Logged


Offline Offline
God Member
*****
Karma: 4
Posts: 574
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No, millis mi è antipatica perchè va in overflow.

Il fatto che va in overflow dopo 47 e rotti giorni non significa che il tuo programma smette di funzionare, in tutti i casi puoi resettare a tuo piacere la millis(), evitando di fatto che vada in overflow, non appena hai terminato i vari cicli di delay che ti servono.

Ma si può resettare via software il millis()?
Logged

Offline Offline
God Member
*****
Karma: 4
Posts: 574
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nello specifico devo far partire una sirena solo dopo 2 minuti che è avvenuto un evento, un HIGH, un CHANGE, quello che volete. Come fareste?

E la sirena suona per un minuto, poi si silienzia.

Evento();  //PIR che lancia un allarme
.
.
. (2 min di ritardo)
.
.
SirenaON();  //sirena che suona
.
. (1 min di ritardo)
.
SirenaOFF(); //sirena che si spegne
Logged

Offline Offline
God Member
*****
Karma: 3
Posts: 589
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
unsigned long int tempoEvento;
bool eventoAvvenuto;
if (evento()) {
  tempoEvento = millis();
  eventoAvvenuto = true;
}
if (eventoAvvenuto) {
  if (millis() - tempoEvento >= 2000) {
    digitalWrite(sirena,HIGH);
  }
  if (millis - tempoEvento >= 3000) {
    digitalWrite(sirena,LOW);
    eventoAvvenuto = false;
  }
}

Questo non tiene di conto della condizione che avvemga un secondo evento mentre stai gestendo il primo.

P.S. tempoEvento e eventoAvvenuto devono essere variabili globali o quantomeno (non sono sicuro che funzioni, prova) le devi definire static, altrimenti al ciclo successivo le perdi.
« Last Edit: March 19, 2013, 03:17:13 pm by Janos » Logged

Offline Offline
God Member
*****
Karma: 4
Posts: 574
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E con questo allarme sempre collegato alla rete non ho i problemi dei 47 giorni?
Logged

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16460
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma si può resettare via software il millis()?

Forse te la sei persa:
Code:
/* Millis reset
 
 */
extern unsigned long timer0_millis; // dichiarazione per accedere al contatore di millis

timer0_millis = 0; // per resettare millis()

Logged


Offline Offline
God Member
*****
Karma: 4
Posts: 574
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma si può resettare via software il millis()?

Forse te la sei persa:
Code:
/* Millis reset
 
 */
extern unsigned long timer0_millis; // dichiarazione per accedere al contatore di millis

timer0_millis = 0; // per resettare millis()


Grazie Leo, prendo e segno sul quadernetto del codice utile!
Logged

ivrea (to)
Offline Offline
God Member
*****
Karma: 10
Posts: 624
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Grazie Leo, prendo e segno sul quadernetto del codice utile!

E come non ri-quotare?   Ma Leo, ma ma ma quante ne sai?!!!

Che cosa hai letto oltre ai manuali di Arduino? Manuali degli Amtel?
Li ci sono molte delle info che hai su Arduino e la sua programmazione avanzata, come gl interrupt?
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 74
Posts: 7348
"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

E come non ri-quotare?   Ma Leo, ma ma ma quante ne sai?!!!

Senza voler togliere nulla a Leo, però il metodo per resettare la millis() è opera mia, la prima volta l'ho postato un paio di anni fa qui smiley
Logged


Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16460
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@nid69 e Babbuino:
il metodo l'ha postato astrobeed, avete perso il post  smiley-wink

Che cosa hai letto oltre ai manuali di Arduino? Manuali degli Amtel?
Li ci sono molte delle info che hai su Arduino e la sua programmazione avanzata, come gl interrupt?
Tutte le info che so le ho imparate leggendo il datasheet, sperimentando, e studiando il codice degli altri (ecco perché ringrazio l'opensource).
Logged


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