Mejora tu programación en Arduino: Manejo de interrupciones externas

Resumen: Con este tutorial aprenderás la importancia de las interrupciones y a manejarlas con la función attachInterrupt()

Las interrupciones permiten a un microcontrolador realizar tareas de forma «simultanea». A grandes rasgos una interrupción es un evento que interrumpe el flujo principal del programa. Al darse la interrupción el microcontrolador ejecuta una porción especial de código y vuelve al programa principal. Configurar las interrupciones que puede manejar tu Arduino te permitirá hacer un código más eficiente y dinámico. En este tutorial te explicamos como hacerlo.

Un ejemplo muy básico surge de la necesidad de usar interrupciones al encender un LED cuando se presiona un push button. La practica común es configurar la entrada y salida y en la sección de loop() ir revisando continuamente si el botón esta presionado y actuar acorde a su estado.

Esto en general funciona, pero es una mala practica por que estamos revisando constantemente el estado del botón, cuando podríamos ejecutar otras cosas. Más aún, si tenemos un código más complejo y el botón se presiona, el programa tarda unos milisegundos en encender el LED, por lo que no tenemos una respuesta inmediata.

Para esto nos sirven las interrupciones. Nos permiten detectar cambios sin necesidad de escribir un código que revise constantemente ese cambio. Por lo general escribimos un código que le indique al microcontrolador que hacer en caso de una interrupción, al cual denominamos Rutina de Servicio para Interrupciones, y en eso nos enfocaremos en el tutorial. Cómo el titulo indica, nos enfocaremos específicamente en las interrupciones externas al microcontrolador, es decir, cambios en una entrada en particular.

Supongamos el caso anterior, donde encendemos un LED. Este es el código que usariamos para detectar si esta presionado o no el botón. Observe que tenemos un delay de 500ms, simulando que el micro se mantiene ocupado con otras tareas. Lo que ocurrirá es que el LED tardará en encenderse, y que hay que presionar un buen rato el botón para que lo detecte, dado que se estan realizando otras tareas. Adaptemos entonces el código para utilizar una interrupción.

Revisemos ahora la hoja de especificaciones del microcontrolador para ver como configurar la entrada de interrupciones. Primero tenemos que uno de los pines de interrupcion externa es PD2, identificado como INT0. Observamos en la secciones de interrupciones de la hoja

Si visitamos la página de Arduino podremos encontrar que existe una función específica para indicarle al programa que queremos detectar interrupciones de un pin. Para ello utilizamos attachInterrupt()

Por lo tanto, para agregar esta función agregamos, esta linea de código. Esta indica que queremos usar el pin al que conectamos el botón como interrupcion, que queremos que se ejecute toggle cuando haya un cambio de estado y que sea cuando pase de un 1 a 0. La función digitalPinToInterrupt() permite convertir el pin en la entrada de interrupcion correcta.

Vamos a elminar algunas partes del código, primero podemos quitar todo el contenido de loop() excepto el delay, que representa el procesador haciendo otras tareas. Luego podemos quitar la variable global previo_btn, porque ya no la usaremos más. Y por ultimo creamos una nueva función toggle() al final del código, el código dentro de la función se muestra en la imagen.

Con estos cambios podemos programar nuestro Arduino y probar que la interrupción funciona. Observamos que el apgado y encendido del LED no es tardado y no necesitamos mantener presionado el push button para que funcione.

La ventaja de usar este método es que podemos configurar rapidamente las interrupciones externas. Sin embargo, la función attachInterrupt() no funcionará para interrupciones internas, como con temporizadores, por lo que habrá que realizarlo con registros. Revisa el repositorio para descargar los archivos que creamos.

Referencias:

Level up your Arduino Code: External Interrupts

Arduino Reference: attachInterrupt()

Repositorio con los códigos usados

Comentarios