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à..
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
alphagamma:
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à..
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.
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
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
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?
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?
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
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
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..
@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.
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.