Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
doc:tec:elo:uc_arduino:arduino_int:inicio [2025/03/18 09:57] – creado euloxio | doc:tec:elo:uc_arduino:arduino_int:inicio [2025/03/25 14:04] (actual) – [Habilitación y configuración de la interrupción] fepg | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Interrupciones en Arduino ====== | ||
+ | ===== Flujo de ejecución de una interrupción ===== | ||
+ | |||
+ | El funcionamiento es semejante 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 ===== | ||
+ | |||
+ | Esta instrucción se pone en '' | ||
+ | |||
+ | attachInterrupt ( digitalPinToInterrupt ( P ), Funcion, RISING ); | ||
+ | |||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * Si damos el pin, el programa se encarga de buscar la interrupción. | ||
+ | |||
+ | * '' | ||
+ | * Es el pin que detecta la interrupción. | ||
+ | * **En el Arduino Nano es el '' | ||
+ | |||
+ | * '' | ||
+ | * Función asociada a la interrupción. Se ejecuta al producirse la interrupción. Suele denominarse **ISR** (// | ||
+ | * En otro lugar del programa deberemos declararla '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | \\ | ||
+ | ===== Función ISR ===== | ||
+ | |||
+ | * La función asociada a una interrupción se denomina **ISR** (// | ||
+ | |||
+ | * Dos ISR no pueden ejecutarse de forma simultánea. En caso de dispararse otra interrupción mientras se ejecuta una ISR, la función ISR se ejecuta una a continuación de otra. | ||
+ | |||
+ | * **La ISR, cuanto más corta mejor**. Al diseñar una ISR debemos mantener el menor tiempo de ejecución posible, dado que mientras se esté ejecutando el bucle principal y todo el resto de funciones se encuentran detenidas. | ||
+ | * Imaginemos, por ejemplo, que el programa principal ha sido interrumpido mientras un motor acercaba un brazo para coger un objeto. Una interrupción larga podría hacer que el brazo no para a tiempo, tirando o dañando el objeto. | ||
+ | |||
+ | * Frecuentemente la función de la ISR se limitará a activar un flag, incrementar un contador, o modificar una variable. Esta modificación será atendida posteriormente en el hilo principal, cuando sea oportuno. | ||
+ | |||
+ | * No emplear en una ISR un proceso que consuma tiempo. Esto incluye cálculos complejos, comunicación (serial, I2C y SPI) y, en la medida de lo posible, cambio de entradas o salidas tanto digitales como analógicas. | ||
+ | \\ | ||
+ | ===== Variables volátiles ===== | ||
+ | |||
+ | * **Las variables de la ISR como volátiles**. Para poder modificar una variable externa a la ISR dentro de la misma debemos declararla como '' | ||
+ | |||
+ | * El indicador '' | ||
+ | |||
+ | * Al indicar una variable como '' | ||
+ | \\ | ||
+ | ===== 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, | ||
+ | |||
+ | **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, | ||
+ | \\ | ||
+ | ===== Consulta ===== | ||
+ | |||
+ | <WRAP center round help> | ||
+ | |||
+ | {{ico: | ||
+ | |||
+ | - [[https:// | ||
+ | - {{ edu: | ||
+ | - **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 '' | ||
+ | - [[https:// | ||
+ | - [[https:// | ||
+ | |||
+ | </ | ||
+ | \\ |