arduino
Interrupciones
Buscar..
Sintaxis
digitalPinToInterrupt (pin); // convierte un id de pin en un id de interrupción, para usar con
attachInterrupt()
ydetachInterrupt()
.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.