funzioni in parallelo

ciao a tutti :slight_smile:
scusate ma ricordo di averlo letto, ma non riesco più a trovare una cosa.
come far partire una funzione e mentre la prima fa alcune cose per esempio per 10 secondi ne faccio partire un' altra?
quindi:
tempo -->---------------------------
f1 |-----------------|
f2 |--------------|

grazie

ciao, non è possibile che girino contemporaneamente, quello che puoi fare è
tempo -->---------------------------
f1 |-----/pausa/pausa/------------|
f2 |--------------|

Penso che avresti bisogno di una sistema multiprocessore.....

esisterebbe un sistema si basa sulla funzione millis() dell'arduino, se cerchi arduino multitasking trovi qualcosa... ma dicci con precisione cosa devi fare: se è per accendere 2 relè dai l'impulso di accenderne uno, metti un delay e accendi l'altro, poi altro delay e spegni il secondo altro delay e spegni il primo

allora
ho collegato alcuni shiftregister (sh) e alcuni tlc5940 (tl) per animare dei led.(accendere in sequenze).
forse ho una visione troppo orientata agli oggetti e quindi per ciclare loop per ogni ic folevo fare con cicli separati , forse li devo unire e fare un po' tutto 'a mano'. :o

mentre gli shift register mandano a tempi casuali un 'animazione tipo scia , i tlc mandano effetti di fading o rimangono accesi. il tutto intersecandosi nel tempo.

a mano sarebbe

loop(){

imposta_shiftregisterS ( valore_nuovo_sh )
imposta_tlcS (valore_nuovo_tlc)
imposta_shiftregisterS ( valore_nuovo_sh )
delay(1000) // lo faccio per il tlc 
imposta_tlcS (valore_nuovo_tlc)
[TEMPO SBAGLIATO] imposta_shiftregisterS ( valore_nuovo_sh ) // qui mi ha fatto aspettare troppo per il tempo suo
imposta_tlcS (valore_nuovo_tlc)
...

}

ma le due funzioni le vorrei indipendenti dato che gli sh comandano led [ che sono indipendenti dagli altri sui tlc (cioè con ritmi diversi)] e dei chip audio . e i tlc comandano led che fanno delle cose a intervalli regolari e precisi.

esisterebbe un sistema si basa sulla funzione millis() dell'arduino, se cerchi arduino multitasking trovi qualcosa... ma dicci con precisione cosa devi fare: se è per accendere 2 relè dai l'impulso di accenderne uno, metti un delay e accendi l'altro, poi altro delay e spegni il secondo altro delay e spegni il primo

Quello di cui parli è finto parallelismo, basato sul fatto che se esegui le due funzioni smontandole a blocchi da eseguire abbastanza velocemente SEMBRANO eseguite in parallelo... Ed ecco il parallelismo pre multi-core e multi-processore (leggi fino al pentium4 per gli utenti normali).
Il finto parallelismo funziona come descritto da frog

stefanosky Il vero segreto per quello che vuoi fare è NON usare funzioni dette bloccanti come il delay(che impallano il codice per X milli/micro secondi) ma usare funzioni non bloccanti tipo micro() o millis().
esempio:

/*accendo/spengo un led per 1000 millisecondi e poi lo spengo, nel frattempo continuo a leggere dati dal pin analogico 1--codice scritto al volo, non testato nè ricontrollato*/
long lastReadMillis = millis();
int ledAcceso=0;
void loop(){
if (lastReadMillis+1000<millis(){
   if (ledAcceso){
     spegniLed();
     ledAcceso=0;
   }else{
     accendiLed();
     ledAcceso=1;
   }
   lastReadMillis=millis();
}
int valoreAnalogico=analogRead(1);
}

ciao
mmm credo di aver capito l'idea. grazie lesto
più tardi provo a mettere su una linea del tempo.

quindi il tempo lo dovrei gestire tutto nell'if con millis?

quindi il tempo lo dovrei gestire tutto nell'if con millis?

si. delay funziona così (poi non so se il codice è giusto)

long inizio = millis();
while(inizio+delay<millis){}

se tu al posto del while metti l'if, e rendi inizio una variabile globale in modo da sopravvivere alla "morte & rinascita" della funzione loop, il while viene sostituito dal loop(), ma tu puoi continuare a eseguire il tuo codice come se nulla fosse
cmq se programmi ad oggetti potresti usare il c++, magari ti viene più facile

Vi ringrazio tantissimo per aver avviato questa discussione,
stavo giusto tentando di eseguire 4 funzioni (cicliche) in contemporanea, al fine di controllare altrettandi motori passo passo per una mini-fresa cnc che stò costruendo.
Volendo evitare di aquistare quattro Arduini+schede motori passo passo stò scrivendo il codice per poter eseguire il tutto con un solo Arduino mega.
Mi ero appunto "impallato" sul controllo contemporaneo dei quattro assi, quando ho trovato questa discussione.
C'è magari qualcuno che ha precedentemente tentato di risolvere un problema simile con i motori passo passo e che può aiutarmi in qualche modo sull'esecuzione contemporanea dei quattro cicli?
Grazie, Eureka

ciao Eureka
perché non guardi progetti simili tipo
http://www.makerbot.com/ oppure
http://diylilcnc.org/ oppure
http://www.contraptor.org/
In tutti questi esempi usano 3 assi pilotati da motori passo passo.
Ciao Uwe

ok
ho trovato anche questa guida nel forum http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1265304289
che mi ha fatto continuare il mio ragionamento.
ora nel mio progetto sto usando il millis cosi

int inizio1 = 1000;
int passo1 = 2000;
setup(){
tempo = millis();
tempoFunzione=millis()
}
loop(){
// riprendo il tempo
tempo = millis();
// controllo per l'inizio
if(tempo>tempoFunzione+inizio1){
lanciaFunzione();
// controllo per l'azzeramento del tempoFunzione
if(tempo>(tempoFunzione+inizio1+passo1)){
tempoFunzione=millis();
}
}
}

spero di essere stato utile per qualcun'altro
o se avete migliorie da consigliare
ciao

dunque, se non erro succede questo:
per 1000 millis non fai nulla, poi per 2000 continui a lanciare la funzione (una volta ogni loop), e poi ritorni al principio a far niente per 1000... esatto?

ciao, si esatto, per aver ragionato alle 2 di notte complimenti :slight_smile:

la notte porta consiglio :slight_smile:
io preferisco scrivere codice la notte, c'è più silenzio per concentrarsi e praticamente nessuna distrazione. In quei momenti di ispirazione ti accorgi che le dita son troppo lente :smiley: