Está en la página 1de 5

UNIVERSIDAD TÉCNICA DEL NORTE 1

CARRERA DE INGENIERÍA ELECTRICA

Interrupciones por hardware y software en el


Arduino Uno y Mega
Edwin Santiago Imbaquingo Dávila.

una subrutina de servicio de interrupción, la cual, por lo general,


Resumen—Se realizará una búsqueda de sobre las diferentes
no forma parte del programa. Una vez finalizada dicha
interrupciones que pueden existir en el Arduino Uno y Arduino
Mega, ya se han estas por hardware o software. También se dirá subrutina, se reanuda la ejecución del programa. Las
una breve definición de interrupción y se pondrá un ejemplo de interrupciones HW son generadas por los dispositivos
una interrupción por hardware y software.
periféricos habilitando una señal del CPU (llamada IRQ del
Palabras clave—interrupción, Arduino, software. inglés “interrupt request”) para solicitar atención de este. Todos
los dispositivos que deseen comunicarse con el procesador por
Abstract— A search will be made of the different interruptions
that may exist in the Arduino Uno and Arduino Mega, whether medio de interrupciones deben tener asignada una línea única
they have been done by hardware or software. A brief definition capaz de avisar al CPU cuando le requiere para realizar una
of interrupt will also be given, and an example of a hardware and
software interrupt will be given. operación. Esta línea se denomina IRQ. Las IRQ son líneas que
llegan al controlador de interrupciones, un componente de
Keywords— interrupt, Arduino, software.
hardware dedicado a la gestión de las interrupciones, y que está
I. INTRODUCCIÓN integrado en la MCU. El controlador de interrupciones debe ser
n la presente investigación se realizará la búsqueda de las capaz de habilitar o inhibir las líneas de interrupción y
E interrupciones estas son una señal recibida por el establecer prioridades entre las mismas. Cuando varias líneas
procesador o MCU, para indicarle que debe «interrumpir» de petición de interrupción se activan a la vez, el controlador de
el curso de ejecución actual y pasar a ejecutar código específico interrupciones utilizará estas prioridades para escoger la
para tratar esta situación, también se explicada las interrupción sobre la que informará al procesador principal.
interrupciones que tiene el Arduino Uno y Arduino Mega, Se También puede darse el caso de que una rutina de tratamiento
explicará 2 ejemplos uno de estos será una interrupción de interrupción sea interrumpida para realizar otra rutina de
software y la otra será una interrupción hardware. tratamiento de una interrupción de mayor prioridad a la que se
estaba ejecutando[1].
II. INTERRUPCIONES

A continuación, se detalla la definición de interrupciones y las B. Procesamiento de una Interrupción

interrupciones del Arduino Uno y Mega. 1. Terminar la ejecución de la instrucción máquina en


A. Definición curso[1].
2. Salvar el estado del procesador (valores de registros y
En programación, una interrupción es una señal recibida por el flags) y el valor del contador de programa en la pila,
procesador o MCU, para indicarle que debe «interrumpir» el de manera que, en la CPU, al terminar el proceso de
curso de ejecución actual y pasar a ejecutar código específico interrupción, pueda seguir ejecutando el programa a
para tratar esta situación. Una interrupción es una suspensión partir de la última instrucción[1].
temporal de la ejecución de un proceso, para pasar a ejecutar
UNIVERSIDAD TÉCNICA DEL NORTE 2
CARRERA DE INGENIERÍA ELECTRICA
3. La CPU salta a la dirección donde está almacenada la comunicación I2C. El uso de interrupciones es casi obligatorio
rutina de servicio de interrupción (Interrupt Service en un programa avanzado de un microcontrolador. Básicamente
Routine, o abreviado ISR) y ejecuta esa rutina que cuando un evento ocurre se levanta una bandera y la ejecución
tiene como objetivo atender al dispositivo que generó se traslada a una rama de código diferente. De esta forma no es
la interrupción[1]. necesario esperar un loop a comprobar que un evento ha
4. Una vez que la rutina de la interrupción termina, el ocurrido para ejecutar una acción. Las interrupciones pueden
procesador restaura el estado que había guardado en la ocurrir por un cambio en un puerto (solo en aquellos que
pila en el paso 2 y retorna al programa que se estaba soporten interrupciones HW), overflow en un timer,
usando anteriormente[1]. comunicación serie (USART). Normalmente no se ve, pero las
interrupciones ocurren constantemente durante la operación
C. Tipos de Interrupciones normal de Arduino [1].

Interrupciones HW o externas: Estas son asíncronas a la


ejecución del procesador, es decir, se pueden producir en
cualquier momento independientemente de lo que esté haciendo
el CPU en ese momento. Las causas que las producen son
externas al procesador y a menudo suelen estar ligadas con los
distintos dispositivos de entrada o salida[1].

