Subido por Ender Martinez

Timers 1 con Libreria

Anuncio
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.
Descargar