Skip to main content

Interrupciones externas

Objetivos
  • En construcción....

Configuración de una interrupción

Como se habia explicado previamente, cuando ocurre un evento o interrupción, el procesador se da cuenta de inmediato, guarda su estado de ejecución, ejecuta una pequeña porción de código (interrupt handler o interrupt service routine) y luego regresa a lo que estaba haciendo antes.

El programador es quien define el codigo que será ejecutado cuando una interrupción particular ocurre dentro del progama. Para configurar una interrupción usando el API de Arduino se usa la función adjuntaInterrupt() cuya sintaxis se muestra a continuación:

attachInterrupt(digitalPinToInterrupt(GPIO), funcion, mode);

Esta función toma los siguientes tres parametros:

  • digitalPinToInterrupt(pin): Numero del pin de la interrupción. Esta función le indica al microprocesador el pin que se va a monitorear. Los pines susceptibles de generar interrupciones varían en función del modelo de board empleada. La siguiente tabla muestra algunos casos:

    BoardINT0INT1INT2INT3INT4INT5
    UNO, Nano, Ethernet, Mini ProPin 2Pin 3
    MegaPin 2Pin 3Pin 21Pin 20Pin 19Pin 18
    LeonardoPin 3Pin 2Pin 0Pin 1Pin 7

    Modelos como la Arduino DUE y la arduino UNO Wifi, tienen interrupciones asociadas a todos los pines. En lo que respecta al ESP32, se pueden usar todos los pines GPIO para interruciones externas excepto los pines GPIO6, GPIO7, GPIO8, GPIO9, GPIO10 y GPIO11 (link).

    warning

    Para obtener información detallada sobre la asignación de pines y la configuración de interrupciones externas se debe tener en tener claridad a cerca de la placa y el framework empleandos (por ejemplo Arduino, ESP-IDF) empleados.

  • ISR: Localización del codigo (interrupt service routine) que se ejecutará si la interrupción es lanzada.

  • mode: Define el tipo de evento que desencadenara la interrupción. Los posibles valores son:

    • LOW: Indica la activación de la interrupción cuando el pin este en BAJO.
    • HIGH: Activa la interrupción siempre que el pin este en ALTO.
    • CHANGE: Activa la interrupción cuando el pin cambia de valor (ya sea de ALTO a BAJO o viceversa).
    • FALLING: Activa la interrucción por flanco de caida (El pin pasa de ALTO a BAJO).
    • RISING: Activa la interrucción por flanco de subida (El pin pasa de BAJO a ALTO).

    pin_state)

tip

Para mas información sobre la función attachInterrupt() del API de arduino consulte las siguientes paginas:

  • Documentación del Arduino (link)
  • Documentación del ESP32 (link)

Interrupciones externas en el ESP32

A continuación se describen los pasos para configurar una interrupción externa cuando se usa el ESP32 cuando se usa el framework de Arduino.

  1. Asignar un pin para detectar la interrupción esterna: Inicialmente se busca en la documentación que el pin pueda ser ligado a una interrupción externa. Luego, se configura la interrupción usando la función attachInterrupt() dentro la función setup() . Recuerde la sintaxis:

    attachInterrupt(digitalPinToInterrupt(GPIOPin), function_ISR, Mode);
  2. Definir la ISR: A continuación se muestra la sintaxis:

    void IRAM_ATTR function_ISR() {
    // Instrucciones...
    }
    tip

    Para la definición de la ISR se recominda agregar la flag IRAM_ATTR para que el codigo de la función se almacene en la RAM (y no en la Flash) de modo que su ejecución sea mas rapida.

Por ejemplo, si se deseara configura una interrupción externa a traves del pin 23, el fragmento de código que resume el proceso descrito anterioremente tendra la siguiente forma:

const int input_pin = 23;

void IRAM_ATTR function_ISR() {
// Instrucciones...

}

void setup() {
Serial.begin(115200);
pinMode(input_pin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(input_pin), function_ISR, FALLING);
}

void loop() {
// Logica de la aplicacion
}

Referencias