Interrupt e molti bottoni

Ciao, volevo un chiarimento da qualcuno più esperto di me sugli interrupt

Ho già provato e capito l'esempio con attachInterrupt ma per usare interrupt su tutti i pin digitali si devono usare i registri direttamente

Ho letto alcune discussioni ma non sono riuscita a capire un minimo la sintassi che viene usata per riferirsi ai registri e quali sono quelli da usare Se qualcuno riesce a darmi qualche chiarimento anche a grandi linee credo possa essere d'aiuto a molti buttar giu due linne guida dato che l'argomento è complesso grazie

Perché Ti servono cosí tante entrate Interrupt? Pulsanti sono cosí lenti che basta leggerli con un semplice digitalRead(); anzi con un interrupt hai problemi del debounce che non é da risolvere facilmente via SW.

Ciao Uwe

Posso chederti che Arduino hai? Perchè con Arduino uno i pin dotati di interrupt sono solo due!(da quanto ne so io) :slight_smile:

mattelam: Posso chederti che Arduino hai? Perchè con Arduino uno i pin dotati di interrupt sono solo due!

No, tutti i pin sono dotati di interrupt on change, è wiring che non lo prevede a livello di codice, però ci sono e sono utilizzabili programmando direttamente i relativi registri macchina.

In particolare, sul 328, i registri:

  • PCICR (Pin Change Interrupt Control Register)
  • PCIFR (Pin Change Interrupt Flag Register)
  • PCMSK0 (Pin Change Mask Register 0)
  • PCMSK1 (Pin Change Mask Register 1)
  • PCMSK2 (Pin Change Mask Register 2)

Ora uso un arduino uno, dovendo gestire molti bottoni in ingresso fino anche ad una trentina mi sono orientata piu sull'uso degli interrupt che su molte digitalRead(), non ho provato ma ho letto che potrebbero esserci ritardi nella lettura dei bottoni.. pensate potrebbe essere così o si possono usare anche molte digitalread() in loop senza ritardi?

Risil ... stai parlando di BOTTONI ... oggetti fisici che, per quanto tu possa essere veloce a premere ... comunque impiegano "millisecondi" a stabilizzarsi ...

... hai idea un ATmega328P che gira a 16MHz quante volte riesce a leggere tutti i tuoi trenta bottoni in UN SOLO MILLESIMO di secondo ? :stuck_out_tongue_closed_eyes:

Guglielmo

P.S. : Considera poi che, invece di usare le classiche digitalRead(), potresti leggere direttamente i PINx e quindi con UNA SOLA istruzione avere lo stato di 8 bottoni collegati ad un port.

Se hai una trentina di pulsanti Ti conviene disporli in una matrice e leggerli ripetutamente.

Un pulsante non ha problemi di tempistiche. Anche se lo leggi solo 10 volte al secondo non perderai nessun azionamento.

Ciao Uwe

Oppure leggere tutto con un daisy chain di 4021: https://www.arduino.cc/en/Tutorial/ShiftIn o di 74HC165: http://playground.arduino.cc/Code/ShiftRegSN74HC165N

Ho provato la matrice come suggerito e va tutto bene, poi dato che potrei usare diversi potenziometri circolari mi sono chiesta quale modo per usare pochi analog input per più potenziometri, non ho trovato molto.. quale potrebbe essere un'idea per i collegamenti hardware?