Offline
Jr. Member
Karma: 0
Posts: 99
|
 |
« on: June 14, 2012, 03:02:24 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16983
Don't know what I do
|
 |
« Reply #2 on: June 14, 2012, 03:06:50 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Catania
Offline
Sr. Member
Karma: 0
Posts: 346
|
 |
« Reply #3 on: June 14, 2012, 03:11:15 pm » |
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  )
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 389
Posts: 10555
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #4 on: June 14, 2012, 03:14:38 pm » |
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! 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16983
Don't know what I do
|
 |
« Reply #5 on: June 14, 2012, 03:17:12 pm » |
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.... 
|
|
|
|
|
Logged
|
|
|
|
|
Catania
Offline
Sr. Member
Karma: 0
Posts: 346
|
 |
« Reply #6 on: June 14, 2012, 03:22:26 pm » |
oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! smiley-grin Mike, ci penso 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.
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 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16983
Don't know what I do
|
 |
« Reply #7 on: June 14, 2012, 03:25:52 pm » |
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!  Se mi chiamano in causa, come posso non rispondere? 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16983
Don't know what I do
|
 |
« Reply #8 on: June 14, 2012, 03:27:24 pm » |
oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! smiley-grin Mike, ci penso io  Bravo bravo  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  [/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.
|
|
|
|
|
Logged
|
|
|
|
|
Catania
Offline
Sr. Member
Karma: 0
Posts: 346
|
 |
« Reply #9 on: June 14, 2012, 03:28:55 pm » |
Bene, detto questo...Mike stai pronto con la bottiglia 
|
|
|
|
|
Logged
|
|
|
|
|
Catania
Offline
Sr. Member
Karma: 0
Posts: 346
|
 |
« Reply #10 on: June 14, 2012, 03:31:03 pm » |
Già 10K!??? Beh, congratulazioni "Shannon member" 
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 389
Posts: 10555
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #11 on: June 14, 2012, 03:32:19 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
Catania
Offline
Sr. Member
Karma: 0
Posts: 346
|
 |
« Reply #12 on: June 14, 2012, 03:36:46 pm » |
Mike stai pronto con la bottiglia
Detto...fatto! 
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 389
Posts: 10555
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #13 on: June 14, 2012, 03:37:59 pm » |
Mike stai pronto con la bottiglia
Detto...fatto!  ti sembro il tipo che si tira indietro per una bottiglia di champagne? 
|
|
|
|
|
Logged
|
|
|
|
|
Catania
Offline
Sr. Member
Karma: 0
Posts: 346
|
 |
« Reply #14 on: June 14, 2012, 03:43:59 pm » |
ti sembro il tipo che si tira indietro per una bottiglia di champagne?  Me ne guarderei bene dal pensarlo.  Leo, nel frattempo sarà andato a festeggiare con gli amici 
|
|
|
|
|
Logged
|
|
|
|
|
|