Arduino入門:外部割り込み

Arduinoの外部割込みについて解説します。

attachInterrupt

attachInterruptは、外部割り込みが発生時に実行する関数を指定する場合に使用します。なお、既に関数が指定されていた場合は置き換えられます。設定パラメータは次の通りです。

interrupt: 割り込み番号 0または1(*)
function: 割り込み発生時に呼び出す関数
mode: 割り込みを発生させるトリガ

modeは、割込みを発生させるトリガ設定に使用し、次のものから選択します。

LOW ピンがLOWのとき発生
CHANGE ピンの状態が変化したときに発生
RISING ピンの状態がLOWからHIGHに変わったときに発生
FALLING ピンの状態がHIGHからLOWに変わったときに発生

(*)使用可能な割込み番号
ほとんどのArduinoボード:
割り込み0(ピン2)
割り込み1(ピン3)

Arduino Megaボード
割込み0と割り込み1に加えて、
割り込み2(ピン21)
割り込み3(ピン20)
割り込み4(ピン19)
割り込み5(ピン18)

//Arduino Sketch Example: attachInterrupt, syntax
//Date: 2015.1.18
//Edited and Modified by: easy labo
//Original Source: Arduino Reference (http://arduino.cc/en/Reference/HomePage)

//Syntax
attachInterrupt(interrupt, ISR, mode)
attachInterrupt(pin, ISR, mode)   //(Arduino Due only)

//Parameters
/*
interrupt:	the number of the interrupt (int)
pin:	the pin number	(Arduino Due only)
ISR:	the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
mode:	
defines when the interrupt should be triggered. Four contstants are predefined as valid values:
LOW to trigger the interrupt whenever the pin is low,
CHANGE to trigger the interrupt whenever the pin changes value
RISING to trigger when the pin goes from low to high,
FALLING for when the pin goes from high to low.
The Due board allows also:
HIGH to trigger the interrupt whenever the pin is high.
(Arduino Due only)
*/

//Returns
//none

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:attachInterrupt()” by Arduino Team, used under CC BY-SA 3.0/ easy labo made some changes and comments to the original

attachInterruptで指定した関数には幾つかの制約がありますので、次の点に注意する必要があります。
・delay関数は機能しない
・millis関数の戻り値が増加しない
・シリアル通信により受信したデータは、失われる可能性がある
・割り当てた関数のなかで値が変化する変数にはvolatileをつけて宣言する必要がある。

//Arduino Sketch Example: attachInterrupt, example
//Date: 2015.1.18
//Edited and Modified by: easy labo
//Original Source: Arduino Reference (http://arduino.cc/en/Reference/HomePage)

//Example

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:attachInterrupt()” by Arduino Team, used under CC BY-SA 3.0/ easy labo made some changes and comments to the original

上の例では、割込み0(ピン2)を外部割込みのトリガ元として状態の変化に合わせてLEDを点滅させています。

detachInterrupt

detachInterruptは、指定した割り込みを停止します。設定パラメータは次の通りです。

interrupt: 停止したい割り込みの番号

//Arduino Sketch Example: detachInterrupt
//Date: 2015.1.18
//Edited and Modified by: easy labo
//Original Source: Arduino Reference (http://arduino.cc/en/Reference/HomePage)

//Syntax
detachInterrupt(interrupt)
detachInterrupt(pin)   //(Arduino Due only)

//Parameters
//interrupt: the number of the interrupt to disable (see //attachInterrupt() for more details).
//pin: the pin number of the interrupt to disable (Arduino Due only)

//Description
//Turns off the given interrupt.

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:detachInterrupt()” by Arduino Team, used under CC BY-SA 3.0/ easy labo made some changes and comments to the original

→その他のArduino関連情報

Sponsored Link