]> git.piffa.net Git - sketchbook_andrea/blob - advanced_projects/interrupts/interrupt_base_volatile/interrupt_base_volatile.ino
interrupts
[sketchbook_andrea] / advanced_projects / interrupts / interrupt_base_volatile / interrupt_base_volatile.ino
1 /*
2  * Interrupt doppia ISR
3  * 
4  * Utilizzo di un interrupt ala Arduino per intercettare
5  * la pressione di un bottone.
6  * 
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
10  * precedente.
11
12  In questa versione le ISRs modificano una variabile state
13  corrispondente allo stato del bottone, impostato nel loop.
14  */
15
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()
22
23 void setup()
24 {
25   pinMode(ledPin, OUTPUT);
26   pinMode(interruptPin, INPUT_PULLUP); // Vedi: digitalPinToInterrupt()
27   attachInterrupt(0, eventoFall, FALLING);
28   // Partiamo intercettanto un interrupt FALLING
29 }
30
31 void loop()
32 {
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
40 }
41
42 void eventoFall() // Sempre VOID
43 {
44 state = HIGH ;
45   attachInterrupt(0, eventoRise, RISING); 
46 }
47
48 void eventoRise() // Sempre VOID
49 {
50 state = LOW ;
51   attachInterrupt(0, eventoFall, FALLING); 
52 }