| volatile変数が1バイトより大きい場合(たとえば16ビットintや32ビットlong)、8ビットマイコンでは一度に読むことができません。メインのコードがint変数の最初の8ビットを読んでいる間に、ISRが2番目の8ビットを変更する可能性があるということです。もしそうなると変数の値は予測できません。この問題に対処するためには、noInterrupts()で割り込みを一時的に停止するか、ATOMIC_BLOCKマクロの使用を検討してください。
【例】 割り込みピンの状態が変化したらLEDを反転(トグル)させる例です。 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.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください
[ドキュメント一覧]