Manejo de interrupciones en arduino

Publicado el: 24 de abril de 2015
Principiante
Acerca de este proyecto
Se muestra como trabajar con las interrupciones en arduino y asi poder atender eventos sin afectar el ciclo principal del programa.
Publicidad
DETALLES

Es muy común que en una aplicaciòn con microcontroladores se tenga que monitorizar el estado de sus entradas y asi tomar una decisiòn en su salida de acuerdo a si se presenta un cambio en alguna de las entradas.

Un horno microondas por ejemplo, al momento de estar en ejecución moviendo motor que activa el plato giratorio, activando el display del tiempo restante, a su vez debe estar atento a si presiona alguna tecla; otro ejemplo serìa una màquina de juegos, en la cual constantemente se estàn presionando los botones.

Si dentro del ciclo principal del programa incluimos el código encargado de revisar o monitorizar el estado de las entradas, esto podria presentar un problema, ya que si el loop principal debe estar haciendo cosas que toman muchisimo tiempo o realizando varias tareas al tiempo, dificilmente se podria capturar en el momento oportuno en que ocurra un cambio en la entrada, ya sea que se presione un botòn, o se active un sensor.

 Para solucionar este problema los diseñadores de microcontroladores desarrollaron lo que son las interrupciones, lo cual como su nombre indica, lo que hace es interrumpir de manera temporal la ejecuciòn de la tarea que estaba realizando el micro, atender un evento que se haya presentado y luego regresar a lo que estaba haciendo. Las interrupciones deben ser atendidas en el mismo instante en que son solicitadas.

En todo microcontrolador existen interrupciones internas y externas.

Las internas son las que se producen debido a desborde en los temporizadores (timers) del micro, debido al módulo comparador, de fin de escritura en la memoria EEPROM.

- Interrupciones por cambio a nivel de hardware: estas se producen cuando ocurre un cambio de nivel lógico en las entradas, ya sea por flanco o por nivel.

INTERRUPCIONES EXTERNAS EN EL ARDUINO.

En este artículo ahondaremos sobre las interrupciones externas para arduino.

 Pines utilizados para interrupciones en Arduino:

La siguiente tabla muestra los pines asociados para cada interrupción dependiendo del modelo de la placa Arduino. Observamos que el modelo DUE todos sus pines pueden ser utilizados como interrupciones.



DE QUE MANERA SE PUEDEN ACTIVAR LAS INTERRUPCIONES EXTERNAS

En arduino hay 4 formas de activar una interrupción por hardware:

  • LOW: cuando el nivel lógico de la entrada es de 0V (nivel 0).
  • FALLING: cuando el nivel lógico de la entrada cambia de 0 a 1, ( de BAJO a ALTO).
  • RISING: cuando el nivel lógico de la entrada cambia de 1 a 0, ( de ALTO a BAJO).
  • CHANGE: esta se activa cuando el nivel lógico de la entrada que procesa la interrupción cambia de 0 a 1, o de 1 a 0, es decir, cuando pasa ya sea de nivel BAJO a ALTO, o de ALTO a BAJO.
  • HIGH: sólo disponible en el modelo DUE, se activa cuando el nivel lógico es ALTO (1).

Ahora que sabemos cuales son los pines asociados a las interrupciones para cada modelo de placa y de que modos se pueden activar, veremos como asociar en arduino el código para las interrupciones.

La función para el manejo de interrupciones es: attachInterrupt, que lleva 3 parámetros:

-interrupt: el número de la interrupción a utilizar (NO es el número del pin al que está conectado la interrupción ).

  Sólo  se asigna el número del pin en el modelo DUE.

-función: la función o rutina a ejecutar cada que se active la interrupción.No debe llevar parámetros y no debe retornar ningún valor.

-modo: define el modo en el cual debe activarse la interrupción. Según los modos descritos.

Si a manera de ejemplo, tenemos un circuito donde debemos encender y apagar un led cada 5 segundos, que estará conectado al pin 4, pero a su vez cuando presionemos un interruptor conectado al pin 2 este debe encender y apagar un led conectado al pin 13. Según el circuito mostrado en la siguiente figura:


Como el interruptor está conectado al pin 2, sabemos según la tabla que es la interrupción 0, por lo tanto debemos escribir una rutina que cada que se active la interrupción encienda el led #2 y se apague cuando se suelte el interruptor.

Las interrupciones son un tema muy importante en el mundo de los microprocesadores y microcontroladores, por lo tanto, es indispensable que se manejen correctamente. En el arduino es fácil su implementación, para mayor información favor consultar la referencia original de la pagina web.

Descargar codigo fuente programa arduino.

 






CODIFICACIÓN
Codigo de prueba en arduino-

const int  led1 =4;     // Led parpadeante cada 5 segundos.
const int  led2 = 13;  // Led que se encenderá al presionar el interruptor.
volatiile int estado = LOW; //Variable temporal para almacenar el estado del LED #1.
void setup()
{
pinMode(d1,OUTPUT);
pinMode(d2,OUTPUT);
attachInterrupt(0,encender,CHANGE)  //Aca configuramos la interrupción, como está conectado al pin 2 se le asigna el   número 0. encende es la función que se ejecuta cada que se activa la interrupción y CHANGE es el modo, es decir, e este caso se activará cuando se presione y cuando se suelte el interruptor.
}
void encender()
{
estado = !estado;  //si estado era 0 pasa a 1, si era 1 pasa a 0, asi, como estado inicialmente estaba configurado a nivel LOW, cuando se presiona el interruptor se activa la interrupción, estado pasa a ser ALTO, por lo tanto enciende el led conectado al pin 13. Cuando se suelta el interruptor, nuevamente se activa la interrupción ya que su nivel lógico cambia y como esta configurada en modo CHANGE, ejecuta la rutina encender, com estado había quedado en ALTO, estado pasa a ser el inverso, o sea, BAJO y se apaga el led #2. Todo esto ocurre sin afectar al loop principal.
digitalWrite(led2,estado);
}
void loop()
 {
 digitalWrite(d1,HIGH);   //Enciende el led #1
 delay(5000);     // Lo mantiene encendido por 5 segundos.
 digitalWrite(d1,LOW);  // Apaga el led #1
 delay(5000);      // Lo mantiene apagado por 5 segundos.
}

Autor: sistemasymicros
26 proyectos 6 seguidores 0 siguiendo

Ingeniero en electrónica. Maker, apasionado por la programación. Sigueme en sistemasymicros.

PROYECTOS RELACIONADOS
COMENTARIOS
Para publicar un comentario debes