2012年8月9日木曜日

タイマー割り込みについてお勉強

今日は、タイマー割り込みについてのお勉強です。

処理と処理の間(ま)を取りたい時にお馴染みなのは、delay()関数ですね。
Loopの中で、良く使います。
Arduinoの処理が速いときに、適度な間を取るために、delay()関数を使います。
たとえば、下記のスケッチでは、光の明るさを読み取り、LCDモジュールに表示しています。
明るさをAnalogReadで読み取り、delay(500)の関数を使って、500ミリ秒待ってから、LCDモジュールへ表示しています。

void loop()
{
 digitalWrite(LCD_BL,HIGH);
 int anain ;
 lcd.setCursor(0, 0);
 lcd.print("CDS Input Value");

 anain = analogRead(0) ;  // CDSを接続したアナログ0番ピンを読み取る

 delay(500);
 lcd.setCursor(0, 1);
 lcd.print(anain);
}

上の例だと、Loop内は、500ミリ秒 + 「それぞれの命令の処理時間」の総合計で繰り返されます。

もし、決まった時間で処理を行いたい場合、たとえば、500ミリ秒おきに処理を行いたい場合にはdelay()関数では命令の処理時間分を加味して、値を決める必要があります。つまり、全部合計して500ミリ秒になるようにする必要があります。

そんなのめんどくさいです。というより、正確な計算はできないです。


そこで、使うのが、タイマー割り込みです。

Loop内で処理を行い、決まった時間になったら、割り込み処理が発生し、決まった処理をする。決まった処理が終わったら、もとのLoop 内の処理に戻る。

図にすると













こういった割り込み処理を行いたい場合には、ちゃんとMsTimer2というライブラリーが公式ページで公開されています。
http://www.arduino.cc/playground/Main/MsTimer2

ライブラリーの使い方も、このページで英語ですが記載されています。

使い方は、簡単です。覚えることは、3つだけです。

・MsTimer2::set(割り込み間隔のミリ秒, 関数名)
  割り込み間隔と割り込み時間になった時に実行する関数の名前を指定します。

・MsTimer2::start()
  割り込みカウンターの開始命令

・MsTimer2::stop()
  割り込みカウンターの停止命令

この3つが分かれば、使えます。
これが分かったうえで、サンプルスケッチを見てみると、あっさり理解できます。


// Toggle LED on pin 13 each second
#include <MsTimer2.h>      ← include文で、MsTimer2ライブラリの使用を宣言

void flash() {            ←flashというのが割り込み処理する際の関数の名前
  static boolean output = HIGH;

  digitalWrite(13, output);
  output = !output;
}

void setup() {
  pinMode(13, OUTPUT);

  MsTimer2::set(500, flash); // 500ms period ←500ミリ秒おきにflash関数の実行を指定
  MsTimer2::start();        ←タイマー割り込み開始
}

ちなみにloop{ }が記載されていませんが、普通にLoop 内に処理を記載して問題ありません。
そのための割り込みですから。

今日はここまでです。


電子工作の回路図から学びたい


0 件のコメント:

コメントを投稿