]> git.piffa.net Git - sketchbook_andrea/commitdiff
interrupts
authorAndrea Manni <andrea@piffa.net>
Wed, 8 Feb 2017 17:14:33 +0000 (18:14 +0100)
committerAndrea Manni <andrea@piffa.net>
Wed, 8 Feb 2017 17:14:33 +0000 (18:14 +0100)
advanced_projects/interrupts/base/base.ino
advanced_projects/interrupts/doppia_ISR/doppia_ISR.ino
advanced_projects/interrupts/interrupt_base_volatile/interrupt_base_volatile.ino
advanced_projects/state_machine/semaforo_rgb_stimolo_millis/semaforo_rgb_stimolo_millis.ino
libraries/common/common.cpp
libraries/common/examples/blink/blink.ino
multitasking/millis/pwm_millis/pwm_millis.ino

index 9b23dc6cc9ec32b435f57b77e76f763dc27742c4..db4aea2153ae77bd33a7b2e59563217c651aedea 100644 (file)
@@ -1,9 +1,19 @@
 /*
- * Interrupt base
- * 
- * Utilizzo di un interrupt ala Arduino per intercettare
- * la pressione di un bottone.
- * 
+   Interrupt base
+   
+   Utilizzo di un interrupt ala Arduino per intercettare
+   la pressione di un bottone.
+
+   Un momentary switch e' collegato in PULL UP al PIN D2
+   La Interrupt Service Routine reazioneISR viene associata all'interrupt 0
+   che reagisce al passaggio di stato 5v -> 0v del PIN D2
+
+   La pressione del bottone causa l'accensione del bottone
+   che viene spento periodicamente ogni 3 secondi nel loop,
+   il delay non pregiudica la percezione dell'evento.
+
+Schema: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
+   
  */
 
 int ledPin = 13; 
@@ -11,7 +21,8 @@ int ledPin = 13;
 void setup()
 {
   pinMode(ledPin, OUTPUT);
-  attachInterrupt(0, eventoAttivo, RISING); // 0 e' l'interrupt numero 0
+  pinMode(2, INPUT_PULLUP);
+  attachInterrupt(0, reazioneISR, FALLING); // 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
@@ -21,11 +32,11 @@ void setup()
 void loop()
 {
   // Varie altre cose che da cui non dipende la gestione dell'interrupt
-  delay(5000);
+  delay(3000);
   digitalWrite(ledPin,LOW);
 }
 
-void eventoAttivo() // Sempre VOID
+void reazioneISR() // Sempre VOID
 {
   digitalWrite(ledPin, HIGH);
 }
index 8577def2162549055ddf3becd7f681933c6cdf54..4ff8eb706a99b1e4d5f6168e39d7f2f98ed72c81 100644 (file)
@@ -1,13 +1,15 @@
 /*
- * 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.
+   Interrupt doppia ISR
+   
+   Utilizzo di un interrupt ala Arduino per intercettare
+   la pressione di un bottone in PULL UP.
+   
+   Doppia ISR: la prima ISR intercetta FALLING
+   e riconfigura l'interrupt con RISING per una seconda
+   ISR che a sua volta ripristina il comportamento
+   precedente.
+
+Schema: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
  */
 
 int ledPin = 13; 
index 6dff6fea7d227d1f5039e9f9aa1dbf3a78e0457b..72a448cd29e3a327a807c4e5f917aa01bb2f3df9 100644 (file)
@@ -8,6 +8,9 @@
  * e riconfigura l'interrupt con RISING a una seconda
  * ISR che a sua volta ripristina il comportamento
  * precedente.
+
+ In questa versione le ISRs modificano una variabile state
+ corrispondente allo stato del bottone, impostato nel loop.
  */
 
 const byte ledPin = 13;
@@ -30,6 +33,10 @@ void loop()
   digitalWrite(ledPin, state);
   // La variabile state viene richiamata fuori dalla ISR
   // quindi deve essere dichiarata volatile
+// altrimenti il compilatore potrebbe decidere di trattarlo come constante
+// in fase di ottimizzazione
+// oppure si potrebbe creare un dualismo tra il valore di questa
+// storato in SRAM o in un registro
 }
 
 void eventoFall() // Sempre VOID
