Вы находитесь на странице: 1из 5

INTERRUPCIONES EN EL MICRO CONTROLADOR Y MÓDULOS

ARDUINOS

Pérez Daniel
e-mail: daperez1@espe.edu.ec
Ubilluz Jonathan
e-mail: jiubilluz@espe.edu.ec

Electromecánica, Sexto, Universidad de las Fuerzas Armadas ESPE -Extensión Latacunga,


Márquez de Maenza S/N Latacunga, Ecuador.
Fecha de presentación: 09/02/17

RESUMEN: En programación una interrupción es una señal


recibida por el procesador o MCU, para indicarle que
En el siguiente escrito se va a detallar lo que se debe «interrumpir» el curso de ejecución actual y
puede hacer con las interrupciones en una placa
pasar a ejecutar código específico para tratar esta
Arduino y microcontrolador, de qué forma se puede
aprovechar una de las herramientas más interesantes situación. [1]
de Arduino y microcontroladores para los casos
requeridos. Hoy en día en el tiempo de la 2.1 PROCESAMIENTO DE
automatización y la era digital se vuelve vital aprender INTERRUPCIONES
cómo dar breves soluciones a través de estos
dispositivos ya que presentan grandes ventajas como
son: variedad y accesibilidad en el mercado, variedad  Terminar la ejecución de la instrucción
de aplicaciones, lenguajes de programación máquina en curso.
generales, entre otras, que hacen de arduino una  Salvar el estado del procesador (valores de
plataforma de gran alcance. registros y flags) y el valor del contador de
programa en la pila, de manera que en la
PALABRAS CLAVE: CPU, al terminar el proceso de interrupción,
pueda seguir ejecutando el programa a partir
Micro controlador, placa arduino, interrupciones, de la última instrucción.
pines, timer, millis.  La CPU salta a la dirección donde está
almacenada la rutina de servicio de
1. INTRODUCCIÓN interrupción (Interrupt Service Routine, o
abreviado ISR) y ejecuta esa rutina que tiene
como objetivo atender al dispositivo que
Las interrupciones se conocen como una solicitud
generó la interrupción.
exterior enviada a un ordenador, estas tienen carácter
de ejecución inmediata, generalmente se envía de  Una vez que la rutina de la interrupción
señales sensoriales, con la finalidad de alterar un termina, el procesador restaura el estado
proceso determinado o cambiar de operación. A que había guardado en la pila en el paso 2 y
través del termino servicio se realizan tres diferentes retorna al programa que se estaba usando
opciones, pueden ser las tres en paralelo, una o más anteriormente. [1]
de ellas en distintas secuencias estas son: Enviar
datos hacia el dispositivo, extraer datos del dispositivo
realizar algún proceso de actualización
En el estudio de los microcontroladores se conoce
que este dispositivo acepta dos tipos de
interrupciones que son: Las interrupciones por
periféricos y las externas

2. INTERRUPCIONES

Las interrupciones son señales que permiten al


controlador para el flujo normal del sketch y ejecutar
un trozo de código determinado de manera inmediata, Figura 1. Proceso de interrupciones. Tomado de
antes de continuar con lo que estaba realizando. wordpress, 2016, [1].

1
2.2 TIPOS DE INTERRUPCIONES  FALLING, Dispara en el flanco de bajada
(Cuando pasa de HIGH a LOW).
 Interrupciones HW o externas: Estas son  Y una solo para el DUE: HIGH se dispara
asíncronas a la ejecución del procesador, es cuando el pin esta HIGH. [2]
decir, se pueden producir en cualquier
momento independientemente de lo que Pines en arduino para el uso de
esté haciendo el CPU en ese momento. Las interrupciones.
causas que las producen son externas al
procesador y a menudo suelen estar ligadas
Sólo hay unos pocos pines en los que se pueden
con los distintos dispositivos de entrada o
realizar interrupciones y dependen del modelo de tu
salida.
placa. [2]
 Interrupciones SW: Las interrupciones por
software son aquellas generadas por un
programa en ejecución. Para generarlas, Tabla 1. Pin para cada tipo de interrupcion
existen distintas instrucciones en el código Fuente: educachip, 2015, [2]
máquina que permiten al programador
producir una interrupción (Arduino no
soporta las interrupciones por software).
 Un evento programado o Timer. Son las
interrupciones asociadas a los timers y
gracias a ellas funciona millis().
 Excepciones: Son aquellas que se producen
