ciclare in background

salve a tutti,

vorrei sapere se con Arduino esiste la possibilità, ad esempio, di continuare a far lampeggiare un led piuttosto che il backcolor di un display metre si esegue dell'altro codice.

grazie

Certo, a tal proposito questo link potrebbe esserti illuminante:

Ci sono 2 metodi.
Il primo è quello più semplice e prevede l'uso di schedulare delle azioni a determinati intervalli semplicemente usando la funzione millis(). Per comprendere meglio il concetto, esamina l'esempio BlinkWithoutDelay: lì trovi 1 azione schedulata ogni 1000 ms, il lampeggio di un led, ma il concetto si può estendere ed applicare ad altri dispositivi.

L'altro metodo, più complesso e che prevede una conoscenza maggiore del microcontrollore, prevede di creare o riusare un simil sistema operativo real timer (RTOS) a cui affidare dei compiti da eseguire ad intervalli programmati.

Un'altro metodo, meno complesso rispetto al RTOS, è quello di sfruttare gli interrupt di un timer interno per eseguire codice a intervalli regolari. Ad esempio potresti mettere la logica del programma dentro il loop() e inserire il lampeggio del led dentro una chiamata interrupt.

(Hey Leo...vedo che ci siamo quasi ;))

leo72:
Ci sono 2 metodi.
Il primo è quello più semplice e prevede l'uso di schedulare delle azioni a determinati intervalli semplicemente usando la funzione millis(). Per comprendere meglio il concetto, esamina l'esempio BlinkWithoutDelay: lì trovi 1 azione schedulata ogni 1000 ms, il lampeggio di un led, ma il concetto si può estendere ed applicare ad altri dispositivi.

L'altro metodo, più complesso e che prevede una conoscenza maggiore del microcontrollore, prevede di creare o riusare un simil sistema operativo real timer (RTOS) a cui affidare dei compiti da eseguire ad intervalli programmati.

oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! :smiley:

dalubar:
Un'altro metodo, meno complesso rispetto al RTOS, è quello di sfruttare gli interrupt di un timer interno per eseguire codice a intervalli regolari. Ad esempio potresti mettere la logica del programma dentro il loop() e inserire il lampeggio del led dentro una chiamata interrupt.

Volevo inserirlo anche io. Però è bene sempre specificare che le operazioni da inserire negli interrupt devono essere poco impegnative in termini di risorse altrimenti si rischia di bloccare eccessivamente l'esecuzione del programma principale, e che non richiedano l'intervento di funzioni esterne pilotate da altri interrupt: il caso più semplice è l'impossibilità all'interno di un interrupt di usare la millis, ad esempio, per via del fatto che tale funzione è agganciata ad un altro interrupt. E la chiamata ad un interrupt disattiva gli altri interrupt.

(Hey Leo...vedo che ci siamo quasi ;))

Uh oh.... :slight_smile:

oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! smiley-grin

Mike, ci penso io XD

Però è bene sempre specificare che le operazioni da inserire negli interrupt devono essere poco impegnative in termini di risorse altrimenti si rischia di bloccare eccessivamente l'esecuzione del programma principale, e che non richiedano l'intervento di funzioni esterne pilotate da altri interrupt: il caso più semplice è l'impossibilità all'interno di un interrupt di usare la millis, ad esempio, per via del fatto che tale funzione è agganciata ad un altro interrupt. E la chiamata ad un interrupt disattiva gli altri interrupt.

Infatti ho specificato che poteva usare una funzione molto semplice come il lampeggio che non è impegnativa in termini di risorse.
E' vero che non si può usare la millis() ma come abbiamo visto ormai la delayMicroseconds() è stata ampiamente "sdoganata" e ho notato che viene usata anche da sviluppatori "seri" dentro le interrupt services XD

Se mi chiamano in causa, come posso non rispondere? :stuck_out_tongue_closed_eyes:

dalubar:

oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! smiley-grin

Mike, ci penso io XD

Bravo bravo :wink:

Però è bene sempre specificare che le operazioni da inserire negli interrupt devono essere poco impegnative in termini di risorse altrimenti si rischia di bloccare eccessivamente l'esecuzione del programma principale, e che non richiedano l'intervento di funzioni esterne pilotate da altri interrupt: il caso più semplice è l'impossibilità all'interno di un interrupt di usare la millis, ad esempio, per via del fatto che tale funzione è agganciata ad un altro interrupt. E la chiamata ad un interrupt disattiva gli altri interrupt.

Infatti ho specificato che poteva usare una funzione molto semplice come il lampeggio che non è impegnativa in termini di risorse.
E' vero che non si può usare la millis() ma come abbiamo visto ormai la delayMicroseconds() è stata ampiamente "sdoganata" e ho notato che viene usata anche da sviluppatori "seri" dentro le interrupt services XD
[/quote]
Vero, però se uno non sa dei problemi di millis all'interno di interrupt immagino che non abbia le conoscenze per sapere che delayMicroseconds non è invece affetta da questo problema.

Bene, detto questo...Mike stai pronto con la bottiglia :smiley:

Già 10K!???
Beh, congratulazioni "Shannon member" :slight_smile:

AUGURI!!!

Mike stai pronto con la bottiglia

Detto...fatto! :smiley:

dalubar:

Mike stai pronto con la bottiglia

Detto...fatto! :smiley:

ti sembro il tipo che si tira indietro per una bottiglia di champagne? :grin:

Me ne guarderei bene dal pensarlo. :slight_smile:
Leo, nel frattempo sarà andato a festeggiare con gli amici XD

dalubar:

[quote author=Michele Menniti link=topic=110081.msg826618#msg826618 date=1339706279]
ti sembro il tipo che si tira indietro per una bottiglia di champagne? :grin:

Me ne guarderei bene dal pensarlo. :slight_smile:
Leo, nel frattempo sarà andato a festeggiare con gli amici XD
[/quote]
sarà crollato per lo stress :sweat_smile:

ehi, io ho passato quota 6000, si festeggia tutti stasera :smiley:

Non me ne ero neanche accorto perché i 10K li ho passati rispondendo in un altro thread XD XD XD

ehi, io ho passato quota 6000, si festeggia tutti stasera

Auguri anche a te, Mike... 6000 post sono anch'essi un traguardo di tutto rispetto. :wink:

dalubar:

ehi, io ho passato quota 6000, si festeggia tutti stasera

Auguri anche a te, Mike... 6000 post sono anch'essi un traguardo di tutto rispetto. :wink:

già 16000 minchiate in due sembrano un clock espresso in KHz :smiley:

SUPER ROTFL :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: