Interrupción del temporizador Arduino: todo lo que debes saber

Si estás trabajando con un temporizador Arduino, es importante comprender cómo gestionar las interrupciones. En este artículo, te proporcionaremos todo lo que necesitas saber sobre la interrupción del temporizador Arduino, incluyendo su funcionamiento, ventajas y cómo implementarla en tus proyectos. ¡Sigue leyendo para dominar esta importante función en el mundo de la programación de Arduino!

Si estás buscando una guía completa sobre cómo dominar las interrupciones del temporizador Arduino, ¡has venido al lugar correcto! Esta guía completa le proporcionará toda la información que necesita sobre las interrupciones del temporizador y le ayudará a convertirse en un experto en poco tiempo. Con las interrupciones del temporizador Arduino, es fácil automatizar tareas, haciendo que sus proyectos sean más eficientes y confiables. Desde la configuración del hardware hasta la manipulación de registros y códigos, esta guía profundiza en todos los detalles esenciales de las interrupciones del temporizador Arduino. ¡Así que abróchate el cinturón y sumérgete en el fascinante mundo de los temporizadores Arduino!

Contenido

Proceso general de interrupción del temporizador Arduino

Tanto Arduino Uno como Mega admiten una única interrupción del temporizador de hardware que deja al usuario responsable de escribir el código para configurar y administrar interrupciones adicionales. Esto se hace configurando una 'rutina de servicio de interrupción del temporizador' (o ISR). Para hacer esto, primero debe configurar el temporizador que generará una señal de interrupción a intervalos regulares. Esto se puede hacer utilizando uno de los temporizadores integrados, como el temporizador 0 o 1, en el microcontrolador ATmega328P utilizado en la mayoría de las placas Arduino o utilizando un chip temporizador externo como el MCPWM. Una vez que se ha configurado el temporizador, es necesario escribir una función llamada Rutina de servicio de interrupción (ISR).

Interrupción del temporizador Arduino: todo lo que debes saber

Este ISR determina qué acción se debe tomar cuando el temporizador genera una señal de interrupción. Normalmente, esto puede incluir leer el valor de un sensor o ejecutar algún código en un intervalo específico. Finalmente, el ISR debe habilitarse configurando la Máscara de interrupción global (GIMSK) y el Registro de máscara de interrupción del temporizador (TIMSK). Una vez que se completen estos pasos, se producirán interrupciones regularmente según lo especificado por el usuario y cualquier acción requerida se podrá ejecutar durante estas señales de interrupción. Este proceso se puede repetir con varios temporizadores para crear múltiples interrupciones con diferentes funciones, todas ejecutándose en una placa Arduino.

En resumen, configurar una interrupción del temporizador Arduino implica: configurar un temporizador; escribir una rutina de servicio de interrupción (ISR) adecuada; habilitar la máscara de interrupción global y el registro de máscara de interrupción del temporizador; y finalmente, ejecutar el código cuando se genera una señal de interrupción. Con unas pocas líneas de código, puedes usar interrupciones para agregar algo de potencia adicional a tus proyectos Arduino. [1].

Vectores de interrupción del temporizador Arduino

Busque el nombre del archivo de encabezado

El archivo de encabezado para los vectores de interrupción del temporizador Arduino es llamado “avr/interrupt.h”. Este archivo de encabezado contiene todas las variables y funciones necesarias para configurar y usar interrupciones del temporizador, así como definiciones de vectores utilizados para ejecutar rutinas de servicio de interrupción (ISR). También proporciona información sobre números de vectores sobre sus correspondientes fuentes de interrupción. Específicamente, la macro ISR() debe usarse con un número de vector que coincida con la fuente de interrupción del dispositivo relacionado.

El archivo de encabezado avr/interrupt.h debe incluirse al comienzo de cualquier programa que utilice interrupciones de temporizador o ISR para acceder a sus funciones. Como ejemplo, un usuario puede incluir este encabezado escribiendo «#include » al comienzo de un programa. Finalmente, es importante tener en cuenta que los vectores asociados con cada ISR, así como los números de vectores relacionados, son específicos del dispositivo que se utiliza y se pueden encontrar en su hoja de datos o manual de referencia.

Encuentre los números del vector de interrupción

Los números de vectores de interrupción están asociados con la macro ISR() y deben coincidir con la fuente de interrupción del dispositivo relacionado. Cada número de vector de interrupción es específico del dispositivo que se utiliza, por lo que es importante consultar su hoja de datos o manual de referencia para obtener información sobre qué interrupciones corresponden a un número de vector en particular.

Interrupción del temporizador Arduino: todo lo que debes saber

Por ejemplo, los procesadores ATmega328P tienen un total de doce vectores de interrupción que se pueden utilizar. Estos vectores van desde INT0_vect (vector 0) hasta TIMER2_COMPA_vect (vector 11). Además, cada uno de estos vectores se puede asociar con un pin externo, así como con fuentes internas como temporizadores y contadores.

Además de los vectores mencionados anteriormente, algunos dispositivos también pueden tener interrupciones adicionales que no están asociadas con un número de vector. En este caso, un usuario debe consultar la hoja de datos del dispositivo o el manual de referencia para determinar qué vector corresponde a estas interrupciones y luego utilizarlo dentro de su programa.

Interrupción del temporizador Arduino: configurar el hardware

Registros del temporizador 1

La plataforma Arduino utiliza el microcontrolador ATmega328P, que contiene tres temporizadores/contadores; a saber, Timer0, Timer1 y Timer2. Nos centraremos sólo en los dos primeros, ya que se utilizan con más frecuencia en proyectos que Timer2. Para configurar nuestro temporizador para interrupciones necesitamos acceder a sus registros en direcciones de memoria específicas. Para mayor comodidad, se les asigna un nombre y se puede acceder a ellos a través de constantes predefinidas como TCCR1A y ​​TCCR1B (Registros de control de temporizador/contador del temporizador 1).

Configurar las interrupciones

Una vez que haya configurado los ajustes deseados en los registros del temporizador, el siguiente paso es habilitar una interrupción que se activará cada vez que el temporizador se desborde. La interrupción de desbordamiento se habilita configurando el bit TOIE1 (Habilitación de interrupción de desbordamiento del temporizador/contador 1) en el registro TIMSK1.

Interrupciones e ISR

Una rutina de servicio de interrupción (ISR) es una función que se llama cuando ocurre una interrupción. Aquí es donde usted especifica las acciones que se tomarán cuando ocurra un evento. En este caso, su ISR necesita restablecer el temporizador y, opcionalmente, ejecutar cualquier otro código en función de lo que intenta lograr con nuestras interrupciones del temporizador. Para definir un ISR, debe usar la función adjuntaInterrupt() y pasarla al ISR deseado como argumento.

Interrupción del temporizador Arduino: todo lo que debes saber

Interrupción del temporizador Arduino: uso de los registros de desbordamiento.

Prueba de boceto Interrupción de desbordamiento del temporizador 1

Timer1 es el temporizador más grande disponible en Arduino. Se puede utilizar tanto por periodos cortos como largos. La forma más sencilla de utilizar el temporizador es mediante una rutina de servicio de interrupción (ISR). Un ISR es un código especial que se ejecutará cada vez que ocurra un evento, como un desbordamiento del temporizador. Para este ejemplo, crearemos un ISR que se llamará cada vez que Timer1 se desborde.

Para probar tu boceto, debes comenzar cableando el LED en el pin 13, que está conectado al pin digital 7 en la placa Arduino Uno. Para configurar Timer1 para interrupciones de desbordamiento, debe hacer tres cosas: habilitar interrupciones globales con `sei()`, configurar Timer1 y escribir el ISR.

Primero, habilite las interrupciones globales incluyendo `sei()` en su función de configuración. Esto permite que cualquier interrupción en su boceto se maneje correctamente.
A continuación, configure Timer1 para interrupciones por desbordamiento:

“`cpp
// Establecer Timer1 para interrupciones de desbordamiento
TCCR1A = 0; // establece todo el registro TCCR1A en 0
TCCR1B = 0; // lo mismo para TCCR1B
TCNT1 = 0; //inicializa el valor del contador a 0
// establece el registro de comparación para incrementos de 1khz
OCR1A = 0x03E8; // establecido en 1000 (1khz)
// activa el modo CTC
TCCR1B |= (1 << WGM12);
// Establece el bit CS11 para 8 preescaladores
TCCR1B |= (1 << CS11);
// habilitar la interrupción de comparación del temporizador
TIMSK1 |= (1 << OCIE1A);
“`
Finalmente, escriba el ISR que se llamará cada vez que Timer1 se desborde:
“`cpp
ISR(TIMER1_COMPA_vect){ //esta es la rutina del servicio de interrupción (ISR)
digitalWrite(13,!digitalRead(13)); //alternar el LED
}
“`

Ahora puedes cargar tu boceto en tu placa Arduino y observar cómo el LED parpadea cada segundo. ¡Felicitaciones, ha configurado con éxito una interrupción del temporizador en un Arduino Uno utilizando los registros de desbordamiento del Timer1! Puede utilizar este conocimiento para comenzar a crear programas más complejos que se basen en cronometrar eventos.

Interrupción del temporizador Arduino: todo lo que debes saber

Forma de onda de salida de desbordamiento del temporizador 1

La salida de la interrupción del temporizador en un Arduino Uno es una onda cuadrada con una frecuencia de 1 kHz y un ciclo de trabajo del 50%. Esto significa que el LED estará encendido durante 0,5 segundos y luego se apagará durante 0,5 segundos. La forma de onda generada por las interrupciones de desbordamiento del Timer1 se puede ver en el siguiente diagrama:

![] (forma de onda.png)
Como puede ver, esta forma de onda proporciona un método simple y fácil de usar para crear eventos de temporización sin tener que escribir código complejo. También tiene un consumo de energía relativamente bajo en comparación con otros métodos, como el uso de una fuente de reloj externa o funciones de retardo().

Al colocar diferentes instrucciones dentro de su ISR, puede crear eventos cronometrados aún más complejos. También puede cambiar la frecuencia de su forma de onda cambiando el valor del registro OCR1A, ya que esto controlará cuánto tiempo le toma al Timer1 desbordarse y llamar a su ISR.

Al comprender cómo usar temporizadores e interrupciones en una placa Arduino Uno, puede crear bocetos más complejos con eventos de sincronización precisos. ¡Este conocimiento es esencial para cualquier proyecto Arduino avanzado!

Código de ejemplo de interrupción del temporizador Arduino (OVF)

Explicación del código

El código se divide en tres partes. La primera parte es el bloque setup(), que inicializa todas las variables y configura nuestra interrupción del temporizador. La segunda parte es una función loop() que se ejecuta continuamente y realiza un seguimiento del tiempo. Finalmente, existe una Rutina de Servicio de Interrupción (ISR) que se ejecuta cuando el temporizador se desborda.

Simulación TinkerCAD

Esta simulación le permite probar su código y observar el tiempo de las interrupciones.

En esta simulación, hemos configurado dos LED conectados a los pines digitales 3 y 4 en la placa Arduino Uno. En el bloque setup(), se ha utilizado pinMode para declarar estos pines como salida. El LED conectado al pin 3 se iluminará cuando se produzca la interrupción por desbordamiento del temporizador.

Resultados de las pruebas

Cuando el programa se carga en la placa Arduino Uno, debes observar que el LED conectado al pin digital 3 parpadea con una frecuencia de 2 Hz (2 veces por segundo). El LED conectado al pin 4 permanecerá apagado ya que no tiene ningún código asociado. Esto confirma que nuestra interrupción del temporizador está funcionando correctamente.

Interrupción del temporizador Arduino: todo lo que debes saber

Finalmente, cuando se presiona el botón de reinicio en la placa, ambos LED se apagarán como se esperaba. Esto también confirma que nuestra interrupción del temporizador está funcionando correctamente.

