1. El Octavo Bit
  2. / Lenguaje de programación de Arduino
  3. / attachInterrupt() / Interrupciones con Arduino

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:

Esquema para un contador de interrupciones con Arduino
Esquema para un contador de interrupciones con Arduino

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:

Captura del monitor serial contando las interrupciones
Captura del monitor serial contando las interrupciones
Comentarios - 0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *