「Arduinoの基礎」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし
編集の要約なし |
|||
67行目: | 67行目: | ||
Serial.println(fVoltage); | Serial.println(fVoltage); | ||
delay(1000); | delay(1000); | ||
} | |||
</source> | |||
<br><br> | |||
== 割り込みとISR == | |||
Arduinoのスケッチでのハードウェア割込み(hardware interrupt)の利用方法について記載する。<br> | |||
<br> | |||
Arduino Unoでは、2個のピン(D2, D3)が割込みに利用できる。D2は割込み番号が0、D3は割り込み番号が1である。<br> | |||
Arduino Mega2560では、6個(D2, D3, D18, D19, D20, D21)が使えます使用できる。割込み番号は順に0, 1, 5, 4, 3, 2が設定されている。<br> | |||
<br> | |||
割込みサービスルーチン(ISR, interrupt service routine)は、引数および戻り値が無い(void)の関数が割り当てられる。<br> | |||
attachInterrupt(割込み番号, 関数名, モード)でISRをセットする。<br> | |||
また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。<br> | |||
ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。<br> | |||
<br> | |||
次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。<br> | |||
モードのFALLINGはHIGHからLOWの状態へ遷移したことで割込みを発生させることを意味する。<br> | |||
ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。<br> | |||
そして、loop()関数でその変数をdigitalWrite()関数に渡している。<br> | |||
<source lang="c++"> | |||
const byte PIN_LED = 10; | |||
const byte PIN_INTERRUPT = 2; | |||
volatile byte state = LOW; | |||
void setup() | |||
{ | |||
pinMode(PIN_LED, OUTPUT); | |||
digitalWrite(PIN_LED, state); | |||
attachInterrupt(digitalPinToInterrupt(PIN_INTERRUPT), toggle_led, FALLING); | |||
} | |||
void loop() | |||
{ | |||
digitalWrite(PIN_LED, state); | |||
} | |||
void toggle_led() | |||
{ | |||
state != state; | |||
} | } | ||
</source> | </source> |