Ilustración 1: Interrupciones Arduino.


Interrupciones SW: Las interrupciones por software son
aquellas generadas por un programa en ejecución. Para IV. INTERRUPCIONES E XTERNAS EN ARDUINO
generarlas, existen distintas instrucciones en el código máquina
Estas interrupciones hardware, se diseñaron por la necesidad de
que permiten al programador producir una interrupción.
reaccionar a suficiente velocidad en tiempos
Arduino no soporta las interrupciones por software[1].
inimaginablemente cortos a los que la electrónica trabaja

Un evento programado o Timer. Son las interrupciones habitualmente y a los que ni siquiera el software era capaz de

asociadas a los timers y gracias a ellas funciona millis()[1]. reaccionar. Para las interrupciones externas o hardware, solo
hay dos pines que las soportan en los ATmega 328 (p.e.
Excepciones: Son aquellas que se producen de forma síncrona Arduino UNO), son las INT0 y INT1 que están mapeadas a los
a la ejecución del procesador típicamente causada por una pines 2 y 3. Estas interrupciones se pueden configurar con
condición de error en un programa. Normalmente son causadas disparadores en RISING o FALLING para flancos o en nivel
al realizarse operaciones no permitidas tales como la división LOW. Los disparadores son interpretados por hardware y la
entre 0, el desbordamiento, el acceso a una posición de memoria interrupción es muy rápida. El Arduino mega tiene más pines
no permitida, etc.[1]. disponibles para interrupciones externas. Pines de External
Interrupts para Mega: 2 (interrupt 0), 3 (interrupt 1), 18
III. INTERRUPCIONES EN ARDUINO (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt
2). Estos pines pueden ser configurados para disparar una
Internamente, Arduino (mejor dicho, el microcontrolador
interrupción al detectar un nivel bajo, un flanco ascendente, un
AtMega) tiene ciertas interrupciones configuradas que lanza
flanco descendente o un cambio de nivel [1].
según la situación. Para la transmisión de datos a través del
puerto serie, para reiniciar la placa antes de cargar un programa, Tabla de pines que soportan interrupción HW en Arduino:
UNIVERSIDAD TÉCNICA DEL NORTE 3
CARRERA DE INGENIERÍA ELECTRICA

Ilustración 3: Interrupciones Arduino.

VI. EJEMPLO PRÁCTICO


Ilustración 2: Interrupciones HW Arduino.
A. Controlando la velocidad de las luces del coche fantástico

Tabla de interrupciones y número de pin asociado: La mejor manera de aprender es poniendo en práctica lo
aprendido en la teoría. Para ello lo que vamos a hacer es el típico
sketch con las luces del coche fantástico. En este caso vamos a
controlar la velocidad con la que se mueve a través de
dos pulsadores.

B. Circuito eléctrico
Vamos a necesitar el siguiente material:
Ilustración 3: Interrupciones y pines Arduino.

En Arduino Uno dispone de dos interrupciones, 0 y 1, asociados  2 LEDs verdes


a los pines digitales 2 y 3.El Arduino Mega dispone de 6  3 LEDs rojos
interrupciones, en los pines 2, 3, 21, 20, 19 y 18  5 resistencias de 470 Ω
respectivamente[2].  2 pulsadores
 1 resistencia de 1 kΩ
V. INTERRUPCIONES INTERNAS EN ARDUINO
 Arduino UNO

Las interrupciones internas en Arduino son aquellas  Protoboard

interrupciones relacionadas con los timers y que también son  Cables macho/macho
denominadas interrupciones de eventos programados. Arduino
Cada pulsador irá conectado a un pin y tendrán una resistencia
tiene tres timers. Son el timer cero, timer uno, timer dos.Timer
pull-down. Esto hará que, en estado normal, sin pulsar, el pin
cero y dos son de 8 bits y el temporizador uno es de 16 bits.
tengamos un estado bajo. Cuando el pulsador se active
Crearemos una interrupción interna utilizando la interrupción
tendremos un estado alto. Por lo tanto, debemos de detectar un
de un temporizador. Para ello necesitaremos una librería
cambio de estado de bajo a alto (RISING). Por otro lado, los
adecuada para el temporizador que usemos. Podemos crear tres
LEDs van a hacer una secuencia de encenderse y apagarse de
tipos de interrupción interna, son interrupción de
izquierda a derecha y de derecha a izquierda. Simula las luces
desbordamiento de temporizador (timer overflow), interrupción
del coche fantástico. Empezaremos con una velocidad y según
de comparación de salida (Output Compare Match Interrupt),
vayamos pulsando los pulsadores se irá aumentando o
interrupción de captura de entrada (Timer Input Capture
disminuyendo la velocidad.
Interrupt) [1].
UNIVERSIDAD TÉCNICA DEL NORTE 4
CARRERA DE INGENIERÍA ELECTRICA
C. El esquema eléctrico es el siguiente. // Solo para el segundo pin y consecutivos apagamos el pin
anterior
// En el caso de 0 no hace falta ya que por defecto está
apagado
// Cuidado que nos salimos del rango del array 0-1=-1 no
existe este elemento
if (i > 0)
{
// Apagamos el LED a la izquierda
digitalWrite(leds[i - 1], LOW);
}

