arduino
割り込み
サーチ…
構文
digitalPinToInterrupt(ピン); //
attachInterrupt()
およびdetachInterrupt()
で使用するために、ピンIDを割り込みIDに変換します。attachInterrupt(digitalPinToInterrupt(pin)、ISR、mode); //お勧めします
attachInterrupt(割り込み、ISR、モード); //推奨されていません
detachInterrupt(digitalPinToInterrupt(pin));
detachInterrupt(割り込み);
noInterrupts(); //割り込みを無効にする
割り込み(); //
noInterrupts()
がnoInterrupts()
れた後に割り込みを再び有効にします。
パラメーター
パラメータ | ノート |
---|---|
割り込み | 割り込みのID。ピン番号と間違えてはいけません。 |
ISR | 割り込みサービスルーチン。これは、割り込みが発生したときに実行されるメソッドです。 |
モード | 何が割り込みを引き起こすべきか。 LOW、CHANGE、RISING、またはFALLINGのいずれかです。デュー・ボードでもHIGHが可能です。 |
備考
割り込みサービスルーチン(ISR)は、メインプログラムの実行を一時停止し、時間に依存するコードを停止させる可能性があるため、できるだけ短くする必要があります。一般的には、ISRではフラグを設定して終了し、メインプログラムのループではフラグをチェックし、そのフラグが何をすべきかを決めることを意味します。
これらのメソッド自体は割り込みに依存しているため、ISRではdelay()
またはmillis()
を使用できません。
ボタン押し込み中の割り込み
この例では、内部プルアップ抵抗を使用してデジタルピン2とGNDに接続されたプッシュボタン(タクトスイッチ)を使用しているため、ボタンを押さないとピン2がHIGHになります。
const int LED_PIN = 13;
const int INTERRUPT_PIN = 2;
volatile bool ledState = LOW;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when button pressed, but not when released.
}
void loop() {
digitalWrite(LED_PIN, ledState);
}
void myISR() {
ledState = !ledState;
// note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as switching between LOW and HIGH.
}
この単純な例の1つは、プッシュボタンがバウンスする傾向があることです。プッシュボタンを押したり離したりすると、回路は最後の閉じた状態または開いた状態に落ち着く前に複数回開閉します。この例では考慮していません。結果として、ボタンを押すと、LEDが複数回トグルされることがあります。