INTERRUPCIONES con Arduino ¿Qué son las interrupciones? Imagina que estás cocinando, ya colocaste agua a hervir, ya licuaste todo lo necesario y de repente tocan el timbre de tu casa, te están interrumpiendo, entonces tu función en ese momento será ir a abrir la puerta, atender a la persona y cerrar la puerta, cuando terminas, regresas a cocinar, pero no vuelves a empezar, sino que sigues cocinando desde donde te quedaste. Cuando se activa una interrupción, el microcontrolador dejará de hacer lo que está haciendo para realizar la función de interrupción (ISR = Rutina de Servicio de Interrupción) que se haya declarado anteriormente, para después regresar a donde se había quedado. Una interrupción puede verse como un aviso que puede ser activado tanto por algún proceso específico del microcontrolador (desborde de timer) o por un cambio externo al mismo (cambio de un pin). Las interrupciones permiten a cualquier suceso interior o exterior interrumpir la ejecución del programa principal en cualquier momento. Cuando se produce la interrupción, el Arduino ejecuta un salto, a la Rutina de Servicio de Interrupción (ISR), previamente definida por el programador, donde se atenderá a la demanda de la interrupción. El Arduino Nano y UNO posee tres Timers, el Timer0 que es de 8 bits, el Timer1 que es de 16 bits y el Timer2 que es de 8 bits. Es muy común utilizar el Timer1 ya que el Timer0 lo utiliza el mismo Arduino para generar los retardos de las funciones delay(), millis() y microSecond(), por tal razón es muy poco probable que se use, a menos que se utilice para hacer los retardos por el mismo programador, y así no usar dichas funciones, pero por lo general no se utiliza dicho Timer0. El Timer1 es más común utilizarlo, y de hecho se utilizará tanto usando una librería, como también utilizando los Registros Internos del Arduino (Atmega328p) para su configuración, lo cual trae como ventaja, que reduce el uso de memoria del Sketch, se ejecuta más rápido el programa, y adicionalmente se puede configurar, de manera de utilizar también otros pines del Arduino como Interrupciones Externas. Se debe tener cuidado cuando se vaya a utilizar servomotores, ya que, si se van a utilizar en nuestros proyectos, es muy probable que se utilice la Librería de Arduino para tal fin y en la Librería de Arduino para los Servos utilizan el Timer1 y por lo tanto no se puede utilizar el Timer1, si se van a manejar los Servos con la Librería de Arduino. El Arduino Nano y UNO posee también el Timer2 que es de 8 bits, pero en este caso se debe trabajar con los Registros Internos del Arduino (Atmega328p) para su configuración, el cual trabaja prácticamente igual al Timer0. Siempre que se utilice algún Timer, se estará utiliza como Interrupción, lo cual tiene muchas aplicaciones en el área de sistemas de control. En la siguiente tabla se muestra algunas Interrupciones del Atmega328p, y por lo tanto del Arduino Nano y UNO: Los Timers tienen dos formas de activar la interrupción, que es por OVERFLOW o Desbordamiento y por Comparación (CTC) con un número (el cual se colocará en un registro particular). Interrupción del Timer1 usando la Librería de Arduino Lo primero que se debe hacer es bajar la librería del Timer1, y para tal fin se debe abrir el IDE de Arduino y utilizar la pestaña “Programa”, luego “Incluir Librería” y finalmente se selecciona en “Administrar Bibliotecas”, como se muestra en la siguiente figura: Al darle click al “Administrar Bibliotecas”, se abrirá el “Gestor de Librería” y se colocará “Timerone” y se tendrá lo siguiente: Entonces le damos Instalar a la que dice “TimerOne”. Al ya tenerla Instalada le saldrá el Gestor de Librería como sigue: Ya no le mostrará la opción de “Instalarla” ya que la instalación se realizó correctamente y se puede ahora usar el “TimerOne” en nuestro código. Entonces lo primero que se debe colocar en nuestro Sketch es la librería como se muestra a continuación: Luego se pasa a configurar el TimerOne en la parte del Setup de IDE: Sintaxis: Timer1.initialize(periodo); El periodo se debe colocar en microsegundos. El valor de periodo lo que indica es cada cuando tiempo se generará la Interrupción, entonces si el periodo toma un valor de 500.000 microsegundos, entonces la interrupción debido al TimerOne se activará cada 0,5 segundos que son los 500.000 micrsegundos. Esto se repitará todo el tiempo mientras se tenga activada la interrupción del TimerOne. Después se debe crear un Objeto como es común cuando utilizamos otras librerías, en este caso la Sintaxis es la siguiente: Timer1.attachInterrupt(ISR); Donde “ISR” es la función donde se va a ir el Arduino cuando ocurra la interrupción debido al TimerOne. El Arduino dejará de hacer cualquier actividad que esté realizando en el “Loop” y se va a atender a la Rutina de Servicio de Interrupciones (ISR), el nombre de la función “ISR” puede darle cualquier nombre el programador, solo debe cuidar que no sea un nombre Reservado en el Arduino. Se muestra un ejemplo donde se manda a activar la Interrupción del “TimerOne” cada 500.000 microsegundos, que es 0,5 segundos, en la cual mandará a imprimir por el puerto serial un mensaje indicando que “Se activó la Interrupción”, mientras tanto en el “Loop” se hará que se prendan y se apaguen dos leds cada 3 segundos, y así observar que mientras ocurren los delay() en la función “Loop” igualmente se activa la Interrupción del “TimerOne”. La función (ISR) que se llama cuando ocurre la interrupción se colocará como “Mensaje” (recuerde que lo puede llamar como el programador desee). El Sketch queda de la siguiente manera: En el Sketch se ve una variable que se Time, que se define como “Volatile” y esto es porque cuando se utiliza una variable en la función (ISR) que llama la Interrupción, se recomienda definirla con este tipo de variable.