Go Down

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

Janos


ehm i delay NON bloccano gli interrupt, altrimentio non usciresti mai dalla delay visto che è basata su un interrupt del timer1 :)


Sono d'accordo con te, ma se lanci un delay(1000) e avviene un interrupt tu vai a eseguire l'interrupt. Il problema è che da interrupt non puoi fare niente perché una volta uscito torni a finire quanto ti resta del delay...

Diciamo che una soluzione intelligente, vista l'applicazione, sarebbe stata di lasciare i delay(50) e sostituire il delay(1000) con millis()...

lestofante

Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

matt-korban

cioè ma io posso scatenare un casino epocale per un quizzone di m____a?
quindi in parole povere mio caro lesto, quello che dovrei fare è???
usare gli interrupt oppure sostituire i delay con dei millis?

da quello che ho capito non basta sostituire le voci delay con millis, devo pure modificare il programma, giusto?

matt-korban

ma poi ragazzi il delay 1000 non mi da nessun fastidio in quanto tiene il led acceso per un secondo dopo la sirena, e questo mi sta bene... quello che blocca il programma è l'esecuzione della canzoncina prima che venga premuto il pulsante... una volta premuto il pulsante infatti, la canzoncina si ferma e parte una "sirena" che dura qualcosa come un secondo, e si accende un led...

Janos

Mi sono preso la briga di prendere il tuo codice e modificarlo, ti ho dato tutti i link per documentarti, che vuoi di più?

matt-korban

un lucano! hahahaha ma si, ho caricato il tuo codice, ma non esce comunque dalla canzoncina quando premo il pulsante... magari riprovo un altro po e provo a smanettarci su, vediamo che succede...

matt-korban

@janos
sto sistemando il tuo codice sull'ide e sembra tutto ok, però quando vado a caricare mi da questo errore:

could not convert 'digitalWrite(((uint8_t)ledRosso), 1u)' to 'bool'

su questa riga:
Code: [Select]

else (!digitalWrite(ledRosso, HIGH)) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto


qualche idea?

lestofante

digitalòWrite ritorna HIGH o LOW (int), non true/false (boolean), janos ha confuso questo particolare.

Sistema l'if di conseguenza.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

No, l'errore non è li. La condizione dell'if può essere applicata anche ai numeri (in questo caso un int) e viene considerato falso lo zero e vero un qualsiasi numero diverso da zero. Il problema è che mi sono confuso, prova a sostiruire la riga con questo:

Code: [Select]
else (!statoRosso) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto

matt-korban

hahahaha sembra la storia infinita... mi da un altro errore...

expected ';' before 'fineCiclo'

comunque ho provato a risolvere cambiando l'else con else if, oppure modificando la punteggiatura e carica bene... il problema però rimane sempre... mentre suona non legge il pulsante... devo tenerlo premuto per farglielo leggere alla fine della musichetta...

Janos

Allora, vediamo un attimo di fare il punto perché probabilente non ho capito bene cose deve fare... Me lo spieghi nel dettaglio?

Maurotec

Non vorrei risultare noiso o di difficile comprensione.

Code: [Select]

int melody[] = {
 NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

Se ci fosse un nota END_NOTE, si potrebbe usare un while, anzi meglio una funzione con indice static.
Invece dell'array si può usare una array di struct, dove struct note contiene i campi, "note", "durata" e "pausa"

Ora una funzione processa solo una nota ed esce, grazie ad una variabile indice static, posso chiamare un numero di volte infinito questa funzione, e ad ogni chiamata l'indice viene incrementato, quando leggendo struct note trovo che "note" è uguale a 255 (cioè END_NOTE), azzero il contatore static index e alla prossima chiamata si ricomincia da dove si era interrotto.

La funzione viene processata nel loop e ritorna dopo aver suonato una nota la durata e la pausa, ma se dentro la funzione controllo una variabile di stato ricavata con la gestione dei PIN_CHANGED, posso bloccare il codice. Se il tempo per processare una nota la durata e la pausa non è molto alto
posso gestire il pulsante in pooling.

Mi rendo conto, sono poco comprensibile, ma è una buona soluzione.

Ciao.

Janos

#27
Mar 22, 2013, 01:14 pm Last Edit: Mar 22, 2013, 01:17 pm by Janos Reason: 1
Taparia tapioco come fosse antani a destra, che ne dici?  :smiley-yell: :smiley-yell: :smiley-yell:

http://www.youtube.com/watch?v=JU-QZ7yoyd4

lestofante


No, l'errore non è li. La condizione dell'if può essere applicata anche ai numeri (in questo caso un int) e viene considerato falso lo zero e vero un qualsiasi numero diverso da zero. Il problema è che mi sono confuso, prova a sostiruire la riga con questo:

Code: [Select]
else (!statoRosso) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto


hai ragione, dal "wiring.h"

Code: [Select]
#define HIGH 0x1
#define LOW  0x0
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

matt-korban

aaaaaaaaallora... sto costruendo un quizzone... praticamente squadra rossa e squadra blu si contenderanno la vittoria a suon di risposte giuste o sbagliate... ho 2 pulsanti, uno rosso ed uno blu, 2 led uno rosso ed uno blu, e una sirena (semplice altoparlante)...
deve funzionare in questa maniera:

appena viene fatta la domanda dal "conduttore" 2 rispettivi membri delle squadre si alzeranno e andranno al pulsante correndo... il primo che lo preme deve rispondere... in base alla risposta aggiudica il punto alla squadra...

quindi, nel mio programma fino a quì non c'è niente di complesso; ho solo 2 pulsanti con 2 led ed una sirena... se viene premuto il pulsante rosso si accende il led rosso e suona la sirena, idem per il blu, cambia solo il led che si accende (blu al posto del rosso)...

per fare il tutto più carino però, volevo che il mio quizzone, riproducesse una musica in loop mentre il conduttore fa la domanda, fino a quando non viene premuto uno dei 2 pulsanti... ecco perchè alla pressione del pulsante IMMEDIATAMENTE deve smettere la musica, suonare la sirena e accendere il rispettivo led di squadra... se arduino fosse multitasking non ci sarebbero problemi, ma dal momento che non lo è, come cappero posso fare???

Go Up