Este ejemplo demuestra cómo utilizar interrupciones en un boceto de Arduino con fines de sincronización. Se puede utilizar como punto de partida para proyectos más complejos que involucren temporizadores e interrupciones. [2]!

Preguntas más frecuentes

¿Cómo utilizar un temporizador de interrupción en Arduino?

Un temporizador de interrupción es un tipo de temporizador o contador que se puede utilizar para generar una solicitud de interrupción a intervalos regulares. Para usar un temporizador de interrupción en Arduino, siga estos pasos:

  1. Configure el temporizador y configure sus registros.
  2. Escriba la función que desea ejecutar cuando se produzca la interrupción.
  3. Habilite las interrupciones en su placa Arduino llamando a la función sei() en su rutina de configuración.
  4. Cree una rutina de servicio de interrupción (ISR) que se llamará cuando se produzca la interrupción.
  5. Finalmente, habilite las interrupciones para el temporizador específico llamando a su registro correspondiente con los parámetros apropiados según el tipo de interrupción que desee activar desde él.
  6. Una vez completados todos los pasos necesarios, puede comenzar a usar su temporizador de interrupción en Arduino.

¿Qué es una rutina de servicio de interrupción?

Una Rutina de Servicio de Interrupción (ISR) es una función ejecutada cuando ocurre una interrupción. Los ISR manejan interrupciones y realizan las tareas necesarias para responder a ellas según el tipo de interrupción generada por el dispositivo de hardware. Un ISR debe escribirse con cuidado, ya que debe ejecutarse rápidamente sin consumir demasiados recursos ni causar conflictos con otras rutinas que puedan estar ejecutándose al mismo tiempo. En Arduino, los ISR están escritos en lenguaje C/C++ y deben registrarse con llamadas a funciones addInterrupt o TIMERn_COMPA_vect dependiendo del tipo de interrupción activada desde el dispositivo.

¿Cuántas interrupciones puede manejar Arduino?

Arduino es capaz de manejar hasta 6 interrupciones de hardware externas en cualquier momento dado. Estas interrupciones se pueden generar a partir de una variedad de fuentes, como temporizadores, dispositivos externos y puertos de comunicación. Además, ciertas placas Arduino también admiten interrupciones internas que se activan mediante funciones de software como delay() y millis(). El número total de interrupciones que se pueden manejar simultáneamente dependerá del tipo de placa que se utilice.

¿Cuáles son los tipos de tiempos de interrupción?

Hay dos tipos de temporización de interrupción: síncrona y asíncrona. La sincronización sincrónica ocurre cuando todas las interrupciones ocurren a intervalos regulares, mientras que la sincronización asincrónica ocurre cuando diferentes eventos pueden causar solicitudes de interrupción en diferentes momentos. En Arduino, la mayoría de las interrupciones de hardware externas utilizan temporización síncrona, mientras que las comunicaciones y otras interrupciones asíncronas suelen utilizar temporización asíncrona.

¿Cuáles son los beneficios de utilizar un temporizador de interrupción?

Los temporizadores de interrupción pueden ofrecer una serie de ventajas cuando se utilizan en proyectos Arduino. Permiten una mayor flexibilidad en la respuesta a eventos, así como capacidades multitarea mejoradas, ya que diferentes interrupciones que ocurren en diferentes momentos pueden desencadenar múltiples tareas. Además, pueden ayudar a conservar la potencia de procesamiento activando tareas sólo cuando sea necesario en lugar de ejecutarlas continuamente en un bucle. Finalmente, se pueden utilizar para facilitar comunicaciones más fluidas con dispositivos o redes externos a través de protocolos de transferencia de datos más eficientes.

¿Cuál es el tiempo máximo en el temporizador 1 de Arduino?

El tiempo máximo en el temporizador Arduino 1 es de aproximadamente 16,7 milisegundos (ms), lo que corresponde a una frecuencia de 60 Hz. Este límite se debe a que el temporizador 1 tiene una resolución de 8 bits, lo que significa que sólo puede contar hasta un máximo de 255. Como tal, intervalos más largos requieren el uso de otro temporizador o técnicas de programación adicionales.

