Interrupciones en Arduino
- Arduino y las interrupciones (25-8-2017) ( sólo alumnos)
- Variables volátiles. Declaración y uso de variables volátiles: Cuando una variable está en la función asociada a la interrupción y en la función
loop
, tenemos que declararla comovolatile int variable
para que se sitúe en la RAM.
El funcionamiento es semejante, como puede verse, a cuando llamamos a una subrutina desde una línea del programa. Solo que en este caso no existe tal linea sino que la subrutina de interrupción se ejecutará en cualquier instante del programa, cuando se cumplan unas condiciones muy precisas.
Habilitación y configuración de la interrupción
Repasar en Arduino la instrucción
attachInterrupt ( digitalPinToInterrupt ( P ), Funcion, RISING );
Esa instrucción se pone en void setup(){}
para habilitar y definir la interrupción.
Veamos los parámetros a continuación:
digitalPinToInterrupt
→ Si damos el pin, el programa se encarga de buscar la interrupción.
P
→ Es el pin que detecta la interrupción. En el Arduino Nano es el2
.
Funcion
→ Función asociada a la interrupción. Se ejecuta al producirse la interrupción. En otro lugar del programa deberemos declararlavoid Funcion(){}
.
flanco de activación
RISING
→ Detecta el flanco de subida en el pinP
, llamando a la interrupción.FALLING
→ Si se pone en lugar deRISING
, llama a la interrupción en el flanco de bajada de la señal de entrada al pinP
.
Efectos de la interrupción y la medición del tiempo
Las interrupciones tienen efectos en la medición del tiempo de Arduino, tanto fuera como dentro de la ISR, porque Arduino emplea interrupciones de tipo Timer para actualizar la medición del tiempo.
Efectos fuera de la ISR
- Durante la ejecución de una interrupción Arduino no actualiza el valor de la función millis y micros. Es decir, el tiempo de ejecución de la ISR no se contabiliza y Arduino tiene un desfase en la medición del tiempo.
- Si un programa tiene muchas interrupciones y estas suponen un alto tiempo de ejecución, la medida del tiempo de Arduino puede quedar muy distorsionada respecto a la realidad (nuevamente, un motivo para hacer las ISR cortas).
Efectos dentro de la ISR. Dentro de la ISR el resto de interrupciones están desactivadas. Esto supone:
- La función millis no actualiza su valor, por lo que no podemos utilizarla para medir el tiempo dentro de la ISR. (sí podemos usarla para medir el tiempo entre dos ISR distintas)
- Como consecuencia la función delay() no funciona, ya que basa su funcionamiento en la función millis()
- La función micros() actualiza su valor dentro de una ISR, pero empieza a dar mediciones de tiempo inexactas pasado el rango de 500us.
- En consecuencia, la función delayMicroseconds funciona en ese rango de tiempo, aunque debemos evitar su uso porque no deberíamos introducir esperas dentro de una ISR.