Go Down

Topic: [Risolto]Multitasking con Arduino? (Read 2222 times) previous topic - next topic

hermit274

Dec 07, 2012, 10:00 am Last Edit: Dec 10, 2012, 10:01 am by hermit274 Reason: 1
Ciao a tutti ragazzi. Ho da poco compilato un codice per Arduino per poter controllare il motore di una caldaia a pellet.
Il codice che ho compilato, pur essendo abbastanza semplice, è molto lungo e contiene al suo interno molti if.
per farvi capire ha più o meno un aspetto del genere:

Code: [Select]

void loop(){
funzione di accensione bottone();

istruzione 1
istruzione 2
.
.
.
istruzione n

}


le istruzioni possono essere degli if oppure delle funzioni che mi sono creato io. Il mio problema è questo:
Se mi trovo in certe condizioni di temperatura che controllo con degli if nel void loop faccio accendere il motore per un tot secondi e poi lo faccio spegnere dai 4 ai 6 secondi. Il fatto è che se premo il pulsante per "spegnere" il ciclo, quindi interviene  funzione di accensione bottone() devo aspettare per forza la fine di quei 4-6 secondi. Come posso migliorare questa situazione? non è possibile creare una specie di multitasking?cioè quando premo il pulsante di spegnimento in qualsiasi momento del programma Arduino risponda con la funzione di spegnimento?

Grazie mille ragazzi!

leo72

Hai 2 strade:
1) usare la funzione millis() per gestire gli eventi in base al tempo, oppure
2) usare leOS/leOS2. Questi sono 2 scheduler che ho scritto qualche mese fa e che possono eseguire in background semplici compiti (come ad esempio l'attivazione di un pin) ad intervalli programmati.
Questa è la discussione in cui ho presentato il lavoro:
http://arduino.cc/forum/index.php/topic,111732.0.html
Qui trovi le librerie:
http://www.leonardomiliani.com/?p=516

hermit274

grazie per la risposta leo.
Avevo visto già questi tuoi due scheduler. In effetti sono molto comodi, il fatto è che non posso usarli perché purtroppo l'evento non è regolare, è regolato dalla temperatura.
Mi sa che a questo punto mi toccherebbe utilizzare la funzione millis(), che peccato però...la funzione delay è molto comoda!almeno non devo scrivere altri if...

Madwriter

guarda che con il leos puoi modificare dinamicamente la durata di un task  ;)
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

leo72


guarda che con il leos puoi modificare dinamicamente la durata di un task  ;)

Esatto.
Puoi mettere in pausa un task, riavviarlo a richiesta, farlo andare solo 1 volta (onetime task), cambiare l'intervallo in corso d'opera. E' molto aggiustabile alle proprie esigenze.

baciocco

Scusa ma non puoi attaccare quel pulsante ad un interrupt

hermit274

no non posso attaccarlo ad un itterrupt perchè per adesso ho preso in esempio il fatto di premere il bottone per accenderlo e spegnerlo, ma in sostanza riguarda tutta la funzionalità del programma, dall'aggiornamento sul monitor LCD della temperatura rilevata, alla comunicazione con la porta seriale ecc...per come l'ho compilato, queste istruzioni vengono eseguite dopo il tempo di delay...

hermit274

#7
Dec 08, 2012, 09:25 am Last Edit: Dec 08, 2012, 09:37 am by hermit274 Reason: 1
Allora, Leo72 ho provato la tua libreria leOS.h e devo dire che è davvero fenomenale!Complimentoni davvero!
Avevi ragione a quanto pare può essere un metodo per liberarmi delle attese nel loop. Ora il mio piccolo problema è questo (dovuto al fatto che devo ancora devo fare pratica con questa libreria).
Ho trovato in giro un tuo esempio dove facevi accedere il led per 1000ms e poi spento per altri 1000ms.

Come potrei fare a tenerlo acceso ad esempio per 100ms e poi spento per 5000ms? Sempre utilizzando leOS ovviamente...scusate l'ignoranza
e poi se durante l'esecuzione del programma dovessi cambiare l'intervallo di tempo in cui rimane spento? ad esempio da 5000ms a 8000 ms come dovrei fare? Ho letto sulla tua guida in pdf che hai implementato la funzione
Code: [Select]
myOS.modifyTask(yourFunction, newInterval [, newTaskStatus]);
ma vale anche per la libreria leOS? o solo per leOS2?