// Encendemos en el LED en el que estamos


digitalWrite(leds[i], HIGH);

// Esperamos el tiempo marcado por velocidad


delay(velocidad);
}

Ilustración 4: Ejercicio de Interrupciones. // Apagamos el último LED encendido, el elemento 5 del array
digitalWrite(leds[4], LOW);
D. Programación del sketch de interrupciones con Arduino
// Recorremos el array en sentido inverso de derecha a
// Variable global de velocidad izquierda
volatile int velocidad = 20; for (int i = 4; i >= 0; i--)
// Constantes de velocidad máxima, mínima y cuanto aumenta {
const int maxima = 1000; // En el primer caso como ya está apagado el LED no
const int minima = 20; hacemos nada
const int aumenta = 20; // Cuidado que nos salimos del rango del array 4+1=5 no
existe este elemento
// Array con los números de los pines donde están conectados if (i < 4)
// los LEDs de las luces del coche fantástico {
int leds[5] = {8, 9, 10, 11, 12}; // Apagamos el LED a la derecha
digitalWrite(leds[i + 1], LOW);
void setup() { }
// Inicializamos los pines de los LEDs como salida y a estado // Encendemos en el LED en el que estamos
bajo digitalWrite(leds[i], HIGH);
for (int i = 0; i < 5; i++)
{ // Esperamos el tiempo marcado por velocidad
pinMode(leds[i], OUTPUT); delay(velocidad);
digitalWrite(leds[i], LOW); }
}
// Apagamos el último LED encendido, el elemento 0 del array
// Asignamos la velocidad mínima digitalWrite(leds[0], LOW);
velocidad = minima;
}
// Configuramos los pines de interrupciones para que
// detecten un cambio de bajo a alto // ISR pin 2, disminuye la velocidad
attachInterrupt(digitalPinToInterrupt(2), velocidadMenos, void velocidadMenos()
RISING); {
attachInterrupt(digitalPinToInterrupt(3), velocidadMas, // Disminuimos el valor establecido
RISING); velocidad = velocidad - aumenta;

} // Si hemos llegado a la velocidad mínima no disminuímos


más
void loop() { if (velocidad < minima)
// Este primer bucle recorre el array de izquierda a derecha {
for (int i = 0; i < 5; i++) velocidad = minima;
{ }
}
UNIVERSIDAD TÉCNICA DEL NORTE 5
CARRERA DE INGENIERÍA ELECTRICA
digitales 2 y 3.El Arduino Mega dispone de 6 interrupciones, en
// ISR pin 3, aumenta la velocidad
los pines 2, 3, 21, 20, 19 y 18 respectivamente y mediante nos
void velocidadMas()
{ ejemplos de puedo analizar de una forma mas clara con es el
// Aumentamos el valor establecido
funcionamiento de las interrupciones.
velocidad = velocidad + aumenta;

// Si hemos llegado a la velocidad máxima no aumentamos VIII. RECOMENDACIÓN


más
Tener bien claro cuáles son los pines con los que podemos
if (velocidad > maxima)
{ trabajar para realizar las interrupciones y poder aplicarlos e una
velocidad = maxima;
forma correcta al momento de una práctica.
}
}
IX. REFERENCIAS
E. Ejercicios Interrupciones Arduino
[1] “Interrupciones | Aprendiendo Arduino.”
El siguiente código empleamos el mismo pin digital para https://aprendiendoarduino.wordpress.com/2016/11/13
/interrupciones/ (accessed Jan. 16, 2021).
emular una onda cuadrada, esta vez de intervalo 2s (1s ON y 1s [2] “Qué son y cómo usar interrupciones en Arduino.”
OFF). En cada interrupción actualizamos el valor de un https://www.luisllamas.es/que-son-y-como-usar-
interrupciones-en-arduino/ (accessed Jan. 16, 2021).
contador. Posteriormente, en el bucle principal, comprobamos
el valor del contador, y si ha sido modificado mostramos el
nuevo valor. Al ejecutar el código, veremos que en el monitor
serie se imprimen números consecutivos a intervalos de dos
segundos.

Ilustración 5: Ejercicio de Interrupciones.

VII. CONCLUSIÓN
Se analizo el concepto deinterrupciones en Arduino Uno
dispone de dos interrupciones, 0 y 1, asociados a los pines

También podría gustarte