Pages: [1]   Go Down
Author Topic: the good the bad and the mills()...  (Read 870 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ragazzi scusate... sono nuovo mi sono appena presentato.
Premessa, ho capito (forse) come funziona l'istruzione millis
MA
vi riporto l'esempio, scritto tra l' altro molto bene, preso dal blog di Vittorio Zuccalà..
Code:
void setup(){
time=millis();
letturaluce_time=mills();
servotime=millis();
  letturadati=millis();
}

void loop(){
time=millis();

if(time>letturaluce_time+5){
luce1=analogRead(SENSORELUCE1);
letturaluce_time=millis();
}

Ora io ho capito che inizializzando le tre variabili time; letturaluce; servotime con millis faccio "partire" il conto dello sketch su tutte e tre, ma nella riga if (time>letturaluce_time+5) non mi è chiara qusta cosa: come fa time ad essere maggiore dello stesso valore della variabile lettura luce+ il valore di 5? Non si dovrebbe scrivere if (time<letturaluce_time+5)? dopotutto se millis vale ad esempio 3 ms, come è possibile che 3>3+5 (vedi (time>letturaluce_time+5) ).
Spero di essere stato chiaro, se c'è qualche anima pia che mi aiuta...
Grazie
Marco
Logged

Offline Offline
Sr. Member
****
Karma: 7
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ragazzi scusate... sono nuovo mi sono appena presentato.
Premessa, ho capito (forse) come funziona l'istruzione millis
MA
vi riporto l'esempio, scritto tra l' altro molto bene, preso dal blog di Vittorio Zuccalà..
Code:
void setup(){
time=millis();
letturaluce_time=mills();
servotime=millis();
  letturadati=millis();
}

void loop(){
time=millis();

if(time>letturaluce_time+5){
luce1=analogRead(SENSORELUCE1);
letturaluce_time=millis();
}

Ora io ho capito che inizializzando le tre variabili time; letturaluce; servotime con millis faccio "partire" il conto dello sketch su tutte e tre, ma nella riga if (time>letturaluce_time+5) non mi è chiara qusta cosa: come fa time ad essere maggiore dello stesso valore della variabile lettura luce+ il valore di 5? Non si dovrebbe scrivere if (time<letturaluce_time+5)? dopotutto se millis vale ad esempio 3 ms, come è possibile che 3>3+5 (vedi (time>letturaluce_time+5) ).
Spero di essere stato chiaro, se c'è qualche anima pia che mi aiuta...
Grazie
Marco

il ciclo loop viene eseguito all'infinito e la funzione millis ritorna sempre il tempo in millisecondi trascorso dall'accensione dell'arduino... il millis viene sempe e comunque aggiornato qualsiasi cosa stia succedendo nel ciclo for (tecnicamente si direbbe che è attaccato ad un'interrupt) quindi dopo che sono trascorsi 5 millisecondi il valore time viene a prendere un valore maggiore della lettura_luce_time + 5 millisecondi entrando di fatto nel ciclo if. All'interno del ciclo if hai la nuova lettura del valore analogico ed hai un aggiornamento della variabile letturaluce_time... quindi la prossima lettura avverrà fra altri 5 millisecondi.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
quindi dopo che sono trascorsi 5 millisecondi il valore time viene a prendere un valore maggiore della lettura_luce_time + 5 millisecondi entrando di fatto nel ciclo if.
non ho capito il perchè,  smiley-red scusa son di coccio....
se time= millis() e lettura_luce= millis() e quindi se millis= 3 come è possibile che time è maggiore di lettura_luce+5...scusate l'insistenza   smiley-roll-blue
Logged

Offline Offline
Sr. Member
****
Karma: 7
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
quindi dopo che sono trascorsi 5 millisecondi il valore time viene a prendere un valore maggiore della lettura_luce_time + 5 millisecondi entrando di fatto nel ciclo if.
non ho capito il perchè,  smiley-red scusa son di coccio....
se time= millis() e lettura_luce= millis() e quindi se millis= 3 come è possibile che time è maggiore di lettura_luce+5...scusate l'insistenza   smiley-roll-blue
perchè time corre dietro a millis ogni ciclo che fai, perchè letturaluce rimane "indietro" e perchè millis aumenta ogni millisecondo inesorabilmente... per fartela semplice succede che all'interno di arduino (ma anche di tanti altri processori...) c'è un timer che ogni tot alza un cosidetto interrupt. Quando scatta questo "allarme" il processore smette per un attimo di fare il ciclo loop che hai scritto tu ed esegue la procedura di interrupt che nel caso specifico aggiorna il millis... tu non hai fatto l'istruzione di aggiornamento del millis ma il processore sa che deve farla e la fa cascasse il mondo senza dirti nulla. quindi dopo un millisecondo che tu stai facendo tranquillo il tuo ciclo loop il millis viene incrementato e quindi quando tu fai l'istruzione time = millis lui si ritrova con il time più grande di 1 mentre il letturaluce rimane da aggiornare...dopo 5 millisecondi il time diventa più grande del letturaluce e viene eseguito l'if
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma questo intendi perchè time è stato inserito nel ciclo di loop e quindi si aggiorna ogni ciclo di loop e letturaluce è inserito nel setup e quindi è stato letto solo all'inizio che vale 0?
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2757
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
quindi se millis= 3 come è
Millis() non può essere 3 se dopo un secondo che resetti arduino vale 1000, dopo 1 minuto vale 60000 , fino ad arrivare a 41,xx giorni

Millis è un contatore che parte dal reset e arriva a 42 giorni per andare in overflow e ripartire quindi da 0
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se poi fosse così dovrei aspettare 6 ms quindi non 5 ms per diventare vera l'espressione time maggiore letturaluce+ 5 perche se time diventa 5 e letturaluce ancora è 0 se aggiungo 5 ò'espressione dovrebbe essere maggiore e uguale o sbaglio?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Millis() non può essere 3 se dopo un secondo che resetti arduino vale 1000
ok diciamo 3000.. comunque sia il fatto che rimane indietro letturaluce è perchè fuori dal ciclo di loop (quindi solo nel setup?) e non viene aggiornato
Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5610
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il setup non entra in gioco dopo il primo avvio, il fatto che resta dietro e' perche' e' presente nell'IF, quindi viene aggiornata solo durante l'eseczione dell'IF

Code:
letturaluce_time=millis();
dopo quest'aggiornameto il loop prosegue, quindi esce dall'IF, e non vi rientrera' dopo uno, nemmeno dopo due, nemmeno dopo 3ms, ecc
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, ci sono... per concludere comunque diciamo però che entra nell' if al 6 ms perchè non è possibile che time (5) >letturaluce(0)+5 non dovrebbe essere  => ?
Grazie ancora per la disponibilità a tutti..
Logged

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

@alphagamma:
a me nel codice che hai pubblicato pare che manchi un pezzo di programma, se così non fosse sarebbe un codice scritto male perché inizializza delle variabili che non vengono usate. Quindi se c'è dell'altro, c'è una logica alla base che forse a te sfugge.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si scusate ragazzi...
Code:
void setup(){
time=millis();
letturaluce_time=mills();
servotime=millis();
  letturadati=millis();
}

void loop(){
time=millis();

if(time>letturaluce_time+5){
luce1=analogRead(SENSORELUCE1);
letturaluce_time=millis();
}

if(time>servotime1+15){
 servo1.write(posservo1);
 servotime1=millis();
}

if(time>letturadati+3000){
Serial.print("Sensore 1 : ");
Serial.print(letturaluce1,DEC);
Serial.print("  Posizione motore 1 : ");
Serial.println(posservo1,DEC);
Serial.print("  Differenza : ");
Serial.println(letturaluce1-letturaluce2);
letturadati=millis();
}
}
Logged

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

Ora ha più senso.
Memorizza il valore di millis in modo da eseguire dei confronti validi per un determinato momento.
Se non facesse così, il tempo continuerebbe a scorrere e altererebbe i tempi dei controlli in fondo al loop.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie a tutti.... sperimenterò smiley
Logged

Pages: [1]   Go Up
Jump to: