Estoy tratando de crear una interrupción de retraso de tiempo con Arduino. Me gustaría usar la función interrupts (), porque es una interrupción interna.
Ejemplo: Digamos que me gustaría encender y apagar una luz, solo con el momento de la interrupción.
Hay un código de muestra, pero usa interrupciones externas (attachInterrupt ()). Me gustaría seguir usando las interrupciones internas.
arduino
microcontroller
interrupts
Aleatorio
fuente
fuente
Respuestas:
El blog de Noah Stahl tiene un ejemplo de parpadeo de un LED con Timer2 . Con eso y la hoja de datos, debería poder adaptarla a la interrupción que quiera usar, es decir, la interrupción cuya función normal puede darse el lujo de abandonar o está dispuesto a modificar. Timer2 se usa generalmente para algunas funciones PWM.
Su ejemplo cita el ATmega2560; Puedo confirmar que también funciona con un ATmega328p. Mire alrededor de su sitio para obtener ejemplos más útiles de interrupción de Arduino.
Editar:
Aquí está mi versión ligeramente editada, principalmente en los comentarios, del código de Noah. Llame a Timer2init () desde la función setup () de Arduino después de inicializar cualquier estructura de datos o hardware relacionado, porque el tiempo y la interrupción comenzarán una vez que lo haga.
F / ex, lo usé para multiplexar una pantalla de 3 dígitos y 7 segmentos, así que antes de inicializar el temporizador, inicialicé los registros de E / S de la pantalla y borré los datos de la pantalla en el lugar donde el ISR lo buscará.
Hay una tabla en los comentarios de algunos datos de tiempo útiles de la hoja de datos y mis propios cálculos como referencia para configurar otro esquema de tiempo.
La macro ISR () se encarga de crear el código de entrada y salida de interrupción para un ISR en lugar de la entrada y salida de una función normal, y de vincularlo con el vector de interrupción adecuado. El resto de esa función es 1) el código que se ejecutará en cada interrupción, y 2) el código de código para restablecer el temporizador para la próxima interrupción.
Tal como está escrito, esto debería aparecer en un boceto .pde o .ino (o un archivo .cpp, si usa eclipse, f / ex). El boceto necesita #definir LEDPIN, y setup () necesita llamar a Timer2init (). La función de bucle puede estar vacía o no; el LED debería comenzar a parpadear en la descarga (bueno, literalmente, después de llamar a Timer2init ()).
fuente
La función attachInterrupt () en realidad está adjuntando una interrupción a un cambio de estado externo en un pin, no tiene otras opciones.
En la misma página, las opciones de modo se enumeran como:
Lamento ser el portador de malas noticias, esa es una de las primeras cosas que busqué también.
fuente
Este artículo sobre PWM aclarará muchas de sus dudas sobre el uso de los temporizadores Arduino. Hay dos temporizadores de 8 bits y un temporizador de 16 bits en Arduino. No hay una API de alto nivel para enganchar la función ISR directamente en los temporizadores, que se envía con el SDK de Arduino (es decir, como una biblioteca estándar), sino un método de nivel algo inferior para establecer Registros de funciones especiales y aritmética de bits / operaciones en ellos. Sin embargo, hay una biblioteca contribuida por el usuario llamada Timer one .
fuente
Arduino está utilizando los tres temporizadores en ATMega328.
Timer1
(16 bits) se utiliza para funciones comodelay()
ymillis()
y para la salida PWM en los pines 5 y 6. Los otros dos temporizadores,Timer0
yTimer2
se utilizan para la salida PWM en los pines 3, 9, 10, 11.Por lo tanto, no hay una función Arduino para la interrupción del temporizador. Pero, hay una manera. Puede usar este código para habilitar la interrupción del temporizador en
Timer2
:Escribí este código sin probar, por lo que es posible que haya cometido un error. En ese caso, consulte la hoja de datos, p.156 .
Si desea cambiar la frecuencia del temporizador (preescaler), simplemente cambie el registro
TCCR2A
. Para obtener más información, consulte la hoja de datos de la página 153. ¡Pero si cambia la frecuencia del temporizador, también cambia la frecuencia de la señal PWM en dos pines de salida!fuente
Timer0
yTimer2
son de 8 bits y soloTimer1
es de 16 bits.