Funzione di ritardo senza delay

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 ... :smiley:
... 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. :wink:

Guglielmo

gpb01:
NI ... :smiley:
...

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 :slight_smile:
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 :smiley:

Senza contare che x = x++ è undefined behavior...

SukkoPera:
Senza contare che x = x++ è undefined behavior...

non ci avevo fatto caso :slight_smile:

è 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 :frowning:

Ora provvedo separandolo e creando un nuovo thread :smiley:

Guglielmo

Edit: fatto, si può continuare in questo thread.

Ahhhhhh, gpb, inizi a perdere colpi! :smiley:

SukkoPera:
Ahhhhhh, gpb, inizi a perdere colpi! :smiley:

L'età che avanza ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

gpb01:
L'età che avanza ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

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…