]> 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
13 const byte ledPin = 13;
14 const byte interruptPin = 2; // Arduino 328 / 168
15 volatile boolean state = 0 ; // volatile evita che la variabile possa
16 // avere valori diversi in SRAM e in un registro,
17 // evita che il compilatore in fase di ottimizzazioe la consideri
18 // come const nel loop()
19
20 void setup()
21 {
22   pinMode(ledPin, OUTPUT);
23   pinMode(interruptPin, INPUT_PULLUP); // Vedi: digitalPinToInterrupt()
24   attachInterrupt(0, eventoFall, FALLING);
25   // Partiamo intercettanto un interrupt FALLING
26 }
27
28 void loop()
29 {
30   digitalWrite(ledPin, state);
31   // La variabile state viene richiamata fuori dalla ISR
32   // quindi deve essere dichiarata volatile
33 }
34
35 void eventoFall() // Sempre VOID
36 {
37 state = HIGH ;
38   attachInterrupt(0, eventoRise, RISING); 
39 }
40
41 void eventoRise() // Sempre VOID
42 {
43 state = LOW ;
44   attachInterrupt(0, eventoFall, FALLING); 
45 }