uwefed

Per principio e per la filosofia di un programma scritto bene, secondo me, non serve un multitasking per scrivere un programma del genere. Serve non usare delle funzioni che interrompono l'esecuzione del programma come per esempio delay().

Nel concreto leOS puó risolvere questo problema, ma é solo una cura contro gli effetti non la causa.

Ciao Uwe

tuxduino

Il concetti di base è la programmazione "a stati" anziché sequenziale.
Credo che leOS possa rendere l'implementazione più semplice rispetto alla tecnica "blink without delay" nuda e cruda (anche se in questo caso sarebbe più che sufficiente IMHO). Ma se non si acquisisce il concetto di "stato" la vedo dura...

leo72


Come potrei fare a tenerlo acceso ad esempio per 100ms e poi spento per 5000ms? Sempre utilizzando leOS ovviamente...scusate l'ignoranza
e poi se durante l'esecuzione del programma dovessi cambiare l'intervallo di tempo in cui rimane spento? ad esempio da 5000ms a 8000 ms come dovrei fare?



Il concetti di base è la programmazione "a stati" anziché sequenziale.
Credo che leOS possa rendere l'implementazione più semplice rispetto alla tecnica "blink without delay" nuda e cruda (anche se in questo caso sarebbe più che sufficiente IMHO). Ma se non si acquisisce il concetto di "stato" la vedo dura...


Sì, devi lavorare a "stati". Cioè fissare uno "stato led", che poi modifichi tramite software.
Posso darti un suggerimento. Usa un task non solo per cambiare lo stato del led ad intervalli regolari (altrimenti viene un'onda quadra con d.c. al 50%,) ma con delle variabili controllare quanto il led deve stare acceso e quanto spento.

Quote

Ho letto sulla tua guida in pdf che hai implementato la funzione
Code: [Select]
myOS.modifyTask(yourFunction, newInterval [, newTaskStatus]);
ma vale anche per la libreria leOS? o solo per leOS2?

Le funzioni delle 2 versioni sono identiche, cambia solo il minimo intervallo selezionabile. Nel leOS questo è 1 ms, nel leOS2 questo è pari a 16 ms, il minimo intervallo selezionabile per il contatore del Watchdog.
Quindi se vuoi eseguire qualcosa ogni 2 ms il leOS2 non va bene. Per contro, il leOS entra in conflitto con tutto quello che usa il timer 2 mentre il leOS2 no. Devi vedere quale fa al caso tuo. A meno di usi con cose particolari (vedi ad esempio la Tone o altro) che fanno uso di quel timer, la leOS è da preferire. La leOS2 è ancora in beta (ho una cosa da sistemare che non mi torna del tutto).

MauroTec

#11
Dec 08, 2012, 06:39 pm Last Edit: Dec 08, 2012, 06:42 pm by MauroTec Reason: 1
Per Multitasking c'è questo microcontroller che costa davvero poco e li hai almeno 8 core a disposizione.
http://www.xmos.com/discover/why/how

Certo che ci sarebbe da farne una simil arduino a 500MHZ se si considera che costa meno del 328, purtroppo gcc non produce codice per questa architettura.

Ciao.

http://www.digikey.com/product-detail/en/XCARD%20XK-1A/XCARD%20XK-1A-ND/2183685?cur=USD

Solo 59 dollari? ci vedo male io? dovè la fregatura?


AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

tuxduino


leo72


Per Multitasking c'è questo microcontroller che costa davvero poco e li hai almeno 8 core a disposizione.
http://www.xmos.com/discover/why/how

Certo che ci sarebbe da farne una simil arduino a 500MHZ se si considera che costa meno del 328, purtroppo gcc non produce codice per questa architettura.

Ciao.

http://www.digikey.com/product-detail/en/XCARD%20XK-1A/XCARD%20XK-1A-ND/2183685?cur=USD

Solo 59 dollari? ci vedo male io? dovè la fregatura?




Bello!  :D

uwefed


Solo 59 dollari? ci vedo male io? dovè la fregatura?

Che non é cosí semplice a programmarlo come Arduino.  ;) ;) ;)
Ciao Uwe

Go Up