index 50eb1aebafa0e9aff1485f8a3d7749f0433cf3a6..a8a14c05383b2cf4b015a4f7fe4f4a333d844deb 100644 (file)
@@ -48,15 +48,15 @@ switch (state) {
     led.Green();
     if (millis() - timer >= pausa * 2/3) {
     state = wait_button ;
-    timer = millis(); 
+    timer += pausa * 2/3;
     }
     break;
 
     case wait_button:
     if (digitalRead(input) == LOW) { 
     state = turn_yellow ; // Il passaggio di stato avviene alla pressione di un bottone
-    timer = millis();
     delay(20); // Debouncing, si potrebbe fare con millis()
+    timer = millis();
     };
     break;
 
@@ -68,7 +68,7 @@ switch (state) {
     led.Yellow();
     if (millis() - timer >= pausa * 2/3) {
     state = turn_red ;
-    timer = millis(); 
+    timer += pausa * 2/3;
     }
     break;
 
@@ -80,7 +80,7 @@ switch (state) {
     led.Red();
     if (millis() - timer >= pausa) {
     state = turn_green ;
-    timer = millis(); 
+    timer += pausa ;
     }
     break;
 
index b6e1e095c3d48606e5ed017f4a3f4b1d88f26c01..1d9153bb0547037ad3d955b723fa5c8befff9a46 100644 (file)
@@ -112,14 +112,14 @@ void Lampeggiatore::Blink() {
     // Illumina il led a 500ms
 
     if(millis() + shift - previousMillis > interval) {
-        // save the last time you blinked the LED
-        previousMillis = millis();
 
         // if the LED is off turn it on and vice-versa:
         ledState = !ledState ; // Inverti il LED
+        // set the LED with the ledState of the variable:
+        digitalWrite(ledPin, ledState);
+        // save the last time you blinked the LED
+        previousMillis += interval;
     }
-    // set the LED with the ledState of the variable:
-    digitalWrite(ledPin, ledState);
 };
 
 void Lampeggiatore::Blink(long time, long drift ) {
@@ -127,14 +127,13 @@ void Lampeggiatore::Blink(long time, long drift ) {
 
     shift = drift;
     if(millis() + shift - previousMillis > time) {
-        // save the last time you blinked the LED
-        previousMillis = millis();
-
         // if the LED is off turn it on and vice-versa:
         ledState = !ledState ; // Inverti il LED
-    }
     // set the LED with the ledState of the variable:
     digitalWrite(ledPin, ledState);
+        // save the last time you blinked the LED
+        previousMillis += time;
+    }
 };
 
 void Lampeggiatore::Blink(long up, long down, long drift ) {
@@ -143,11 +142,11 @@ void Lampeggiatore::Blink(long up, long down, long drift ) {
     shift = drift;
     if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
         // save the last time you blinked the LED
-        previousMillis = millis();
+        previousMillis += up;
         ledState = LOW  ;
     }
     else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
-        previousMillis = millis();
+        previousMillis += down;
         ledState = HIGH  ;
     }
 
@@ -256,7 +255,7 @@ void Pwm::Set(byte brightness) {
 
 
 void Pwm::lSet(byte brightness) {
-    // Imposta il valore del PWM
+    // Imposta il valore del PWM con correzione luminosita' LED
     analogWrite(ledPin, lum(brightness));
 }
 
index d72d6031dc1e8d189707b69c0ed49c6c22c9709f..d182fe4b4826b067e86d1952fc49fdd55fb3ff88 100644 (file)
@@ -21,7 +21,7 @@ void setup() {
 void loop() {
   led.Blink();    // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW) 
 //  led.Blink(400);  // Lampeggia ogni 400ms
-//  led.Blink(400,200);  // Imposta il tempo acceso e il tempo spento a 400ms, 200ms di ritardo
+//  led.Blink(400,200);  // Imposta il tempo acceso a 400ms, 200ms di ritardo
 //  led.Blink(300,700,0);  // acceso per 300ms, spento per 700 ms, ritardo = 0ms
 //  led.Blink(300,700,500);  // acceso per 300ms, spento per 700 ms, ritardo = 500s
 //  led.High();   // Stato su HI
index 4a1d11717ffee549cf98a68fef638b7dc2184e6c..279939013d44d281202d38ade1b955eaea73af5a 100644 (file)
@@ -4,6 +4,10 @@
    PWM per un LED: aumentare progressivamente la luminosita'.
    Utilizza la funzione millis() invece che un delay()
    in modo da non blocare il processore.
+
+   La durata del ciclo e' pero' molto approssimativa in multipli di 256ms
+   quindi con errore di +-128ms, inoltre si possono accumulare ulteriori
+   ritardi se la funzione non viene eseguita regolarmente ogni ms.
    
  */
 
@@ -33,8 +37,7 @@ void pwmUp(byte led, int speed) {
   // nell'intervallo discreto con minimo 0 (spento) e  massimo 255 (acceso).
 
   if ((millis() - previousMillis) > speed / 256) {
-    brightness = brightness + 1; // Incrementiamo la luminosita'
+    brightness++ ; // Incrementiamo la luminosita'
     previousMillis = millis();
   };
 }
-