Arduino-interrupts

提供:Dev Guides
移動先:案内検索

Arduino-割り込み

割り込みは、Arduinoの現在の作業を停止して、他の作業を実行できるようにします。

あなたが家に座って誰かとおしゃべりをしているとします。 突然電話が鳴ります。 チャットを停止し、電話を取り、発信者に話しかけます。 電話での会話が終了したら、電話が鳴る前に相手とチャットに戻ります。

同様に、メインルーチンは誰かとチャットしていると考えることができます。電話が鳴るとチャットが停止します。 割り込みサービスルーチンは、電話で話すプロセスです。 電話での会話が終了したら、チャットのメインルーチンに戻ります。 この例では、割り込みがプロセッサを動作させる方法を正確に説明します。

メインプログラムが実行されており、回路で何らかの機能を実行しています。 ただし、割り込みが発生すると、別のルーチンが実行されている間、メインプログラムは停止します。 このルーチンが終了すると、プロセッサは再びメインルーチンに戻ります。

割り込み

重要な機能

ここに割り込みに関するいくつかの重要な機能があります-

  • 割り込みはさまざまなソースから発生します。 この場合、デジタルピンの1つの状態変化によってトリガーされるハードウェア割り込みを使用しています。
  • ほとんどのArduino設計には、デジタルI/Oピン2および3にそれぞれ配線された2つのハードウェア割り込み(「interrupt0」および「interrupt1」と呼ばれる)があります。
  • Arduino Megaには、ピン21、20、19、および18の追加の割り込み(「interrupt2」から「interrupt5」)を含む6つのハードウェア割り込みがあります。
  • 「割り込みサービスルーチン」(通常ISRとして知られる)と呼ばれる特別な関数を使用して、ルーチンを定義できます。
  • ルーチンを定義し、立ち上がりエッジ、立ち下がりエッジ、またはその両方で条件を指定できます。 これらの特定の条件では、割り込みが処理されます。
  • 入力ピンでイベントが発生するたびに、その機能を自動的に実行させることができます。

割り込みの種類

割り込みには2種類あります-

  • ハードウェア割り込み-外部割り込みピンがハイまたはローになるなど、外部イベントに応答して発生します。
  • ソフトウェア割り込み-ソフトウェアで送信された命令に応じて発生します。 「Arduino言語」がサポートする唯一のタイプの割り込みは、attachInterrupt()関数です。

Arduinoで割り込みを使用する

割り込みは、タイミングの問題の解決に役立つため、Arduinoプログラムで非常に役立ちます。 割り込みの適切なアプリケーションは、ロータリーエンコーダーの読み取りまたはユーザー入力の監視です。 一般に、ISRはできるだけ短く、高速である必要があります。 スケッチで複数のISRを使用している場合、一度に実行できるのは1つだけです。 他の割り込みは、現在の割り込みが終了した後に、優先度に応じた順序で実行されます。

通常、グローバル変数は、ISRとメインプログラムの間でデータを渡すために使用されます。 ISRとメインプログラム間で共有される変数が正しく更新されるようにするには、それらをvolatileとして宣言します。

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
  • ピンがHighからLowに変化するたびに Falling になります。

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
}