de forma síncrona a la ejecución del
procesador típicamente causada por una
condición de error en un programa.
Normalmente son causadas al realizarse
operaciones no permitidas tales como la Para que puedas asociar un módulo a una
división entre 0, el desbordamiento, el interrupción correctamente, éste debe cumplir unas
acceso a una posición de memoria no características concretas:
permitida, etc. [1].
No puede tener parámetros de entrada, es decir, no
puede ser una función del tipo void f_interrupt (int
3. INTERRUPCIONES EN ARDUINO entrada).

Internamente, Arduino tiene ciertas


interrupciones configuradas que lanza según la No puede devolver ningún valor, por tanto debe ser
situación. Para la transmisión de datos a través del un módulo de tipo void.
puerto se rige, para resetear la placa antes de cargar
un programa. Para que este segmento de código pueda interactuar
Las interrupciones pueden ocurrir por un cambio en con el resto de tu programa puedes crear una variable
un puerto (solo en aquellos que soporten de tipo volátil (por ejemplo volatile int variable), lo que
interrupciones HW), overflow en un timer, te permitirá leer el valor de dicha variable fuera del
comunicación serie (USART), etc. módulo asociado a la interrupción y actuar en
consecuencia. [2]
El procesador dentro de cualquier Arduino tiene dos
tipos de interrupciones: “externas” y “cambio de pin”.
3.1 INTERRUPCIONES EXTERNAS
Para definir una interrupción necesitamos tres cosas: EN ARDUINO

 Un pin de Arduino que recibirá la señal de Estas interrupciones hardware, se diseñaron por la
disparo necesidad de reaccionar a suficiente velocidad en
 Una condición de disparo tiempos inimaginablemente cortos a los que la
electrónica trabaja habitualmente y a los que ni
 Una función que se ejecutará, cuando se
dispara la interrupción (Llamada call back siquiera el software era capaz de reaccionar. [3]
function).
Tabla 2. Tabla de pines que soportan interrupción
En cuanto a la condición de disparo puede ser: HW en Arduino

 LOW, La interrupción se dispara cuando el


pin es LOW.
 CHANGE, Se dispara cuando pase de HIGH
a LOW o viceversa.
 RISING, Dispara en el flanco de subida
(Cuando pasa de LOW a HIGH).

2
Fuente: Arduino cc, 2015, [3] pin, luego la función ISR y finalmente el
modo.
 detachInterrupt() Deshabilita la interrupción.
El parámetro que se le pasa es el número de
la interrupción.
 digitalPinToInterrupt(pin) traduce el pin al
número de interrupción específica.
 usingInterrupt() Deshabilita la interrupción
externa pasada como parámetro en la
llamada a SPI.beginTransaction() y se
habilita de nuevo en endTransaction() para
prevenir conflictos en las transacciones del
bus SPI [3]

Para saber qué número de interrupción estás


3.2 INTERRUPCIONES INTERNAS EN
asociada a un pin, debemos usar la función ARDUINO
digitalPinToInterrupt(pin). El número de
interrupción su mapeo en los pines dependerá del Las interrupciones internas en Arduino son
MCI. El uso de número de interrupción puede aquellas interrupciones relacionadas con los timers y
provocar problemas de compatibilidad cuando el que también son denominadas interrupciones de
sketch funciona en diferentes placas. [3] eventos programados.
Arduino tiene tres timers. Son el timer cero, timer uno,
Tabla 3. Tabla de interrupciones y número de pin timer dos.Timer cero y uno son de 8 bits y el
asociado. Fuente: Arduino cc, 2015, [3] temporizador uno es de 16 bits.
Se Creara una interrupción interna utilizando la
interrupción de un temporizador. Para ello
necesitaremos una librería adecuada para el
temporizador que usemos. Podemos crear tres tipos
de interrupción interna, son interrupción de
desbordamiento de temporizador (timer overflow),
interrupción de comparación de salida (Output
Compare Match Interrupt), interrupción de captura de
entrada (Timer Input Capture Interrupt). [3]

4. INTERRUPCIONES EN MICRO
Aspectos importantes a tener en cuenta con el uso de
CONTROLADORES.
interrupciones:
En el caso de microcontroladores, una interrupción
es un evento que hace que el dispositivo deje de
 Dentro de la función llamada desde la ejecutar la tarea que está realizando para atender
interrupción, la función delay() no funciona y dicho acontecimiento y luego regrese y continúe la
el valor devuelto por millis() no aumenta. La tarea que estaba realizando antes de que se
razón es que estas funciones hacen uso de presentara la interrupción. El pic 16F628 (y el
interrupciones que no se disparan mientras 16F628A) tiene 10 fuentes de interrupción, si las
está disparada una interrupción externa. interrupciones están habilitadas cada vez que una de
 Los datos recibidos por el puerto serie se estos acontecimientos se presente el pic dejará de
