El Uso de interrupciones es fundamental al trabajar en Arduino. Sean interrupciones de hardware o de temporizador, las interrupciones permiten a una placa Arduino realizar más de una tarea a la vez.
A través de las interrupciones una placa detendrá los procesos en ejecución y pasará a realizar otros procesos programados.
Al utilizar una interrupción y la segunda tarea se complete, la placa Arduino reanudará los procesos que estaba ejecutando antes de que ejecutara la interrupción.
A continuación, aprenderás a realizar dos tipos de interrupciones, de hardware y de temporizador.
Interrupciones de hardware en Arduino
El el siguiente código permite ejecutar una interrupción de hardware a un proyecto que permite controlar un LED :
int buttonPin = 2;
int buttonLED = 11;
int blinkLED = 12;
volatile int buttonState;
void buttonInterrupt() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(buttonLED, LOW);
}
if (buttonState == LOW) {
digitalWrite(buttonLED, HIGH);
}
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buttonLED, OUTPUT);
pinMode(blinkLED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonInterrupt, CHANGE);
}
void loop() {
digitalWrite(blinkLED, HIGH);
delay(200);
digitalWrite(blinkLED, LOW);
delay(200);
}
Rutinas de servicio de interrupción
Las rutinas de servicio de interrupción, contienen el código que desea ejecutar cuando se activa una interrupción.
El código debe ser lo más corto y rápido posible. Si está utilizando varias interrupciones, tenga en cuenta que solo se puede ejecutar una interrupción a la vez.
Las funciones millis()
, micros()
y delay()
dependerán de las interrupciones mismas, por lo que no funcionarán dentro de una rutina de servicio de interrupción.
Sin embargo, si necesita un retraso en su rutina de servicio de interrupción, puede utilizar la función delayMicroseconds()
para lograr el mismo efecto.
La función Serial.print()
no siempre funciona dentro de una rutina de servicio de interrupción porque los datos se transfieren al monitor serial con una interrupción.
Las rutinas de servicio de interrupción no pueden aceptar valores de entrada o retorno.
Al declarar variables dentro de la rutina de servicio de interrupción, como por ejemplo la variable buttonState
deberá hacer uso de la palabra reservada volatile
.
Declarar una variable como volatile
evitará que el compilador la optimice y garantiza que se almacene en la SRAM de Arduino, en lugar que dentro de un registro de espera como con otras variables.
En caso contrario, el valor de la variable puede no ser exacto.
Activar una rutina de servicio de interrupción
Para activar la rutina de servicio de interrupción, debe usar la función attachInterrupt()
dentro del setup()
.
La función attachInterrupt()
toma tres parámetros.
El primer parámetro es el número de interrupción. El Arduino Uno tiene dos interrupciones, la interrupción 0 y la interrupción 1.
La interrupción 0 está conectada al pin digital 2 y la interrupción 1 está conectada al pin digital 3.
El segundo parámetro en la función attachInterrupt()
da nombre a la rutina de servicio de interrupción.
En el código anterior, el nombre de la interrupción es buttonInterrupt
.
El tercer parámetro para la función attachInterrupt()
será el modo de interrupción.
El modo de interrupción define el tipo de señal que activará la interrupción.
Hay cuatro modos de interrupción diferentes:
LOW
– la interrupción se activará siempre que el pin de interrupción esté en BAJORISING
– la interrupción se activará cuando la señal cambie de BAJA a ALTAFALLING
– la interrupción se activará cuando la señal pase de ALTA a BAJACHANGE
– la interrupción se activará cuando la señal pase de ALTO a BAJO o de BAJO a ALTO
Interrupciones de temporizador en Arduino
Las interrupciones de hardware que hemos visto antes, se desencadenan debido a un evento externo, como por ejemplo el uso de un pulsador.
Sin embargo las interrupciones del temporizador son activadas a través del reloj interno de la placa Arduino.
Los temporizadores son circuitos electrónicos integrados en los microcontroladores, siendo su función principal registro del tiempo.
Las interrupciones del temporizador se utilizan normalmente para leer o escribir pines a intervalos regulares.
Un ejemplo del uso de una interrupción de temporizador es obtener una lectura en un sensor de humedad cada cinco segundos.
Arduino tiene tres temporizadores – Timer0, Timer1 y Timer2:
- Timer0: un temporizador de 8 bits utilizado para las funciones
delay()
,millis()
ymicros()
- Timer1 – un temporizador de 16 bits
- Timer2: un temporizador de 8 bits
No use Timer0 para interrupciones o podría romper las funciones delay()
, millis()
y micros()
las. Utilice Timer1 o Timer2 en su lugar.
Los tres temporizadores se basan en la frecuencia de reloj de Arduino, que es de 16 MHz.