Solo un AttachInterrupt funciona a la vez

Estoy usando la plataforma de lanzamiento MSP430f5529 y la codificación en Energia.

El objetivo es hacer un programa que pueda detectar si el botón integrado está arriba o abajo (como parte de un eventual decodificador de código Morse), que planeé implementar usando dos attachInterrupts.

Si uso uno, por ejemplo attachInterrupt(BUTTON, buttonPress, FALLING), funciona bien y se detecta la presión del botón. Si uso attachInterrupt(BUTTON, buttonRelease, RISING), se detecta la liberación del botón.

Sin embargo, si tengo ambos attachInterruptsen el mismo programa, solo uno de ellos funciona; basado en prueba y error, parece que la última interrupción que se declaró tiene prioridad.

En el siguiente código, por ejemplo, solo buttonPressse dispara. Si cambio el orden de mis attachInterrupts, solo buttonReleasedisparará.

#define BUTTON PUSH2

volatile int buttonDown = 987; // set to an arbitrary value so I can tell if the functions changed it at all

void setup() {
  Serial.begin(9600);
  Serial.println("Test code for buttons");

  // Enable internal pullup
  pinMode(BUTTON, INPUT_PULLUP);
  // attaching release before press
  attachInterrupt(BUTTON, buttonRelease, RISING);
  attachInterrupt(BUTTON, buttonPress, FALLING);
}

void loop() {
  Serial.print("buttonDown: ");
  Serial.println(buttonDown);
}

void buttonPress() {
  buttonDown = 1;
}

void buttonRelease() {
  buttonDown = 0;
}

¿Cómo puedo hacer buttonReleaseque ambos buttonPressfuncionen en los momentos correctos? Intenté simplemente verificar si el estado del botón cambió usando una sola interrupción (que detectó CAMBIO, no solo ASCENDENTE o DISMINUYENDO), pero eso pareció generar aún más problemas en el futuro, ya que el hardware a veces registraba un cambio en el medio. de ejecutar el código necesario para procesar qué hacer con ese cambio.

Respuestas (1)

Para los pines que admiten interrupciones de cambio de pin (P1, P2), cada pin tiene una bandera que controla en qué borde se activa la interrupción. Esto significa que el pin no puede activar una interrupción para un flanco ascendente Y un flanco descendente como usted desea. Ver página 308