Buscar..


Sintaxis

  • digitalPinToInterrupt (pin); // convierte un id de pin en un id de interrupción, para usar con attachInterrupt() y detachInterrupt() .

  • attachInterrupt (digitalPinToInterrupt (pin), ISR, modo); // recomendado

  • attachInterrupt (interrupción, ISR, modo); // no recomendado

  • detachInterrupt (digitalPinToInterrupt (pin));

  • detachInterrupt (interrupción);

  • noInterrupts (); // desactiva las interrupciones

  • interrupciones (); // volver a habilitar las interrupciones después de que se haya llamado a noInterrupts() .

Parámetros

Parámetro Notas
interrumpir Id de la interrupción. No debe confundirse con el número de pin.
ISR Rutina de servicio de interrupción. Este es el método que se ejecutará cuando ocurra la interrupción.
modo Lo que debería hacer que la interrupción se dispare. Uno de LOW, CHANGE, RISING, o FALLING. Las tablas vencidas también permiten ALTA.

Observaciones

Las rutinas de servicio de interrupción (ISR) deben ser lo más cortas posible, ya que pausan la ejecución del programa principal y, por lo tanto, pueden arruinar el código dependiente del tiempo. Por lo general, esto significa que en el ISR establece un indicador y sale, y en el ciclo de programa principal, comprueba el indicador y hace lo que se supone que debe hacer ese indicador.

No puede usar delay() o millis() en un ISR porque esos métodos se basan en interrupciones.

Interrupción al presionar un botón

Este ejemplo utiliza un botón pulsador (interruptor de tacto) conectado al pin digital 2 y GND, utilizando una resistencia de pull-up interna, de modo que el pin 2 está ALTO cuando no se presiona el botón.

const int LED_PIN = 13;
const int INTERRUPT_PIN = 2;
volatile bool ledState = LOW;

void setup() {
    pinMode(LED_PIN, OUTPUT);
    pinMode(INTERRUPT_PIN, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when button pressed, but not when released.
}

void loop() {
    digitalWrite(LED_PIN, ledState);
}

void myISR() {
    ledState = !ledState;
    // note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as switching between LOW and HIGH.
}

Un ejemplo simple es que los botones pulsadores tienden a rebotar, lo que significa que al presionar o soltar, el circuito se abre y se cierra más de una vez antes de que se establezca en el estado final cerrado o abierto. Este ejemplo no tiene eso en cuenta. Como resultado, a veces, al presionar el botón se alternará el LED varias veces, en lugar del esperado una vez.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow