Fork me on GitHub

Interrupciones con Arduino

March 25, 2016

Una interrupción es una señal que interrumpe la ejecución del micro, quien deja inmediatamente lo que estaba haciendo y pasa a atender a una función especial que se encuentra por fuera del flujo del programa y que contiene las instrucciones necesarias para tratar el evento. Una vez finalizado el código de la función el micro retoma su rutina anterior en el lugar exacto donde la interrumpió.

En Arduino este tipo de funciones se llaman ISR (Interrupt Service Routines) y tienen un par de limitaciones con respecto al resto: no pueden recibir parámetros ni retornar algo.

Por otra parte en Arduino las interrupciones son por hardware, para lo cual hay que hacer uso de algún pin, pero no cualquiera puede usarse para esto. En Uno, Nano y Mini los pines habilitados son 2 y 3. En cualquiera de estos pines es posible setear el evento que lanzará la interrupción:

  • LOW: La interrupción se dispara cuando el pin es LOW.
  • CHANGE: Se dispara cuando pase de HIGH a LOW o viceversa.
  • RISING: Se dispara en el flanco de subida (cuando pasa de LOW a HIGH).
  • FALLING: Se dispara en el flanco de bajada (cuando pasa de HIGH a LOW).

A continuación un ejemplo sencillo usando un switch en el pin 2, el cual al ser presionado setea en cero la variable state. Para asegurarse de que las variables compartidas entre las ISR y el resto se actualicen correctamente hay que declararlas como volatile.

volatile int state = 1;

void interrupt()
{
    state = digitalRead(BUTTON_PIN);
}

void setup()
{
    attachInterrupt(0, interrupt, CHANGE);
}

void loop()
{
    for (int i = 0; i < 25; i++) {
        while( ! state);
        // task here
    }
}

Las ISR se conectan a un pin particular mediante la función attachInterrupt. El 0 indica que se conecta al primer pin habilitado para esto, es decir el 2.

El código completo aquí.

Arduino