我在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
相关联。
答案 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;
}