Offline
Newbie
Karma: 0
Posts: 15
|
 |
« on: December 12, 2012, 02:40:05 pm » |
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à.. 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
Sr. Member
Karma: 7
Posts: 293
|
 |
« Reply #1 on: December 12, 2012, 03:10:12 pm » |
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à.. 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
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #2 on: December 12, 2012, 03:41:34 pm » |
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è,  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 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 7
Posts: 293
|
 |
« Reply #3 on: December 12, 2012, 04:11:26 pm » |
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è,  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  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
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #4 on: December 12, 2012, 04:19:08 pm » |
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
Edison Member
Karma: 13
Posts: 2437
|
 |
« Reply #5 on: December 12, 2012, 04:24:10 pm » |
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
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #6 on: December 12, 2012, 04:25:36 pm » |
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
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #7 on: December 12, 2012, 04:29:23 pm » |
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
Online
Faraday Member
Karma: 17
Posts: 3909
Arduino rocks
|
 |
« Reply #8 on: December 12, 2012, 04:41:33 pm » |
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 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
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #9 on: December 12, 2012, 04:52:21 pm » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #10 on: December 12, 2012, 04:56:02 pm » |
@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
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #11 on: December 12, 2012, 05:01:33 pm » |
si scusate ragazzi... 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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #12 on: December 12, 2012, 05:06:18 pm » |
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
Newbie
Karma: 0
Posts: 15
|
 |
« Reply #13 on: December 13, 2012, 01:27:40 am » |
Ok grazie a tutti.... sperimenterò 
|
|
|
|
|
Logged
|
|
|
|
|
|