You are on page 1of 8

Interrupciones

Una peticin de interrupcin IRS ("Interrupt Request Service") es una seal que se origina
en un dispositivo hardware (por ejemplo, un perifrico), para indicar al procesador que algo
requiere su atencin inmediata; se solicita al procesador que suspenda lo que est haciendo
para atender la peticin.
Las interrupciones juegan un papel fundamental, en especial en la operacin de
dispositivos E/S. Sin ellas el sistema debera chequear constantemente los dispositivos
para comprobar su actividad, pero las interrupciones permiten que los dispositivos puedan
permanecer en silencio hasta el momento que requieren atencin del procesador. Podra
figurarse un sistema telefnico donde hubiera que levantar peridicamente el auricular
para comprobar si alguien nos llama?
En el Arduino UNO, hay dos interrupciones externas disponibles. Estos se encuentran en
los pines digitales 2 y 3 de la placa Arduino UNO, aunque estas interrupciones se llaman 0 y
1.
Las interrupciones externas (INT0 e INT1) de arduino pueden ejecutarse porque la seal de
entrada de un pin est:

Est en nivel bajo (tiene el valor de 0) LOW

Ha cambiado de situacin (tanto para flanco de subida como de bajada) CHANGE

Cambia a nivel alto (flanco de subida) RISING

Cambia a nivel bajo (flanco de bajada) FALLING

Interrupciones
En este ejemplo veremos como acta la interrupcin externa (int0)
del pin 2. Cuando pulsemos el pulsador el led se apagar y cuando
lo soltemos se encender. Para poder apreciar la diferencia se
programar el ejercicio 2 veces. Al principio se har sin
interrupciones y tras ver como responde se volver a hacer el mismo
ejercicio con la interrupcin arriba mencionada.
Hardware Necesario

Placa Arduino
Pulsador
LED
Resistecia de 330 ohms
Resistecia de 10K ohms
Circuito

imagen desarrollada utilizando Fritzing. Para mas circuitos de ejemplo, visita la pgina del proyecto
Fritzing

Conectar el
10K ohm. El
pin digital
extremo del

pin de 5V a uno de los extremos de la resistencia de


otro extremo de la resistencia hay que conectarlo a el
2 (INT0) y a uno de los extremos del pulsador. El otro
pulsador hay que conectarlo a masa.

El pin digital 4 hay que conectarlo a la pata larga del diodo (el
nodo) y la corta mediante una resistencia de 330 ohm en serie a
masa.

E s qu e ma

C o de
Cuando el pulsador est en estado de reposo el led est apagado,
pero al pulsar el pulsador se apaga. Al final del programa hay un
bucle donde pierde el tiempo ya que se supone que hace alguna
funcin compleja que requiere mucho tiempo. Este hecho produce que
cuando el pulsador cambia de estado, el led no lo har a la vez.
Normalmente habr que mantener cierto tiempo el pulsador en su
nueva situacin para que el programa salga del bucle complejo y
cambie la situacin del led.
int pbIn = 2;
int ledOut = 4;
int state = LOW;

// Digital input on pin 2


// The output LED pin
// The input state

void setup()
{
// Set up the digital Pin 2 to an Input and Pin 4 to an Output
pinMode(pbIn, INPUT);
pinMode(ledOut, OUTPUT);
}

void loop()
{
state = digitalRead(pbIn);
digitalWrite(ledOut, state);

//Read the button


//write the LED state

//Simulate a long running process or complex task


for (int i = 0; i < 100; i++)

{
// do nothing but waste some time
delay(10);
}
}

En el ejercicio anterior se ha podido apreciar que ante unos


cambios de estado del pulsador muy rpidos el programa no detectaba
este hecho, por lo que el led no cambiaba de estado. Este problema
se soluciona mediante una interrupcin que lee el estado del
pulsador (pin 2). La interrupcin se activa mediante la funcin
attachInterrupt()
attachInterrupt(pbIn, stateChange, CHANGE);

La funcin attachInterrupt () recibe 3 argumentos: La interrupcin


que se activar, la funcin que se ejecutar al activarse la
interrupcin, el estado de la seal por la que se activar la
interrupcin.
int pbIn = 0;
// Digital input on pin 2
int ledOut = 4;
// The output LED pin
volatile int state = HIGH;
// The input state
void setup()
{
// Set up the digital pin 2 to an Interrupt and Pin 4 to an Output
pinMode(ledOut, OUTPUT);
digitalWrite(ledOut, state);
//Led On
//Attach the interrupt to the input pin and monitor for ANY Change
attachInterrupt(pbIn, stateChange, CHANGE);
}
void loop()
{
//Simulate a long running process or complex task
for (int i = 0; i < 100; i++)
{
// do nothing but waste some time
delay(10);
}
}
void stateChange()
{
state = !state;
digitalWrite(ledOut, state);
}

El circuito electrnico puede crear rebotes que engaen a la


interrupcin y a veces no responda adecuadamente. Esto se soluciona
sustituyendo el pulsador por un circuito antirebotes.

Nota
Dentro de la funcin enlazada, la funcin delay() no funciona y el
valor devuelto por la funcin millis() no se incrementar. Los
datos serie recibidos en el transcurso de esta interrupcin pueden
perderse. Deberas declarar como voltil cualquier variable que
modifiques dentro de la funcin.

attachInterrupt(interrupcion, funcion, modo)


Descripcin
Especifica la funcin a la que invocar cuando se produce una interrupcin externa.
Reemplaza cualquier funcin previa que estuviera enlazada a la interrupcin. La mayora de
las placas Arduino tienen dos interrupciones externas: Las nmero 0 (en el pin digital 2) y
la 1 (en el pin digital 3). La Arduino Mega tiene otras cuatro: Las nmero 2 (pin 21), 3 (pin
20), 4 (pin 19) y 5 (pin 18).
P a r me t r o s
interrupcion: el nmero de la interrupcin (int)
funcion: la funcin a la que invocar cuando la interrupcin tiene lugar; esta funcin no
debe tener parmetros ni devolver nada. Esta funcin es a veces referenciada como rutina
de interrupcin de servicio
modo define cuando la interrupcin debe ser disparada. Hay cuatro constantes
predefinidas como valores vlidos:

LOW para disparar la interrupcin en cualquier momento que el pin se encuentre a


valor bajo(LOW).

CHANGE para disparar la interrupcin en culquier momento que el pin cambie de


valor.

RISING para disparar la interrupcin cuando el pin pase de valos alto (HIGH) a
bajo (LOW).

FALLING para cuando el pin cambie de valor alto (HIGH) a bajo (LOW)
Retorno
Ninguno
Nota
Dentro de la funcin enlazada, la funcin delay() no funciona y el valor devuelto por la
funcin millis() no se incrementar. Los datos serie recibidos en el transcurso de esta
interrupcin pueden perderse. Deberas declarar como voltil cualquier variable que
modifiques dentro de la funcin.
Usando las interrupciones
Las interrupciones son tiles para hacer que las cosas sucedan automticamente en
programas para microcontroladores, y puedan ayudar a resolver problemas de
temporizacin. Una buena tarea en la que utilizar interrupciones podra ser leer un encoder
rotacional, monitorizando la entrada del usuario.

Si quisieras asegurarte de que un programa siempre captura los pulsos de un encoder


rotacional, sin perder nunca un pulso, sera muy complicado escribir un programa que haga
otra cosa, puesto que el programa debera estar constantemente consultando las lneas del
sensor del encoder, de forma que capture los pulsos cuando tienen lugar. Otros sensores
tienen un interfaz dinmico similar, como intentar leer un sensor de sonido que intenta
capturar un click, o un sensor de ranuras por infrarrojos (fotointerruptor) tratando de
capturar el paso de una moneda. En todas estas situaciones, usar una interrupcin, libera al
microcontrolador de realizar otras tareas sin echar en falta el "timbre".
E j e m pl o
int pin = 13;
volatile int estado = LOW;

void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, parpadeo, CHANGE);
}

void loop()
{
digitalWrite(pin, estado);
}

void parpadeo()
{
estado = !estado;
}

noInterrupts()
Descripcin
Desactiva las interrupciones (pueden reactivarse usando interrupts()). Las interrupciones
permiten que las operaciones importantes se realicen de forma transparente y estn
activadas por defecto. Algunas funciones no funcionarn y los datos que se reciban sern
ignorados mientras que las interrupciones estn desactivadas. Las interrupciones pueden
perturbar ligeramente el tiempo de temporizado, sin embargo puede que sea necesario
desactivarlas para alguna parte crtica del cdigo.

P a r me t r o s
Ninguno
Devuelve
Nada
E j e m pl o
void setup() {}

void loop()
{
noInterrupts();
// Cdigo dependiente crticamente del tiempo
interrupts();
// resto del cdigo aqu
}

interrupts()
Descripcin
Activa las interrupciones (despus de haberlas desactivado con noInterrupts(). Las
interrupciones permiten que se ejecuten ciertas tareas en segundo plano que estn
activadas por defecto. Algunas funciones no funcionarn correctamente mientras las
interrupciones estn desactivadas y la comunicacin entrante puede ser ignorada. Las
interrupciones pueden perturbar ligeramente la temporizacin en el cdigo y deben ser
desactivadas slo para partes particularmente crticas del cdigo.
P a r me t r o s
Ninguno
Devuelve
No devuelve nada
E j e m pl o
void setup() {}

void loop()
{
noInterrupts();

// cdigo crtico y sensible al tiempo


interrupts();
// otro cdigo
}

detachInterrupt(interrupt)
Descripcin
Apaga la interrupcin dada.
P a r me t r o s
interrupt: el nmero de interrupcin a invalidar (0 o 1).

You might also like