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.