4 * Utilizzo di un interrupt ala Arduino per intercettare
5 * la pressione di un bottone.
7 * Doppia ISR: la prima ISR intercetta FALLING
8 * e riconfigura l'interrupt con RISING a una seconda
9 * ISR che a sua volta ripristina il comportamento
12 In questa versione le ISRs modificano una variabile state
13 corrispondente allo stato del bottone, impostato nel loop.
16 const byte ledPin = 13;
17 const byte interruptPin = 2; // Arduino 328 / 168
18 volatile boolean state = 0 ; // volatile evita che la variabile possa
19 // avere valori diversi in SRAM e in un registro,
20 // evita che il compilatore in fase di ottimizzazioe la consideri
21 // come const nel loop()
25 pinMode(ledPin, OUTPUT);
26 pinMode(interruptPin, INPUT_PULLUP); // Vedi: digitalPinToInterrupt()
27 attachInterrupt(0, eventoFall, FALLING);
28 // Partiamo intercettanto un interrupt FALLING
33 digitalWrite(ledPin, state);
34 // La variabile state viene richiamata fuori dalla ISR
35 // quindi deve essere dichiarata volatile
36 // altrimenti il compilatore potrebbe decidere di trattarlo come constante
37 // in fase di ottimizzazione
38 // oppure si potrebbe creare un dualismo tra il valore di questa
39 // storato in SRAM o in un registro
42 void eventoFall() // Sempre VOID
45 attachInterrupt(0, eventoRise, RISING);
48 void eventoRise() // Sempre VOID
51 attachInterrupt(0, eventoFall, FALLING);