attachInterrupt()

Descripción

Pines digitales con Interrupción

El primer parámetro para attachInterrupt es el número de interrupción. Normalmente debería utilizar digitalPinToInterrupt(pin) para traducir el pin digital real al número de interrupción específica. Por ejemplo, si se conecta al pin3, utilice digitalPinToInterrupt(3) como el primer parámetro para attachInterrupt.

Placa Pin Digital Utilizable para Interrupciones
Uno, Nano, Mini, otras placas 328 2, 3
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
Micro, Leonardo, otras 32u4 0, 1, 2, 3, 7
Zero todos los pines digitales, excepto 4
MKR1000 Rev.1 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Due todos los pines digitales

※ Nota:

Dentro de la función de Interrupción, delay() no funcionará y el valor devuelto por Millis() no aumentará. Los datos serie recibidos, mientras que la función está activa se pueden perder. Usted debe declarar como volátile cualquier variable que se modifique dentro de la función de Interrupción. Vea la sección de ISR a continuación para obtener más información.

Uo de las Interrupciones

Las interrupciones son útiles para hacer que las cosas sucedan de forma automática en los programas de los microcontroladores, y pueden ayudar a resolver los problemas de tiempo. Buenas prácticas para el uso de una interrupción pueden incluir la lectura de un codificador rotatorio (encoder) o la monitorización de la entrada del usuario.

Si usted quiere asegurarse de que un programa siempre captura los pulsos de un encoder rotativo, de modo que no se pierda un solo pulso, sería muy difícil de escribir un programa que hiciera cualquier otra cosa, ya que el programa tendría que sondear constantemente las líneas del sensor codificador, con el fin de capturar los pulsos cuando ocurrieran. Otros sensores tienen una interfaz similar dinámica también, como tratar de leer un sensor de sonido que está tratando de capturar un clic, o un sensor de infrarrojos tipo ranura (foto-interruptor) que intenta coger una caida de la moneda. En todas estas situaciones, el uso de una interrupción puede liberar al microcontrolador para que haga algún otro trabajo realizado mientras no pierde la entrada.

Acerca de la Rutina del Servicio de Interrupciones

Las ISR son tipos especiales de funciones que tienen algunas limitaciones únicas que la mayoría de las otras funciones no tienen. Una ISR no puede tener ningún parámetro, y no debe devolver nada.

En general, una ISR debe ser lo más corta y más rápida posible. Si el programa utiliza varias ISR, sólo se puede ejecutar una a la vez, las otras interrupciones serán ejecutadas después de que la actual termine en un orden que depende de la prioridad que tienen. Millis() se basa en las interrupciones de cómputo, por lo que nunca se incrementará en el interior de una ISR. Delay() requiere interrupciones para trabajar, no va a funcionar si se le llama en el interior de una ISR. micros() funciona al principio, pero va a empezar a comportarse de forma errática después de 1-2 ms. delayMicroseconds() no utiliza ningún contador, por lo que funcionará con normalidad.

Por lo general las variables globales se utilizan para transmitir datos entre una ISR y el programa principal. Para asegurarse de que las variables compartidas entre una ISR y el programa principal se actualizan correctamente, declararla comovolatile.

Para obtener más información sobre las interrupciones, consulte las notas de Nick Gammon's.

Sintaxis

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recomendado)
  • attachInterrupt(interrupt, ISR, mode); (no recomendado)
  • attachInterrupt(pin, ISR, mode); (no recomendado,solo Arduino, Zero, MKR1000)

Parámetros

  • interrupt: el número de interrupción (int)
  • pin: el número de pin (solo Arduino Due, Zeo, MKR1000)
  • ISR: la ISR llamada cuando sucede la interrupción; esta función no debe tener parámetros ni devolver nada. Esta función a veces se denomina Rutina del Servicio de Interrupciones.
  • mode: define cuando debe ser disparada la interrupción. Existen cuatro constantes predefinidas como valores válidos:
    • LOW dispara la interruoción cuando el pin está a nivel bajo.
    • CHANGE dispara la interrupción cuando el pin cambia su valor.
    • RISING dispara la interrupción cuando el pin pasa de nivel bajo a nivel alto.
    • FALLING dispara la interrupción cuando el pin pasa de nivel alto a nivel bajo.
  • La placa Due también permite:
    • HIGH dispara la interrupción cuando el pin esta a nivel alto

Retornos

  • Ninguno

Ejemplo

int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }

Números de Interrupciones

Normalmente debería utilizar digitalPinToInterrupt (pin), en lugar poner directamente un número de interrumpción en su programa. Los pines específicos con interrupciones, y su correlación con las interrupciones número varía en cada tipo de tarjeta. 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.

Sin embargo, la mayoría de los programas a menudo tienen números de interrupción directos. Suelen utilizarse el número 0 (para el pin digital 2) o el número 1 (para el pin digital 3). La siguiente tabla muestra los pines de interrupción disponibles en varias placas.

Placa int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega 2560 2 3 21 20 19 18
basada en 32u4 (por ejemplo, Leonardo, Micro) 3 2 0 1 7

La placa Arduino Zero le permite agregar una función de interrupción en todos los pines disponibles, excepto para el pin 4. Puede especificar directamente el número de pines en attachInterrupt(). La placa Arduino Due tiene potentes capacidades de interrupción que le permiten agregar una función de interrupción en todo pines disponibles. Se puede especificar directamente el número de pin en attachInterrupt().

Ver También

ARDUINO BUY RECOMMENDATION

Arduino UNO R3
Arduino Starter Kit
Please note: These are affiliate links. If you buy the components through these links, We may get a commission at no extra cost to you. We appreciate it.

※ OUR MESSAGES

  • We are AVAILABLE for HIRE. See how to hire us to build your project
  • Any suggestion, correction, and translation? please email us at ArduinoGetStarted@gmail.com, We appreciate it
  • We mainly keep improving the references in English. See English version of this page for the latest update.