+++ /dev/null
-// sketch 03_01_interrupts
-
-int ledPin = 13;
-
-void setup()
-{
- pinMode(ledPin, OUTPUT);
- attachInterrupt(0, eventoAttivo, RISING); // 0 e' l'interrupt numero 0
- // connesso al PIN D2, l'interrupt 1 e' connesso al PIN D3
- // eventoAttivo : nome della funzione da richiamare
- // per un ISRs e' sempre VOID
- // LOW | RISING | FALLIN | CHANGE | HIGH
-}
-
-void loop()
-{
- // Varie altre cose che da cui non dipende la gestione dell'interrupt
- delay(5000);
- digitalWrite(ledPin,LOW);
-}
-
-void eventoAttivo() // Sempre VOID
-{
- digitalWrite(ledPin, HIGH);
-}
--- /dev/null
+/*
+ * Interrupt base
+ *
+ * Utilizzo di un interrupt ala Arduino per intercettare
+ * la pressione di un bottone.
+ *
+ */
+
+int ledPin = 13;
+
+void setup()
+{
+ pinMode(ledPin, OUTPUT);
+ attachInterrupt(0, eventoAttivo, RISING); // 0 e' l'interrupt numero 0
+ // connesso al PIN D2, l'interrupt 1 e' connesso al PIN D3
+ // eventoAttivo : nome della funzione da richiamare
+ // per un ISRs e' sempre VOID
+ // LOW | RISING | FALLIN | CHANGE | HIGH
+}
+
+void loop()
+{
+ // Varie altre cose che da cui non dipende la gestione dell'interrupt
+ delay(5000);
+ digitalWrite(ledPin,LOW);
+}
+
+void eventoAttivo() // Sempre VOID
+{
+ digitalWrite(ledPin, HIGH);
+}
--- /dev/null
+/*
+ Interrupts : input deboounce
+
+ Utilizzare un interrupt per intercettare
+ l'input di un interruttore momentaneo.
+
+ Debounce software nella funzione richiamata.
+ Per debounce hardware: http://www.all-electric.com/schematic/debounce.htm
+
+ */
+
+int ledPin = 13;
+volatile int state = LOW;
+
+void setup()
+{
+ pinMode(ledPin, OUTPUT);
+ pinMode(2, INPUT_PULLUP);
+ attachInterrupt(0, blink, FALLING);
+}
+
+void loop()
+{
+ //digitalWrite(ledPin, state);
+ delay(10000); // Mette in pausa Arduino per 10sec
+}
+
+// Funzioni
+void blink()
+// Modifica dello stato del LED
+{
+ static unsigned long last_interrupt_time = 0;
+ // This is not supposed to be global
+ // as it's olny accesed inside this ISR
+
+ // If interrupts come faster than 20ms, assume it's a bounce and ignore
+ if (millis() - last_interrupt_time > 20)
+ { // Azione da intraprendere
+ state = !state;
+ digitalWrite(ledPin, state);
+ last_interrupt_time = millis();
+ }
+}
+
--- /dev/null
+/*
+ * Interrupt doppia ISR
+ *
+ * Utilizzo di un interrupt ala Arduino per intercettare
+ * la pressione di un bottone.
+ *
+ * Doppia ISR: la prima ISR intercetta FALLING
+ * e riconfigura l'interrupt con RISING a una seconda
+ * ISR che a sua volta ripristina il comportamento
+ * precedente.
+ */
+
+int ledPin = 13;
+
+void setup()
+{
+ pinMode(ledPin, OUTPUT);
+ pinMode(2, INPUT_PULLUP);
+ attachInterrupt(0, eventoFall, FALLING);
+ // Partiamo intercettanto un interrupt FALLING
+}
+
+void loop()
+{
+// Tutto avviene nelle ISRs
+}
+
+void eventoFall() // Sempre VOID
+{
+ digitalWrite(ledPin, HIGH);
+ attachInterrupt(0, eventoRise, RISING);
+}
+
+void eventoRise() // Sempre VOID
+{
+ digitalWrite(ledPin, LOW);
+ attachInterrupt(0, eventoFall, FALLING);
+}
--- /dev/null
+/*
+ * Interrupt doppia ISR
+ *
+ * Utilizzo di un interrupt ala Arduino per intercettare
+ * la pressione di un bottone.
+ *
+ * Doppia ISR: la prima ISR intercetta FALLING
+ * e riconfigura l'interrupt con RISING a una seconda
+ * ISR che a sua volta ripristina il comportamento
+ * precedente.
+ */
+
+const byte ledPin = 13;
+const byte interruptPin = 2; // Arduino 328 / 168
+volatile boolean state = 0 ; // volatile evita che la variabile possa
+// avere valori diversi in SRAM e in un registro,
+// evita che il compilatore in fase di ottimizzazioe la consideri
+// come const nel loop()
+
+void setup()
+{
+ pinMode(ledPin, OUTPUT);
+ pinMode(interruptPin, INPUT_PULLUP); // Vedi: digitalPinToInterrupt()
+ attachInterrupt(0, eventoFall, FALLING);
+ // Partiamo intercettanto un interrupt FALLING
+}
+
+void loop()
+{
+ digitalWrite(ledPin, state);
+ // La variabile state viene richiamata fuori dalla ISR
+ // quindi deve essere dichiarata volatile
+}
+
+void eventoFall() // Sempre VOID
+{
+state = HIGH ;
+ attachInterrupt(0, eventoRise, RISING);
+}
+
+void eventoRise() // Sempre VOID
+{
+state = LOW ;
+ attachInterrupt(0, eventoFall, FALLING);
+}
+++ /dev/null
-/*
- Interrupts : input
-
- Utilizzare un interrupt per intercettare
- l'input di un interruttore momentaneo
-
- */
-
-int ledPin = 13;
-volatile int state = LOW;
-
-void setup()
-{
- pinMode(ledPin, OUTPUT);
- pinMode(2, INPUT_PULLUP);
- attachInterrupt(0, blink, FALLING);
-}
-
-void loop()
-{
- //digitalWrite(ledPin, state);
- delay(10000); // Mette in pausa Arduino per 10sec
-}
-
-// Funzioni
-void blink()
-// Modifica dello stato del LED
-{
- state = !state;
- digitalWrite(ledPin, state);
-}
+++ /dev/null
-/*
- Interrupts : input deboounce
-
- Utilizzare un interrupt per intercettare
- l'input di un interruttore momentaneo.
-
- Debounce software nella funzione richiamata.
- Per debounce hardware: http://www.all-electric.com/schematic/debounce.htm
-
- */
-
-int ledPin = 13;
-volatile int state = LOW;
-
-void setup()
-{
- pinMode(ledPin, OUTPUT);
- pinMode(2, INPUT_PULLUP);
- attachInterrupt(0, blink, FALLING);
-}
-
-void loop()
-{
- //digitalWrite(ledPin, state);
- delay(10000); // Mette in pausa Arduino per 10sec
-}
-
-// Funzioni
-void blink()
-// Modifica dello stato del LED
-{
- static unsigned long last_interrupt_time = 0;
- // If interrupts come faster than 200ms, assume it's a bounce and ignore
- if (millis() - last_interrupt_time > 200)
- { // Azione da intraprendere
- state = !state;
- digitalWrite(ledPin, state);
- }
- last_interrupt_time = millis();
-}
-