Pages: [1] 2   Go Down
Author Topic: [Risolto]Multitasking con Arduino?  (Read 1873 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 88
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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!
« Last Edit: December 10, 2012, 04:01:36 am by hermit274 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 23015
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 88
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Offline Offline
Edison Member
*
Karma: 28
Posts: 2031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

guarda che con il leos puoi modificare dinamicamente la durata di un task  smiley-wink
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 23015
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

guarda che con il leos puoi modificare dinamicamente la durata di un task  smiley-wink
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.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ma non puoi attaccare quel pulsante ad un interrupt
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 88
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 88
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
myOS.modifyTask(yourFunction, newInterval [, newTaskStatus]);
ma vale anche per la libreria leOS? o solo per leOS2?
« Last Edit: December 08, 2012, 03:37:37 am by hermit274 » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21887
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 23015
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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).
Logged


0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?


« Last Edit: December 08, 2012, 12:42:29 pm by MauroTec » Logged

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O_o
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 23015
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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!  smiley-grin
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21887
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Solo 59 dollari? ci vedo male io? dovè la fregatura?
Che non é cosí semplice a programmarlo come Arduino.  smiley-wink smiley-wink smiley-wink
Ciao Uwe
Logged

Pages: [1] 2   Go Up
Jump to: