Professional Documents
Culture Documents
Para que puedas asociar un mdulo a una interrupcin correctamente, ste debe
cumplir unas caractersticas concretas:
Supn que quieres encender un LED o cualquier otro dispositivo mediante el uso
de interrupciones (recuerda que en el caso del LED debes aadirle una
resistencia, puedes leer ms sobre la configuracin de LEDs en este post), de tal
manera que cada vez que se presione un pulsador, ste se encienda.
Una vez configurado un circuito para tu pulsador como el que puedes ver,
conectado al pin correspondiente de interrupcin que prefieras (en este caso el pin
2, es decir, la interrupcin 0), debes elegir el modo en el que se activar dicha
interrupcin. Aunque quizs a primera vista pienses que el modo que debes elegir
es LOW, recuerda que en ese estado la funcin se estara ejecutando mientras
tuvieses presionado el pulsador. Para evitar esto, debes seleccionar el modo
RISING o el FALLING segn prefieras que tu LED se encienda al presionar o
levantar el pulsador.
void setup()
{
//Se declara el pin digital correspondiente al LED como
salida.
pinMode(LED, OUTPUT);
void loop()
{
//Se escribe el valor actual del LED.
digitalWrite(LED, estado_actual);
}
1 int interrupcion = 0;
Por otra parte, tenemos que definir la funcin a la que se llamar al detectarse la
interrupcin. En este caso, hemos llamado a la funcin funcionInterrupcin, y la definimos
con el mismo nombre que hemos puesto en attachInterrupt. La funcin entonces es:
1 void funcionInterrupcion(){
3 Serial.println(numInterrupt);
4 numInterrupt++;
5}
El cdigo
Aqu podis ver el cdigo completo. Recordad que tambin podis descargar el cdigo
junto con las imgenes utilizadas al final de esta entrada.
1 int interrupcion = 0;
8 */
11
12 void setup() {
13
14 Serial.begin(9600);
15
16 // Sintaxis interrupciones:
17 // attachInterrupt(numero_interrupt,funcin_a_ejecutar,modo);
18 // Modos LOW,CHANGE,RISING,FALLING
19
20 attachInterrupt(interrupcion, funcionInterrupcion, FALLING);
21 }
22
23 void loop() {
24
28 */
29 while(true){
30 Serial.print(".");
31 delay(250);
32 }
33 }
34
35 void funcionInterrupcion() {
37 Serial.println(numInterrupt);
39 }
detachInterrupt(pin)
Si attachInterrupt() nos permite configurar un pin como interrupcin, el
mtodo detachInterrupt() anula esa configuracin. Como parmetro le
pasamos el pin y lo podemos hacer con la
funcin digitalPinToInterrupt(nmero de pin) que nos devolver el ordinal
del pin del que queremos anular la configuracin.
Programacin de interrupciones externas
Dependiendo de la tarjeta Arduino que se vaya a trabajar, existen 2 o
ms pines que responden a cambios externos, asociados a
interrupciones. Para el Arduino UNO son:
//No recomendada:
Mode: Define cul es el tipo de cambio a detectar en el pin. Puede ser LOW
(detecta el pin en estado bajo), CHANGE (detecta un cambio en el estado del
pin), RISING (detecta flancos de subida) y FALLING (detecta flancos de
bajada).
En el caso de querer deshabilitar una interrupcin previamente habilitada,
se puede usar la funcin detachInterrupt(), cuya sintaxis es:
//recomendada
detachInterrupt(digitalPinToInterrupt(pin));
//no recomendada
detachInterrupt(interrupt);
http://picolab.com.co/educacion/2017/03/18/interrupciones-externas-arduino/
Tipos de Interrupciones:
Para las interrupciones externas o hardware, solo hay dos pines que las soportan en los
ATmega 328 (p.e. Arduino UNO), son las INT0 y INT1 que estn mapeadas a los pines 2 y 3.
Estas interrupciones se pueden configurar con disparadores en RISING o FALLING para
flancos o en nivel LOW. Los disparadores son interpretados por hardware y la interrupcin es
muy rpida.
El Arduino mega tiene ms pines disponibles para interrupciones externas. Pines de External
Interrupts para Mega: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20
(interrupt 3), and 21 (interrupt 2). Estos pines pueden ser configurados para disparar una
interrupcin al detectar un nivel bajo, un flanco ascendente, un flanco descendente o un
cambio de nivel.
En el pin de reset tambin hay otra interrupcin que slo se dispara cuando detecta voltaje
LOW y provoca el reset del microcontrolador.
Esto quiere decir que el Arduino UNO puede definir dos interrupciones hardware llamadas 0 y
1, conectadas a los pines 2 y 3
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
32u4 based (e.g Leonardo, Micro) 3 2 0 1 7
Arduino Due tiene grandes capacidades a nivel de interrupciones que permiten asociar una
interrupcin a cada uno de los pines disponibles. Arduino Zero permite asociar una
interrupcin a todos los pines excepto para el pin 4.
Las interrupciones de hardware, tambin conocidas como INT0 e INT1, llaman a una rutina de
servicio de interrupcin cuando algo sucede con uno de los pines asociados. La ventaja es
que Arduino tiene una simple rutina de configuracin para conectar la rutina de servicio de
interrupcin al evento: attachInterrupt (). La desventaja es que slo funciona con dos pines
especficos: pin digital 2 y 3 en la placa Arduino.
El Atmega328p solo tiene dos interrupciones de hardware INT0 e INT1, sin embargo los
microcontroladores AVR pueden tener una interrupcin ante un cambio en cualquier pin, es lo
que denomina pin change interrupt. http://playground.arduino.cc/Code/Interrupts. Estas
interrupciones no son soportadas directamente por Arduino y necesitan ser accedidas a travs
de una librera adicional.
Las interrupciones de cambio de pin pueden habilitarse en ms pines. Para los ATmega
328, pueden habilitarse en cualquiera de los pines de seal disponibles. Estas son disparadas
igual en flancos RISING o FALLING, pero depende del cdigo de la interrupcin configurar el
pin que recibe la interrupcin y determinar qu ha pasado. Las interrupciones de cambio de
pin estn agrupadas en 3 puertos de la MCU, por lo tanto hay 3 vectores de interrupciones
para todo el conjunto de pines. Esto hace el trabajo de resolver la accin en una interrupcin
ms complicada.
Si necesita ms pines para interrupciones, hay un mecanismo para generar una interrupcin
cuando se cambia cualquier pin en uno de los puertos de 8 bits. No sabes pin, sino slo en
qu puerto. Si se genera una interrupcin cuando se cambia uno de los pines ADC0 a ADC5
(utilizado como entrada digital). En ese caso, se llama a la rutina de servicio de interrupcin
ISR (PCINT1_vect). En la rutina se puede averiguar cul de los pines especficos dentro de
ese puerto ha sido el que ha cambiado.
PCICR |= 0b00000001; // turn on port b
PCICR |= 0b00000010; // turn on port c
PCICR |= 0b00000100; // turn on port d
PCICR |= 0b00000111; // turn on all ports
3 - Escribir el ISR
El ltimo paso es escribir el ISR que se llamar para cada una de estas
interrupciones. Las directrices generales sobre los ISR son hacerlos lo ms cortos
posible y no utilizar retrasos en ellos. Adems, debe deletrearlos y capitalizarlos
correctamente (ver aqu ). Por ltimo, si se utilizan variables en estos ISR, se desea
que la variable sea voltil; Esto le dice al compilador que podra cambiar en
cualquier momento y volver a cargarlo cada vez en lugar de optimizarlo. Para
definir estos ISR simplemente escriba la funcin debajo de su bucle.