solo un attachInterrupt funciona a la vez

1

Estoy utilizando el launchpad MSP430f5529 y la codificación en Energia.

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

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 attachInterrupts en el mismo programa, solo uno de ellos funciona; basado en prueba y error, parece que la interrupción que se declaró la última tiene prioridad.

En el código de abajo, por ejemplo, solo buttonPress dispara. Si cambio el orden de mi attachInterrupt s, solo se disparará buttonRelease .

#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 que tanto buttonRelease como buttonPress funcionen en los momentos correctos? Intenté simplemente verificar si el estado del botón cambió con una sola interrupción (que detectó CAMBIO, no solo LEVANTÓ o FALLÓ), pero que parecía llevar a 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.

    
pregunta Somatic

1 respuesta

2

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. Consulte Page 308

    
respondido por el C_Elegans

Lea otras preguntas en las etiquetas