Un seul attachInterrupt fonctionne à la fois

Somatique

Un seul attachInterrupt fonctionne à la fois


J’utilise le tableau de bord MSP430f5529 et le codage dans Energia.

L’objectif est de créer un programme capable de détecter si le bouton poussoir embarqué est en hausse ou en baisse (dans le cadre d’un éventuel décodeur de code Morse), que j’avais prévu de mettre en œuvre en utilisant deux attachInterrupts.

Si j’en utilise un, par exemple attachInterrupt(BUTTON, buttonPress, FALLING), cela fonctionne bien et la pression sur un bouton est détectée. Si j’utilise attachInterrupt(BUTTON, buttonRelease, RISING), le relâchement du bouton est détecté.

Cependant, si j’ai les deux attachInterruptsdans le même programme, un seul d’entre eux fonctionne; sur la base d’essais et d’erreurs, il semble que la dernière interruption déclarée soit prioritaire.

Dans le code ci-dessous, par exemple, ne se buttonPressdéclenche que. Si j’échange l’ordre de mes attachInterrupts, seul buttonReleasese déclenchera.

#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;
}

Comment puis-je faire les deux buttonReleaseet buttonPresstravailler aux bons moments? J’ai essayé de vérifier simplement si l’état du bouton avait changé en utilisant une seule interruption (qui avait détecté un CHANGEMENT, pas seulement EN HAUSSE ou EN CHUTE), mais cela semblait entraîner encore plus de problèmes en cours de route, car le matériel enregistrait parfois un changement au milieu d’exécuter le code nécessaire pour traiter quoi faire avec ce changement.

Réponses


 C_Elegans

Pour les broches qui prennent en charge les interruptions de changement de broches (P1, P2), chaque broche a un indicateur qui contrôle le bord sur lequel l’interruption est déclenchée. Cela signifie que la broche ne peut pas déclencher d’interruption pour un front montant ET un front descendant comme vous le souhaitez. Voir page 308

 

#à, #la, attachInterrupt, fois, fonctionne, seul, un

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *