Scusate ho un dubbio, se si usa millis() per gestire una pausa, la durata effettiva della pausa non è in qualche modo influenzata dalla lunghezza del programma?
Luke677099:
Scusate ho un dubbio, se si usa millis() per gestire una pausa, la durata effettiva della pausa non è in qualche modo influenzata dalla lunghezza del programma?
NI ...
... ovvero, tipicamente si schedulano gli eventi con una struttura simile a:
if ( millis() - lastMillis >= tempoPerido ) { ... }
... e chiaro che se quello che segue lo statement if fa si che si ritorni su quella riga dopo un tempo maggiore del tempoPeriodo ... allora è ovvio che il tutto viene influenzato.
In tali casi è d'obbligo l'uso di un RTOS di tipo preemptive che, con tecniche di time-sharing e priorità, risove il problema, ma ... sono casi che vanno un po' oltre le problematiche di un "normale amatore" che sviluppa su Arduino.
Guglielmo
gpb01:
NI ...
...
Scusa, leggevo un po di tempo fa che all'interno delle ISR, millis NON viene incrementato ... per cui anche se lo sketch usasse molte ISR, specie se mal realizzate o troppo lunghe, questo potrebbe influenzare il calcolo dei tempi basato su millis ... e' corretto come ragionamento ?
Etemenanki:
Scusa, leggevo un po di tempo fa che all'interno delle ISR, millis NON viene incrementato ... per cui anche se lo sketch usasse molte ISR, specie se mal realizzate o troppo lunghe, questo potrebbe influenzare il calcolo dei tempi basato su millis ... e' corretto come ragionamento ?
Corretto ...
... del resto basta anche che fai una "noInterrupt()" (arduino) o una cli() (avr-libc) e ... fermi millis() dato che gli interrupt generati da timer0 per farlo avanzare ... non sono più eseguiti.
Guglielmo
Franchelli:
int led =13;
void pausa();
void setup(){
pinMode(led, OUTPUT);
}
void loop(){
digitalWrite(led, HIGH);
pausa();
digitalWrite(led, LOW);
pausa();
}
void pausa(){
long x =0;
long interval = 3000;
while(x < interval){ // tempo di ritardo
x = x++;
}
}
ma non funziona, led si accende ma non si spegne più. Idee? Scusate ma sono alle prime armi...
non è che non funziona
ia parte il fatto che funziona come il delay cioè sospende l’esecuzione del programma per il tempo stabilito dentro a pausa e quindi a questo punto usa pure delay()
il tuo problema è che 3000 cicli sono un tempo piccolissimo quindi non ti accorgi del passaggio tra stato on e stato off il conteggio dura circa 187 microsecondi…
cominci ad accorgerti di qualche cosa mettendo un numero mooolto più grande prova con 9.000.000
Senza contare che x = x++ è undefined behavior...
SukkoPera:
Senza contare che x = x++ è undefined behavior...
non ci avevo fatto caso
è vero o scrivi
x=x+1
o scrivi
x++
O anche:
x += 1;
Franchelli dovrebbe chiarire perché gli serve qualcosa di diverso da delay, perché la funzione di ritardo che ha scritto è solo una delay meno precisa scritta in modo diverso, che potrebbe dargli gli stessi problemi della delay originale.
E a proposito, l’overflow di millis non causa alcun problema se si fa il calcolo indicato da Guglielmo, a meno di non voler misurare tempi maggiori di 232 millisecondi.
Ma a parte il fatto che l'overflow sia un falso problema (basta leggere BENE i link che Guglielmo posta SEMPRE quando si parla di millis() e si vede come risolverlo) delay() è una funzione contenuta in una delle librerie base di Arduino, tale funzione prima di essere scritta sarà stata testata, e avrà passato anche questo test. Dubitando di delay() non è come dubitare della digitalWrite() o della Serial.read()? Ne dubiteresti mai? E se ne dubiti come programmi?
Silente:
Ma a parte il fatto che l'overflow sia un falso problema (basta leggere BENE i link che Guglielmo posta SEMPRE quando si parla di millis() e si vede come risolverlo) delay() è una funzione contenuta in una delle librerie base di Arduino, tale funzione prima di essere scritta sarà stata testata, e avrà passato anche questo test. Dubitando di delay() non è come dubitare della digitalWrite() o della Serial.read()? Ne dubiteresti mai? E se ne dubiti come programmi?
il delay, come pausa va benissimo, il problema, anche se è limitato e che se devo fare altri controlli in parallelo non li fa, es assurdo, se ho un delay a 10000 e devo controllare la pressione di un tasto ...non lo fa finche non finisce la pausa
per quello si controllano i millis...
Ciao.
Vi siete accorti che il post iniziale è datato 2014?
A quest'ora franchelli credo abbia risolto...
Grazie della segnalazione pippo72 … ma noi stavamo rispondendo a Luke677099 … che comunque, ha riaperto questo thread in violazione del REGOLAMENTO, punto 16.9 e, mea culpa, questa volta m’è sfuggito
Ora provvedo separandolo e creando un nuovo thread
Guglielmo
Edit: fatto, si può continuare in questo thread.
Ahhhhhh, gpb, inizi a perdere colpi!
SukkoPera:
Ahhhhhh, gpb, inizi a perdere colpi!
L'età che avanza ...
Guglielmo
gpb01:
L'età che avanza ...![]()
![]()
Guglielmo
Chiedo venia, Se ho scritto qui, e perchè "altrove" non ho trovato una risposta esaudiente,comunque non capitera piu, mi limitero solo a leggere....
Luke677099:
... mi limitero solo a leggere....
... il problema NON è scrivere qui o li, il problema è NON riaprire vecchi thread di oltre 9/12 mesi (REGOLAMENTO, punto 16.9).
Guglielmo
gpb01:
… il problema NON è scrivere qui o li, il problema è NON riaprire vecchi thread di oltre 9/12 mesi (REGOLAMENTO, punto 16.9).Guglielmo
scusa, e riscusa, non ho guardato la data…