Go Down

Topic: chiarimenti sugli interrupt (Read 5067 times) previous topic - next topic

ƎR

#60
Apr 10, 2012, 07:12 pm Last Edit: Apr 10, 2012, 09:32 pm by er_like_no_other Reason: 1
no l'ho collegato il sensore :P se lo scollego non legge niente proprio niente...
ma sono l'unico che ha sti problemi?  :smiley-red:

i pin sono giusti perchè l'arduino fa qualcosa, ma lo fa in modo diverso rispetto a quello che fa con lo stesso programma con gli INT0 e INT1
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72


no l'ho collegato il sensore :P se lo scollego non legge niente proprio niente...
ma sono l'unico che ha sti problemi?  :smiley-red:

Non ti buttare giù, non sei l'unico. Però devi leggere il datasheet.


pag 113 di cosa? del datasheet del atmega2560?

No, del libro di cucina!  XD XD

Quote

io ho visto che sul reference dicevano che per il mega erano disponibili questi 4 INT in più ma non ho letto controindicazioni... boh adesso guardo un po' in giro... grazie comunque ;)

Non devi "guardare in giro", devi studiare il datasheet. Se su di esso ci sono decine di pagine sugli interrupt, forse vuol dire che non sono proprio argomenti da bar, giusto?  ;)

ƎR

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

ƎR

non ho più guardato gli interrupt sul mega, ho troppe cose da fare e poco tempo per fare tutto :(

comunque ho ancora un dubbio sugli interrupt: io devo leggere un sensore e per leggere questo sensore devo usare pulseIn, se io voglio che l'interrupt non mi interrompa la lettura del sensore lo disattivo prima di effetuare la lettura e lo riattivo quando l'ho finita, giusto? ma se c'è il cambio di stato durante la lettura del sensore e l'interrupt è disattivato, quando lo riattivo non legge che è cambiato lo stato, o si?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Spero di aver capito. Tu l'interrupt non lo usi per leggere il sensore ma per altre cose. Giusto? Però pulseIn usa delay, che a sua volta è basato sul timer 0, che a sua volta usa un interrupt per gestire l'incremento del contatore su cui si basa delay. Se blocchi genericamente gli interrupt con un noInterrupts() (che equivale a sei() ), blocchi tutto e non esci più da pulseIn. Devi bloccare selettivamente solo l'interrupt che non deve disturbarti.

ƎR

mmmm no il problema non è pulseIn.... il problema è che se disattivo l'interrupt durante pulseIn e dopo quando pulseIn è finito lo riattivo, mi perdo eventuali cambi di stato sull'interrupt e quando riattivo l'interrupt non sa cosa è successo durante la pausa... o sbaglio?
grazie
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

nono, se disattivi gli interrupt NON esci più da pulseIN..

comunque sì, se disattivi gli interrupt, tutti ciò che avrebbe provocato un interrupt viene perso.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR


nono, se disattivi gli interrupt NON esci più da pulseIN..

a questo non ci avevo pensato... grazie mille per avermelo detto! ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72



nono, se disattivi gli interrupt NON esci più da pulseIN..

a questo non ci avevo pensato... grazie mille per avermelo detto! ;)

Ma te l'ho detto io 2 post qui sopra....  :smiley-roll-blue:
E ti ho anche spiegato che se disattivi gli interrupt globalmente (con noInterrupts()) blocchi tutto, ma se hai un interrupt attivato da te (ad esempio un interrupt sul cambio di stato di un pin oppure su un timer differente rispetto al timer 0), puoi disattivare selettivamente solo quello agendo sul relativo bit del registro interessato.

ƎR

si lo so ma ci ho pensato dopo :smiley-sweat:

si, infatti, prima ci ho ripensato ed è tutto apposto devo solo trovare il modo di non perdere quello che succede durante il pulseIn
grazie per l'aiuto! ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

ƎR

dalla funzione di un interrupt posso fare una cosa tipo così?
Code: [Select]

void interrupt()
{
loop();
}

perchè vorrei che quando termina la funzione dell'interrupt il programma ripartisse dall'inizio...
grazie in anticipo ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Se lo fai ti frusto  ]:D

Puoi settare un flag all'interno della ISR e poi, nel codice, controllare se il flag è true. Se è vero dai un asm(jmp $0000) (equivale ad un reset)

lesto


dalla funzione di un interrupt posso fare una cosa tipo così?
Code: [Select]

void interrupt()
{
loop();
}

perchè vorrei che quando termina la funzione dell'interrupt il programma ripartisse dall'inizio...
grazie in anticipo ;)


se fai così fai eseguire un ciclo di loop ma mentre il micro è in stato interrupt. prendi fuoco. :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

ahaha :smiley-mr-green:
va beh dopo provo a richiamare il loop da un interrupt, vediamo cosa succede, per ora l'ho solo pensato :P


Puoi settare un flag all'interno della ISR e poi, nel codice, controllare se il flag è true. Se è vero dai un asm(jmp $0000) (equivale ad un reset)

in un linguaggio un po' più comune? cosa intendi per "flag all'interno della ISR"?
grazie ancora :)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Intendo una variabile globale.
La imposti a false all'inizio dello sketch. La ISR (Internet Service Routine, la routine che gestisce il segnale di interrupt) la imposta a true. Tu non devi far altro che dentro al tuo codice principale controllare se questo flag è stato messo a true.

Go Up