pueden perder mientras se está en la función ejecutar el programa para ir a atender la interrupción
llamada por la interrupción. y al término de la misma continuará ejecutando el
 Se deben declarar como “volatile” cualquier programa donde lo había dejado. Las fuentes de
variable que sea modificada dentro de la interrupción son:
función llamada por una interrupción [3]
 Interrupción externa RB0/INT
 Interrupción por cambio lógico en el puerto B
Funciones de Interrupciones. (pines RB7 a RB4)
 Interrupción por desborde del timer 0
 interrupts() Habilita las interrupciones (antes (TMR0)
han debido ser inhabilitadas con  Interrupción por desborde del timer 1
noInterrupts) (TMR1)
 noInterrupts() Deshabilita las interrupciones.  Interrupción por comparación exitosa exitosa
Las interrupciones pueden ser habilitadas de en TMR2
nuevo con interrupts().  Interrupción del comparador
 attachInterrupt() Me permite configurar una  Interrupción del transmisor del USART
interrupción externa, pero no otro tipo de  Interrupción del receptor del USART
interrupciones. El primer parámetro es el  Interrupción del módulo CCP
número de interrupción que va asociado a un  Interrupción del EEPROM

3
//Se escribe el valor actual del LED.
5. APLICACIONES. digitalWrite(LED, estado_actual);
}
Arduino:
Se desea encender un LED mediante el uso de 6. APLICACIÓN DE INTERRUPCIÓN
interrupciones de tal manera que cada vez que se
presione un pulsador, éste se encienda. [3].
Interrupción externa:

Esta interrupción utiliza las mismas directivas y


funciones de la interrupción externa INT_EXT. Se
debe incluir en la directiva o habilitación de la función
el número 2 para referirse a la interrupción externa 2.
La interrupción es detectada por el cambio de estado
en el pin RB2, dependiendo del flanco que se haya
fijado. La figura 2, muestra el diagrama de conexiones
para utilizar la interrupción por RB2.

Figura 1. Encedido de led por interrupciones.


Tomado de Arduino cc, 2015, [3].

//Se declara una variable asociada al pin en el que s


e va a conectar.
int LED = 8;

//Se declara una variable volátil que cambiará de est


ado en el
//módulo de la interrupción y se utilizará fuera.
//Si la variable no se utilizase fuera del módulo de la i Figura 2. Interrupción externa
nterrupción
//no sería necesario crearla de tipo volátil. En el programa principal el LED1 conectado en RD0
volatile int estado_actual = LOW; parpadea indefinidamente. Al ocurrir el cambio de
estado (accionar el pulsador) en flanco de bajada un
//Se crea la función que se ejecutará cada vez que s LED2 conectado en RD1 parpadea 5 veces.
e active la
//interrupción. Esta función es de tipo void (por lo que
no devuelve
//ningún valor) y no tiene parámetros de entrada.
void fun_cambio_estado()
{
//Se cambia al estado contrario al actual, es decir, de
LOW se pasa
//a HIGH y de HIGH a LOW.
estado_actual = !estado_actual;
}

void setup()
{
//Se declara el pin digital correspondiente al LED co
mo salida.
pinMode(LED, OUTPUT);

//Se determina la interrupción 0 (por lo que el pin aso


ciado al pulsador
//será el 2 en caso de tratarse de un Arduino UNO o
similar) a la que se
//le asocia la función fun_cambio_estado que se acti
vará al presionar el
//pulsador (por tratarse del modo FALLING).
attachInterrupt(0, fun_cambio_estado, FALLING);
}

void loop()
{

4
7. CONCUCIONES Y
RECOMEDACIONES.

 Sólo se puede ejecutar una interrupción a la


vez y si se activa una segunda, no tendrá
efecto hasta que la primera termine.

 No es posible utilizar la función delay()


conjuntamente con las interrupciones.

 Si se desea utilizar la variable que es


modificada por la interrupción (estado
actual) fuera de ese módulo, se debe crearla
de tipo volatile y se puede deshabilitar las
interrupciones en cualquier momento
utilizando la instrucción noInterrupts()

Referencias
[1] Mocha, F. (26 de 11 de 2016). wordpress.
Obtenido de
https://aprendiendoarduino.wordpress.co
m/2016/11/13/interrupciones/
[2] Navarrete, R. (10 de 03 de 2015). Arduino cc.
Obtenido de
https://forum.arduino.cc/index.php?topic=
53141.0
[3] Romero, E. (14 de 10 de 2015). educachip.
Obtenido de
http://www.educachip.com/como-y-por-
que-usar-las-interrupciones-en-arduino/

Вам также может понравиться