Descripción
Las interrupciones son útiles para hacer que las acciones o eventos sucedan automáticamente en los programas de microcontrolador y pueden ayudar a resolver problemas de tiempo y ejecución de los mismos. Las buenas tareas para usar una interrupción pueden incluir leer un interruptor o pulsador, hasta codificador rotatorio o monitoreo la entrada del usuario.[1]
Pines digitales con interrupciones
El primer parámetro para attachInterrupt()
es un número de interrupción. Normalmente debe usar digitalPinToInterrupt(pin)
para traducir el pin digital real al número de interrupción específico. Por ejemplo, si te conectas al pin 3, úsalo digitalPinToInterrupt(3)
como primer parámetro para attachInterrupt()
.
La siguiente tabla muestra los pines de interrupción que posee cada placa de arduino:
Tablero | Pines digitales utilizables para interrupciones |
---|---|
Uno, Nano, Mini, otros basados en 328 | 2, 3 |
Uno WiFi Rev.2, nano cada | todos los pines digitales |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, otro basado en 32u4 | 0, 1, 2, 3, 7 |
Cero | todos los pines digitales, excepto 4 |
Tableros de la familia MKR | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Nano 33 IoT | 2, 3, 9, 10, 11, 13, 15, A5, A7 |
Nano 33 BLE, Nano 33 BLE Sense | todos los pines |
Debido | todos los pines digitales |
101 | Todos los pines digitales (solo los pines 2, 5, 7, 8, 10, 11, 12, 13 funcionan con CHANGE) |
Acerca de las rutinas de servicio de interrupción
Los ISR son tipos especiales de funciones que tienen algunas limitaciones únicas que la mayoría de las otras funciones no tienen. Un ISR no puede tener ningún parámetro, y no debe devolver nada.
En general, un ISR debe ser lo más corto y rápido posible. Si su programa usa múltiples ISR, solo uno puede ejecutarse a la vez, otras interrupciones se ejecutarán después de que finalice la actual en un orden que depende de la prioridad que tengan. millis()
se basa en las interrupciones para contar, por lo que nunca se incrementará dentro de un ISR. Dado que delay()
requiere interrupciones para funcionar, no funcionará si se llama dentro de un ISR. La funciona micros()
inicialmente comenzará a comportarse de manera errática después de 1-2 ms. delayMicroseconds()
no utiliza ningún contador, por lo que funcionará normalmente.
Por lo general, las variables globales se utilizan para pasar datos entre un ISR y el programa principal. Para asegurarse de que las variables compartidas entre un ISR y el programa principal se actualicen correctamente, declare como volatile.
Números de interrupción
Normalmente debería usar digitalPinToInterrupt(pin)
, en lugar de colocar un número de interrupción directamente en su boceto. Los pines específicos con interrupciones y su número de mapeo a interrupción varían para cada tipo de placa. El uso directo de números de interrupción puede parecer simple, pero puede causar problemas de compatibilidad cuando su programa se ejecuta en una placa diferente.
Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) //recomendado
attachInterrupt(interrupt, ISR, mode) //no recomendado
attachInterrupt(pin, ISR, mode) //(No recomendado. Además, esta sintaxis solo funciona en las placas SAMD Arduino, Uno
//WiFi Rev2, Due y 101.)
Parámetros
- interrupt El número de la interrupción. Tipos de datos permitidos: int.
- pin El número pin de Arduino.
- ISR El ISR a llamar cuando se produce la interrupción; Esta función no debe tomar parámetros y no devolver nada. Esta función a veces se denomina rutina de servicio de interrupción.
- mode Define cuándo se debe activar la interrupción. Cuatro constantes están predefinidas como valores válidos:
- LOW Para activar la interrupción siempre que el pin esté bajo
- CHANGE Para activar la interrupción siempre que el pin cambie de valor
- RISING Para disparar cuando el pin va de bajo a alto
- FALLING Para cuando el pin va de mayor a menor.
- HIGH Para activar la interrupción siempre que el pin esté alto
Devoluciones
Nada
Referencias
[1] arduino https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/, Consultado Abril 2020