Interrupciones en arduino

¿Que es una interrupción?

Las interrupciones se refieren al paro inmediato del funcionamiento común del sistema. Esto es muy útil para hacer que las cosas sucedan automáticamente en programas que sean sensibles a estados, también pueden ayudar con problemas de temporizadores. También puede servir para detener completa o parcialmente el sistema en caso de que algún evento especifico suceda.

Un ejemplo de como utilizar estas interrupciones sería el de un lector de datos por ejemplo un sensor de temperatura. Suponiendo que al inicio del programa se toma lectura de la temperatura después se llama una función que cree la estadísticas, se empaqueta, se manda por algún protocolo seguro y después hace otra lectura. Ahora bien si llegamos a tener una aumento de temperatura inesperado queremos que tome esa temperatura y la envíe, pero esto es un problema ya que el proceso de creación de estadística, empaquetado y envió es tarado, más sin embargo si se le asigna una interrupción a la lectura de temperaturas el programa entero es interrumpido y se ejecuta la lectura para después enviar los datos que son más importantes.

También si tenemos un sistema que este enviando datos cualesquiera para monitorearlos, podemos asignar una interrupción que se accione con un botón para detener el programa y poder utilizar los datos, o para dejar de recibir más datos, según sea el caso.

¿Cómo usar una interrupción con el arduino?

La mayoría de las placas arduino tienen dos interrupciones externas.

   Interrupcion externa 0 : ( pin digital 2 )
   Interrupcion externa 1: ( pin digital 3 )

Esto para el arduino UNO.

Para usar interrupciones tenemos la función:

 void attachInterrupt( interrupcion, funcion, modo )

Dicha función especifica que función se invoca cuando se produce una interrupcion externa, si ya existia una función adjuntada al pin se substituye por la nueva.

Los parámetros de esta función son:

  •   interrupcion: el número de la interrupción ( Es un int y puede ser 0 o 1 esto para asignar el pin a usar ).

  •   funcion: Es la función que se invocara cuando la interrupción suceda, esta funcion NO debe tener parametro NI tampoco devolver nada. Comunmente se le conoce como  rutina de interrupción de servicio.

  •   modo: Esto define el criterio de la interrupción es decir cuando se considerara como interrupción. Existen 4 constantes predefinidas para poder usarlas como modos. 

   LOW Se dispara la interrupción cuando el pin tenga un valor bajo ( Cero lógico o LOW ).


   CHANGE Se dispara la interrupción cuando el pin se tenga un valor alto ( Uno lógico o HIGH ).

   RISING Se dispara la interrupción cuando el pin pase de valor bajo a alto ( LOW a HIGH | 0 a 1 ).

   FALLING Se dispara la interrupción cuando el pin pase de valor alto a bajo ( HIGH a LOW | 1 a 0 ).


Como dato queda decir que también se cuenta con funciones para activar o desactivar el uso de las interrupciones. Con tan solo usar la función noInterrupts() se asegura de que no se interrumpa la porción de código que le sigue a esta función, también esta la función interrupts() que hace lo contrario, ya que permite las interrupciones.Esto puede ser útil dependiendo el caso y se maneja similar a los hilos y candados.
Podríamos tener una porción de código así:

     void loop() {
        noInterrupts();
        FuncionCritica();
        interrupts();
        funcionComun();
        funcionComun2();
   }

Ahora vemos como seria el diagrama de conexiones para realizar una prueba.

Basicamente es un push button, un led y un par de resistencias acomodadas de manera que  se puedan utilizar con el siguiente codigo.


De no utilizar las interrupciones, el led tendria un comportamiento un poco raro, ya que pudiese no captar bien las señales que se le envian.
Esto es muy familiar respecto a los threads y los candados.

4 thoughts on “Interrupciones en arduino

  1. Con el siguiente codigo? Donde está el codigo de ejemplo? No esta!

    ResponderEliminar
    Respuestas
    1. Un pequeño problema con el gist. Ya quedo listo, gracias por avisar.

      Eliminar
  2. pero ahi no se muestra ninguna interrupcion ya que, en el codigo no observo que la variable "interruptor" sufra cambio alguno..

    ResponderEliminar

Ever Medina. Con la tecnología de Blogger.