Академический Документы
Профессиональный Документы
Культура Документы
4 MAYO, 2016
En la entrada anterior vimos qué son las interrupciones y cómo usarlas para responder a
eventos de hardware en pins.
También dejamos claro que los dispositivos físicos, como pulsadores, detectores ópticos,
etc, presentan un efecto rebote que interfiere con el uso de interrupciones, y que necesitamos
eliminarlo o no podremos usar interrupciones con estos dispositivos.
Anuncio:
Observar la cantidad de ruido ocurrido tras el flanco. En esencia, en el rango de unos
microsegundos la señal es puro ruido. Todos esos picos pueden provocar disparos múltiples de
una interrupción.
PROBANDO EL REBOTE
Para probar el rebote, simplemente vamos a emplear un cable para conectar el Pin 2 y
Ground (también podéis usar un pulsador o un interruptor).
Activamos la resistencia interna de Pull UP en el Pin 2 y definimos una interrupción al
evento de bajada en el PIN, y en la función ISR asociada simplemente incrementamos un
contador.
Este es el efecto del rebote. El ruido de la señal está generando múltiples interrupciones cada
vez que conectamos el cable.
ELIMINANDO EL REBOTE
Disponemos de dos formas de aplicar el debounce. Añadiendo dispositivos electrónicos que
filtren la señal (debounce por hardware) o modificando nuestro código para eliminar el rebote
(debounce por hardware).
La forma más sencilla de aplicar un debounce por software es comprobar el tiempo entre
disparos de la interrupción. Si el tiempo es inferior a un determinado umbral de tiempo
(threshold) simplemente ignoramos la interrupción. En definitiva, hemos definido una “zona
muerta” en la que ignoramos las interrupciones generadas.
Para aplicar el debounce por software, modificamos la función ISR de la siguiente forma.
1 const int timeThreshold = 150;
2 const int intPin = 2;
3 volatile int ISRCounter = 0;
4 int counter = 0;
5 long timeCounter = 0;
6
7
8 void setup()
9 {
10 pinMode(intPin, INPUT_PULLUP);
11 Serial.begin(9600);
12 attachInterrupt(digitalPinToInterrupt(intPin), debounceCount, FALLING);
13 }
14
15 void loop()
16 {
17 if (counter != ISRCounter)
18 {
19 counter = ISRCounter;
20 Serial.println(counter);
21 }
22 }
23
24 void debounceCount()
25 {
26 if (millis() > timeCounter + timeThreshold)
27 {
28 ISRCounter++;
29 timeCounter = millis();
30 }
31 }
Un tiempo de 100-200ms es correcto para un pulsador pero en otros casos deberemos ajustar
el tiempo de forma que eliminemos el rebote, pero no ignoremos dos posibles eventos cercanos
“verdaderos”.