attachInterrupt() / Interrupciones con Arduino
| Actualizado:
Comentarios: 0
Una interrupción es una señal que detiene la actividad actual del procesador para ejecutar otra función distinta. La interrupción puede iniciarse debido a una señal externa, por ejemplo, la pulsación de un botón, o interna, por ejemplo, un temporizador o una señal de software. Una vez que se ha activado, la interrupción pausa lo que esté haciendo el procesador y hace que se ejecute otra función, conocida como Rutina de Interrupción de Servicio, o ISR por sus siglas en inglés. Una vez que la ISR ha finalizado, el programa vuelve a lo que se estuviera haciendo en ese momento.
Sintaxis
attachInterrupt(pin, ISR, modo)
Pin: indica qué pin vamos a utilizar como interrupción. En Arduino UNO hay dos pines para interrupciones, el 2 y el 3. Si utilizamos el 2, se indica con un 0 y si utilizamos el pin 3, se indica con un 1. Si queremos indicar el número del pin directamente, debemos usar la función digitalPinToInterrupt(pin). Función que por sí sola nos devuelve el ordinal del pin.
Placa | INT 0 | INT 1 | INT 2 | INT 3 | INT 4 | INT 5 |
UNO | 2 | 3 | ||||
Nano | 2 | 3 | ||||
Mini pro | 2 | 3 | ||||
MEGA | 2 | 3 | 21 | 20 | 19 | 18 |
DUE | Todos los pines pueden usarse para interrupciones | |||||
Leonardo | 3 | 2 | 0 | 1 | 7 |
ISR: es la función a la que se llama cuando se produce la interrupción. Es una función que no admite parámetros y no devuelve nada. Importante, para poder modificar una variable externa a la ISR dentro de ella, se debe declarar como volatile. Volatile indica que la variable debe ser consultada siempre antes de ser utilizada, porque puede haber sido modificada de forma ajena al flujo normal del programa.
Modo: define la forma en que se lanzará la ISR, es decir cuando se producirá la interrupción, pueden ser:
- LOW, se ejecuta siempre que el valor en el pin sea 0.
- CHANGE, se ejecuta cuando el pin cambia de valor, de 1 a 0 ó de 0 a 1.
- RISING, se ejecuta cuando el pin cambia de valor de 0 a 1.
- FALLING, se ejecuta cuando el pin cambia de valor de 1 a 0.
- HIGH (solo para el DUE), se ejecuta cuando el pin está en 1.
Ejemplo
En el siguiente código creamos un contador de interrupciones. En cada interrupción actualizaremos el valor del contador y mostraremos el valor por el monitor serial.
Esquema:
Código:
int interrupcion = 0;
volatile int numInterrupt = 0;
void setup() {
Serial.begin(9600);
attachInterrupt(interrupcion, funcionInterrupcion, FALLING);
}
void loop() {
while(true){
Serial.print(".");
delay(250);
}
}
void funcionInterrupcion() {
Serial.print("Interrupción número ");
Serial.println(numInterrupt);
numInterrupt++;
}
Si activamos el monitor serial, cada vez que presionamos sobre el pulsador contabilizara una interrupción: