noInterrupt関数
Arduino IDEで使用するnoInterrupts関数は、一度設定した外部割込みを一時的に停止(割り込みが複数の場合は全て停止)します。interrupts関数を実行する事で割り込みを再開します。
時間に敏感な重要な処理を行う時は割り込みによる影響を回避する為、処理の前に割り込みを停止してから処理し、処理後割り込みを再開するなどの使い方をします。
使用例
試しにこのプログラムを実行すると、1秒毎に経過時間をPCのシリアルモニター上に表示します。
2番ピンをGNDに接触すると経過時間はリセットされ再び0からカウントが再開します。
volatile unsigned long Val; //変数Valの宣言 void setup() { pinMode(2, INPUT_PULLUP); //外部割込みの2番ピンをプルアップし入力に設定 attachInterrupt(digitalPinToInterrupt(2), Reset, FALLING);//2番ピン割込時実行 Serial.begin(9600); //9600bpsでシリアルポートを開く } void loop() { float A; //変数Aの宣言 interrupts(); //割り込み開始 for (byte i = LOW;; !i) { //breakするまで無限ループするfor文です A = millis() % 1000; //経過時間(ms)を1000で割った余りをAに代入 if (A == 0) { break; //もし余りが0ならfor文を抜ける } } noInterrupts(); //割り込み停止 Val++ ; //1秒カウントアップする Serial.println(Val); //経過時間を出力します delay(1); //プログラムが早すぎるので少し待つ } void Reset() { //2番ピンをGNDに接触で経過時間をリセット Val = 0; }
図1:プログラム例
noInterruptsにパラメータ及び戻り値はありません 。
図1:プログラム実行時のシリアルモニター
※図1は2番ピンに挿したジャンプワイヤーを、途中でGNDにガチャガチャ挿してリセットした状態です
励みになりますのでよければクリック下さい(^o^)/