Arduino-割り込み
割り込みはArduinoの現在の作業を停止し、他の作業を実行できるようにします。
あなたが家に座って誰かとチャットしているとしましょう。突然電話が鳴ります。チャットをやめ、電話に出て発信者と話します。電話での会話が終わったら、電話が鳴る前に相手とのチャットに戻ります。
同様に、メインルーチンは誰かとチャットすることと考えることができます。電話が鳴ると、チャットが停止します。割り込みサービスルーチンは、電話で話すプロセスです。電話での会話が終了すると、チャットのメインルーチンに戻ります。この例では、割り込みによってプロセッサがどのように動作するかを正確に説明しています。
メインプログラムは、回路内で実行され、いくつかの機能を実行しています。ただし、割り込みが発生すると、別のルーチンが実行されている間、メインプログラムは停止します。このルーチンが終了すると、プロセッサは再びメインルーチンに戻ります。
重要な機能
割り込みに関するいくつかの重要な機能は次のとおりです-
割り込みはさまざまなソースから発生する可能性があります。この場合、デジタルピンの1つの状態変化によってトリガーされるハードウェア割り込みを使用しています。
ほとんどのArduinoデザインには、デジタルI / Oピン2と3にそれぞれハードワイヤードされた2つのハードウェア割り込み(「interrupt0」と「interrupt1」と呼ばれる)があります。
Arduino Megaには、ピン21、20、19、および18の追加の割り込み(「interrupt2」から「interrupt5」)を含む6つのハードウェア割り込みがあります。
「割り込みサービスルーチン」(通常はISRとして知られている)と呼ばれる特別な関数を使用してルーチンを定義できます。
ルーチンを定義し、立ち上がりエッジ、立ち下がりエッジ、またはその両方で条件を指定できます。これらの特定の条件では、割り込みが処理されます。
入力ピンでイベントが発生するたびに、その機能を自動的に実行することができます。
割り込みの種類
割り込みには2つのタイプがあります-
Hardware Interrupts −外部割り込みピンがハイまたはローになるなどの外部イベントに応答して発生します。
Software Interrupts−ソフトウェアで送信された命令に応答して発生します。「Arduino言語」がサポートする唯一のタイプの割り込みは、attachInterrupt()関数です。
Arduinoでの割り込みの使用
割り込みは、タイミングの問題を解決するのに役立つため、Arduinoプログラムで非常に役立ちます。割り込みの適切なアプリケーションは、ロータリーエンコーダーの読み取りまたはユーザー入力の監視です。一般に、ISRはできるだけ短く高速にする必要があります。スケッチで複数のISRを使用している場合、一度に実行できるのは1つだけです。他の割り込みは、現在の割り込みが終了した後、優先度に応じた順序で実行されます。
通常、グローバル変数は、ISRとメインプログラムの間でデータを渡すために使用されます。ISRとメインプログラム間で共有される変数が正しく更新されるようにするには、それらを揮発性として宣言します。
attachInterruptステートメントの構文
attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument 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.
//argument mode: defines when the interrupt should be triggered.
次の3つの定数は、有効な値として事前定義されています-
LOW ピンがローのときはいつでも割り込みをトリガーします。
CHANGE ピンの値が変わるたびに割り込みをトリガーします。
FALLING ピンがハイからローになるときはいつでも。
Example
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.
void setup() {
pinMode(13, OUTPUT); //set pin 13 as output
attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
//interrupt at pin 2 blink ISR when pin to change the value
}
void loop() {
digitalWrite(13, state); //pin 13 equal the state value
}
void blink() {
//ISR function
state = !state; //toggle the state when the interrupt occurs
}