0

Teensy 3.1 (ARM) プロジェクトに 1 つのプッシュボタン (およびロータリー エンコーダー) があります。スリープ状態にするのに問題があることを除けば、すべて問題ありません。リセット後初めてすべてが機能しますが、その後は毎回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

4

1 に答える 1

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;
}
于 2014-08-17T04:08:08.300 に答える