Используйте один и тот же вывод для прерывания и объекта

У меня есть одна кнопка (и поворотный энкодер) в проекте Teensy 3.1 (ARM). Все хорошо, только у меня проблемы со сном. Все работает в первый раз после сброса, но каждый раз после этого, attachInterrupt() не работает.

Использование этой библиотеки для вызова спящего режима.

Псевдокод:

#include LowPower_Teensy3.h
#include MyButton.h
TEENSY3_LP LP = TEENSY3_LP();
MyButton mySwitch(SWITCH_PIN); // pinMode(SWITCH_PIN, INPUT_PULLUP)

// interrupt handler
void wakeup(void)
{
  digitalWrite(LED, HIGH);
  detachInterrupt(SWITCH_PIN);
}

void setup(){
  // omitted for clarity
}

void loop() {
  switch(menuSelection) {
    // poll switch and encoder to determine menu selection

    // lots of other cases omitted. all work as expected

    case SLEEP_MENU:
      digitalWrite(LED, LOW);
      attachInterrupt(SWITCH_PIN, wakeup, FALLING);
      LP.Sleep();
      break;
  }
}

Похоже, что SWITCH_PIN больше не связано с mySwitch после прерывания.


person Alex Shroyer    schedule 15.08.2014    source источник


Ответы (1)


Отключение обработчика прерывания во время выполнения этого обработчика прерывания, вероятно, является проблемой. Имейте в виду, что библиотечная функция вызывала ваш wakeup() и внутри wakeup() вы изменяли данные, с которыми работала библиотека. Для обработчика лучше оставить после себя сообщение, которое затем будет очищено основным циклом.

int flagWakeupDone = 0;

void wakeup(void)  {
  ...
  flagWakeupDone = 1;
  return;
}


void loop() {

  if(1 == flagWakeupDone) {
    detachInterrupt(SWITCH_PIN);
    // possibly restablish pin as input with pull up
  }

  ... 

  switch(menuSelection) {

    case SLEEP_MENU:
      ...
      attachInterrupt(SWITCH_PIN, wakeup, FALLING);
      break;
  }

  return;
}
person jdr5ca    schedule 17.08.2014