¿Cuáles son algunas aplicaciones comunes de los temporizadores de interrupción?

Los temporizadores de interrupción se utilizan comúnmente en proyectos Arduino cuando se requiere una sincronización precisa o la activación de tareas específicas. Los ejemplos comunes incluyen generar señales PWM regulares para controlar la velocidad y los niveles de brillo de motores y LED, botones antirrebote en dispositivos de entrada y activar comunicaciones periódicas con dispositivos/redes externos. Además, también se utilizan a menudo para la adquisición de datos y el procesamiento eficiente de señales analógicas/digitales.

¿Las interrupciones están habilitadas de forma predeterminada en las placas Arduino?

No, las interrupciones no están habilitadas de forma predeterminada en las placas Arduino. La función sei() debe llamarse en la rutina de configuración para habilitar interrupciones globales. Además, cada interrupción individual también debe habilitarse manualmente utilizando su registro correspondiente con los parámetros apropiados según el tipo de interrupción que desee activar desde ella. Esto incluye configurar el temporizador correctamente y escribir una Rutina de Servicio de Interrupción (ISR) que se ejecutará cuando ocurra la interrupción.

¿Arduino admite todos los tipos de interrupciones?

No, las placas Arduino solo admiten un número limitado de interrupciones. Estos incluyen interrupciones externas generadas por dispositivos como temporizadores, pines de E/S y puertos de comunicación. Además, ciertas placas también admiten interrupciones internas que se activan mediante funciones de software como delay() y millis(). Otros tipos de interrupciones no admitidas por Arduino incluyen DMA (acceso directo a memoria) y excepciones de CPU.

¿Cuál es la diferencia entre un temporizador de interrupción y un temporizador normal?

La principal diferencia entre un temporizador de interrupción y un temporizador normal radica en cómo generan señales de sincronización. Los temporizadores regulares simplemente cuentan desde cero hasta un valor máximo antes de restablecerse a cero; este proceso se repite continuamente hasta que el temporizador se detiene o desactiva. Por otro lado, los temporizadores de interrupción generan una solicitud de interrupción a intervalos regulares que pueden usarse para activar tareas dentro del código. A menudo se utilizan cuando se requiere una sincronización precisa o la activación de tareas específicas.

¿Cuánto dura el retraso 1000 en Arduino?

El retardo 1000 en Arduino es de aproximadamente 1 segundo (1000 milisegundos) cuando se usa con la función retardo(). Cabe señalar que este valor puede variar ligeramente dependiendo de otras tareas que realice el microcontrolador al mismo tiempo. Además, se pueden lograr retrasos de más de un segundo usando múltiples llamadas a delay() o usando un temporizador de interrupción para activar una tarea después de que haya transcurrido un intervalo de tiempo específico.

Video útil: Conceptos básicos de electrónica n.° 30: Temporizadores de microcontrolador (Arduino)

Párrafo de conclusión

La interrupción del temporizador Arduino es una herramienta poderosa que se puede utilizar para mejorar el rendimiento de su aplicación. Le permite escribir código que se ejecuta en segundo plano y puede responder rápidamente cuando sea necesario sin interferir con otras tareas. Con su sencillo proceso de configuración y su flexibilidad, se incorpora fácilmente a casi cualquier proyecto. Además, la amplia variedad de bibliotecas listas para usar disponibles hace que sea aún más fácil para los usuarios personalizar sus soluciones adaptadas a sus necesidades específicas. La interrupción del temporizador Arduino es un recurso excelente para los desarrolladores que buscan agregar una capa adicional de funcionalidad y control a sus aplicaciones.

Referencias

  1. https://www.best-microcontroller-projects.com/arduino-timer-interrupt.html
  2. https://deepbluembedded.com/arduino-timer-interrupts/

Timer CTC ||Curso Arduino Avanzado #16||

Deja un comentario

¡Contenido premium bloqueado!

Desbloquear Contenido
close-link