Go Down

Topic: uscita immediata da un loop o un ciclo (Read 11062 times) previous topic - next topic

Madwriter

vuoi per caso dare anche una scossa elettrica al concorrente che sbaglia la domanda? :smiley-mr-green:
la fine di questo topic sarà tragica  :.
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

leo72


se arduino fosse multitasking non ci sarebbero problemi, ma dal momento che non lo è, come cappero posso fare???

facendo lavorare le meningi  ;)
http://www.arduino.cc/en/Tutorial/PlayMelody

Qui vedi, nel secondo sketch di esempio, che fanno un controllo su un ingresso analogico e modificano un parametro (il volume).
Basta che tu sostituisca quello alla lettura dei pulsanti digitali.

Maurotec

#32
Mar 22, 2013, 06:45 pm Last Edit: Mar 22, 2013, 10:39 pm by MauroTec Reason: 1
Come vedi leo ti ha dato il software completo a cui apportare solo qualche modifica, comunque ora che ho un po di tempo, spiego almeno la cosa imprensibile di prima.

Quando vogliamo processare un array siamo abituati ad usare un cicli while o for, ma è possibile anche creare un iteratore, una cosa simile a questo pseudo code:

foreach (note, notes) {
   processa note;
   grab key
   switch (key)
      case()
      .....
}

Tradotto, cicla per ogni "note" in "notes".

Se processa note è una funzione la possiamo dare in pasto a leOS, o qualcosa di simile magari creato apposta, in questo caso processa note, ritorna subito, perchè quello che fa è registrarsi nello scheduler, che suona note ogni millesimo di secondo, e abbiamo il tanto cercato multitasking.

Più semplicemente, invece per processare una array si può scrivere una funzione simile a questa:
Code: [Select]

int array[100];

void processData() // lavora con variabili globali
{
   static byte idx = 0;   // questa inizializzazione viene fatta a tempo di compilazione e quindi solo una volta
                                    // idx conserva il valore anche al termine della funzione.

   if (array[idx] == -1)   // se array[idx] contiene il valore sentinella -1 sono arrivato in coda all'array
       idx = 0;   // azzero il contatore statico così' alla prossima chiamata ricomincia tutto
   else {
       Serial.write(array[idx]);
        idx++;
    }
}


Ora se nel loop chiamo la funzione processaData(), processero tutti i dati nell'array uno per volta e ritorno al loop, per fare altro.
Quindi sto processando un array di 100 elementi ma tra un elemento e l'atro controllo la tastiera o altro, se il processamento di un solo
elemento prende un tempo troppo alto bisogna se possibile ridurre questo tempo ad una unità processabile a richiesta.

Ora è più comprensibile, no.

Ciao.

Su segnalazione di Janos, aggiunto l'incremento di idx.

Janos

Decisamente, non male come idea... Solo che ti sei dimenticato di incrementare idx...  ;)

leo72

Per il natale 2011 avevo fatto delle luci per il presepe con dei led RGB che simulavano alba-giorno-tramonto-notte oppure potevano fare altri tipi di fading e, premendo un pulsantino, si poteva far riprodurre una musichetta natalizia (Jingle Bells) mentre lo sketch continuava a fare il fading dei led. Non usavo scheduler (all'epoca non l'avevo ancora realizzato) ed alla fine era venuta una cosa un po' lunghetta.

Mi ricordo però che avevo adottato un semplice metodo. Avevo messo 2 array, uno con le note da suonare, ed uno con la durata delle stesse. Ogni ciclo, controllavo se la nota era finita e quindi se dovevo suonare la successiva, fino alla fine della melodia. Si trattava insomma di un po' di if e di while annidati.

Go Up