Documentos de Académico
Documentos de Profesional
Documentos de Cultura
En Arduino, las interrupciones son señales que detienen temporalmente la ejecución del
código del programa principal para atender una tarea de alta prioridad, como leer un sensor
o registrar un evento. Cuando se produce una interrupción, el principal se pausa
momentáneamente y se ejecuta una rutina de interrupción especial, que realiza la tarea
necesaria y luego regresa al programa principal en el punto que lo dejó.
Las interrupciones son útiles cuando se necesita una respuesta rápida a un evento externo
o cuando se quieren realiza tareas en segundo plano sin interrumpir el flujo principal del
programa. Por ejemplo, se pueden utilizar interrupciones para detectar cambios en el
estado de un botón, contar pulsos de un sensor o recibir datos a través del puerto serie.
En Arduino es posible configurar los pines para que activen una interrupción al detectar un
cambio en su estado. También, se puede habilitar o deshabilitar las interrupciones en
cualquier momento dentro del programa principal utilizando las funciones de interrupción
integradas en la biblioteca de Arduino.
Para entender un poco más el uso y la necesidad de las interrupciones, suponer que hay un
Arduino conectado a un sensor, por ejemplo un encoder para contar sus revoluciones, o un
simple pulsador de parada. Si se quiere detectar un cambio de estado de la entrada en
cuestión, la forma convencional de hacerlo es mediante un mecanismo llamado “poll”,
consiste en el uso de entradas digitales para consultar el valor de la entrada, con el uso de
una espera (delay) entre cada consulta. Este mecanismo tiene3 desventajas:
INTERRUPCIONES DE HARDWARE
Para interrupciones de hardware, Arduino detecta estos eventos:
Los pines con los que cuenta Arduino para generar interrupciones cambian de acuerdo con
el modelo de la tarjeta Arduino:
FUNCIÓN ISR
La función asociada a una interrupción se denomina ISR (Interruption Service Routines) y,
por definición, tiene que ser una función que no recibe nada y no devuelva nada. Es
importante mencionar que dos ISR no pueden ejecutarse de forma simultánea. En caso de
dispararse otra interrupción mientras se ejecuta otra, la función ISR se ejecuta una a
continuación de otra.
Al diseñar una ISR se debe mantener como objetivo que tenga el menor tiempo de ejecución
posible, dado que mientras se esté ejecutando el programa principal (loop) todas las otras
funciones se encuentran detenidas. Imaginar, por ejemplo, que el programa principal ha
sido interrumpido mientras un motor acercaba un brazo para coger un objeto. Una
interrupción larga podría hacer que el brazo no para a tiempo, tirando o dañando el objeto.
Frecuentemente la función de la ISR se limitará a activar una bandera, incrementar un
contador, o modificar una variable. Esta modificación será atendida posteriormente en el
hilo principal, cuando sea oportuno.
Variables volátiles
Para poder modificar una variable externa a la ISR dentro de la misma esta se debe
declararla como “volatile”. El indicador “volatile” indica al compilador que la variable tiene
que ser consultada siempre antes de ser usada, dado que puede haber sido modificada de
forma ajena al flujo normal del programa (por una interrupción). Al indicar una variable
como “volatile” el compilador desactiva ciertas optimizaciones, lo que supone una pérdida
de eficiencia. Por tanto, sólo debemos marcar como “volatile” las variables que realmente
lo requieran, es decir, las que se usan tanto en el bucle principal como dentro de la ISR.
Las interrupciones tienen efectos en la medición del tiempo de Arduino, tanto fuera como
dentro de la ISR, esto pasa porque Arduino emplea interrupciones de tipo Timer para
actualizar la medición del tiempo.
• La función millis no actualiza su valor, por lo que no podemos utilizarla para medir
el tiempo dentro de la ISR.
• Como consecuencia la función delay() no funciona, ya que basa su funcionamiento
en la función millis()
• La función micros() actualiza su valor dentro de una ISR, pero empieza a dar
mediciones de tiempo inexactas pasado el rango de 500us.
• En consecuencia, la función delayMicroseconds funciona en ese rango de tiempo,
aunque debemos evitar su uso porque no deberíamos introducir esperas dentro de
una ISR.
CREAR INTERRUPCIONES EN ARDUINO
Para definir una interrupción en Arduino se usa la función:
En el siguiente código se define el pin digital 10 como salida, para emular una onda cuadrada
de periodo 300ms (150ms ON y 150ms OFF). Para visualizar el funcionamiento de la
interrupción, en cada flanco activo del pulso simulado, se debe encender/apagar el LED
integrado en la placa, por lo que el LED parpadea a intervalos de 600ms (300ms ON y 300ms
OFF). Puede que a estas alturas ver parpadear un LED no parezca muy espectacular, pero no
es tan simple como parece. No se está encendiendo el LED con una salida digital, sino que es
la interrupción que salta la que enciende y apaga el LED (el pin digital solo emula una señal
externa).
void setup() {
pinMode(emuPin, OUTPUT);
pinMode(LEDPin, OUTPUT);
pinMode(intPin, INPUT_PULLUP);
void loop() {
digitalWrite(emuPin, HIGH);
delay(150);
digitalWrite(emuPin, LOW);
delay(150);
void blink() {
state = !state;
digitalWrite(LEDPin, state);