From 2d20ec97a60179f5dc3073c77cead5706b711c56 Mon Sep 17 00:00:00 2001 From: Andrea Manni Date: Wed, 8 Feb 2017 18:14:33 +0100 Subject: [PATCH] interrupts --- advanced_projects/interrupts/base/base.ino | 27 +++++++++++++------ .../interrupts/doppia_ISR/doppia_ISR.ino | 20 +++++++------- .../interrupt_base_volatile.ino | 7 +++++ .../semaforo_rgb_stimolo_millis.ino | 8 +++--- libraries/common/common.cpp | 21 +++++++-------- libraries/common/examples/blink/blink.ino | 2 +- multitasking/millis/pwm_millis/pwm_millis.ino | 7 +++-- 7 files changed, 57 insertions(+), 35 deletions(-) diff --git a/advanced_projects/interrupts/base/base.ino b/advanced_projects/interrupts/base/base.ino index 9b23dc6..db4aea2 100644 --- a/advanced_projects/interrupts/base/base.ino +++ b/advanced_projects/interrupts/base/base.ino @@ -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); } diff --git a/advanced_projects/interrupts/doppia_ISR/doppia_ISR.ino b/advanced_projects/interrupts/doppia_ISR/doppia_ISR.ino index 8577def..4ff8eb7 100644 --- a/advanced_projects/interrupts/doppia_ISR/doppia_ISR.ino +++ b/advanced_projects/interrupts/doppia_ISR/doppia_ISR.ino @@ -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; diff --git a/advanced_projects/interrupts/interrupt_base_volatile/interrupt_base_volatile.ino b/advanced_projects/interrupts/interrupt_base_volatile/interrupt_base_volatile.ino index 6dff6fe..72a448c 100644 --- a/advanced_projects/interrupts/interrupt_base_volatile/interrupt_base_volatile.ino +++ b/advanced_projects/interrupts/interrupt_base_volatile/interrupt_base_volatile.ino @@ -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 diff --git a/advanced_projects/state_machine/semaforo_rgb_stimolo_millis/semaforo_rgb_stimolo_millis.ino b/advanced_projects/state_machine/semaforo_rgb_stimolo_millis/semaforo_rgb_stimolo_millis.ino index 50eb1ae..a8a14c0 100644 --- a/advanced_projects/state_machine/semaforo_rgb_stimolo_millis/semaforo_rgb_stimolo_millis.ino +++ b/advanced_projects/state_machine/semaforo_rgb_stimolo_millis/semaforo_rgb_stimolo_millis.ino @@ -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; diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp index b6e1e09..1d9153b 100644 --- a/libraries/common/common.cpp +++ b/libraries/common/common.cpp @@ -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)); } diff --git a/libraries/common/examples/blink/blink.ino b/libraries/common/examples/blink/blink.ino index d72d603..d182fe4 100644 --- a/libraries/common/examples/blink/blink.ino +++ b/libraries/common/examples/blink/blink.ino @@ -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 diff --git a/multitasking/millis/pwm_millis/pwm_millis.ino b/multitasking/millis/pwm_millis/pwm_millis.ino index 4a1d117..2799390 100644 --- a/multitasking/millis/pwm_millis/pwm_millis.ino +++ b/multitasking/millis/pwm_millis/pwm_millis.ino @@ -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(); }; } - -- 2.39.2