entrada-POST

¡Bienvenido a una nueva entrada del curso de programación con Arduino!

En esta entrada vamos a aprender a utilizar interrupciones, o interrupts,  pero, ¿qué son?

Una interrupción es una señal que para 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, conocidas 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.

Si quieres conocer más sobre interrupciones, puedes visitar la página de referencia aquí.

Lista de materiales

  • ZUM BT-328, placa Arduino o compatible.
  • Módulo pulsador o botón.

Conexiones Eléctricas

El número de pines que pueden utilizarse como interrupts depende de la placa que estemos utilizando. Para la placa ZUM BT-328, Arduino Uno y derivados, es 2, y se encuentran en los pines 2 y 3, correspondiendo al interrupt 0 e interrupt 1 respectivamente.

ZUM-push2

Usando las interrupciones

Para utilizar las interrupciones, en primer lugar tenemos que declarar qué interrupción queremos utilizar, en nuestro caso utilizaremos la interrupción 0, que está en el pin número dos, por lo que declaramos:

Ahora, en setup, tenemos que especificar qué función se llamará en caso de que se produzca la interrupción. Para ello, utilizamos la función attachInterrupt, que tiene la siguiente sintaxis:

Los argumentos de la función attachInterrupt son:

  1. Interrupt: Número de interrupción, es decir, en que pin se “escuchará” para esperar la interrupción.
  2. ISR: función que se llamará en caso de que se produzca la interrupción.
  3. Mode: Define la forma en que se lanzará la ISR , es decir, que tiene que pasar para que se ejecute la interrupción. Los diferentes modos son:
    1. LOW: se ejecuta siempre que el valor en el pin sea 0.
    2. CHANGE: se ejecuta siempre que se produzca un cambio.
    3. RISING: se ejecuta mientras el valor va de 0 a 1 (o de 0 a 5 Voltios).
    4. FALLING: se ejecuta mientras el valor va de 1 a 0 (o de 5 a 0 Voltios).

Hay que tener en cuenta que los modos tenemos que escribirlos con letras mayúsculas, si no se producirá un error.

En nuestro caso, utilizamos:

que detectará cuándo dejamos de pulsar el botón.

Por otra parte, tenemos que definir la función a la que se llamará al detectarse la interrupción. En este caso, hemos llamado a la función funcionInterrupción, y la definimos con el mismo nombre que hemos puesto en attachInterrupt. La función entonces es:

Donde imprimimos por el monitor serie el número de veces que se ha entrado en la interrupción.

Una de las peculiaridades de las interrupciones es que no pueden tener ningún argumento en su definición ni devolver ningún valor, por lo que para asegurar que la ISR tenga un buen acceso a las variables, tenemos que utilizar una variable de tipo volatile, en este caso de tipo int. Si quieres conocer más sobre volatile, puedes visitar esta página de referencia.

Otra de las restricciones de las interrupciones es que, mientras que estemos dentro de una ISR, el resto de interrupciones no serán detectadas, no funcionará delay ni se actualizará el valor de millis, por lo que es importante que las ISR sean lo más cortas posible.

 El código

Aquí podéis ver el código completo. Recordad que también podéis descargar el código junto con las imágenes utilizadas al final de esta entrada.

En primer lugar, declaramos las variables que vamos a utilizar, en este caso interrupcion, con la que indicaremos al microprocesador qué interrupción queremos utilizar, y después numInterrupt, que mostrará el número de veces que se ha accedido a la interrupción.

En la función setup iniciamos el puerto serie y declaramos la interrupción que vamos a utilizar con attachInterrupt();.

En la función loop, se simula una tarea que requiera cierto tiempo para ejecutarse, en este caso, para no sobrecargar la visualización de la salida del programa por el puerto serie, se imprime un punto, “.”, en el puerto serie. Cuando se accede a la interrupción, al soltar el pulsador en nuestro caso, se para la ejecución del programa y se imprime por el puerto serie “Interrupt numero ” seguido del número de veces que se ha accedido a la interrupción.

Como ejercicio os propongo que modifiquéis el modo en que se accede a la interrupción, para conocer cuál es el efecto sobre un mismo circuito.