对中断和对象使用相同的引脚

时间:2014-08-15 00:45:46

标签: arduino interrupt-handling teensy

我在Teensy 3.1(ARM)项目中有一个按钮(和一个旋转编码器)。一切都很好,除了我有问题让它入睡。重置后,所有内容第一次,但每次后,attachInterrupt()似乎无法正常工作。

使用this library进行睡眠模式调用。

伪代码:

#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相关联。

1 个答案:

答案 0 :(得分: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;
}