周期処理

周期的な処理を行うためのライブラリです。 3タイプのライブラリが用意されています。
MsTimer2は、ArduinoのPlaygroundに掲載されているものとと同様の文法で使用可能です。MsTimer2を使用するためには、#include <MsTimer2.h> を記述してください。

attachIntervalTimerHandler

概要
1ms間隔で実行したい関数を登録します。
文法
attachIntervalTimerHandler(void(*)(unsigned long) function)
パラメータ
function: 関数名
戻り値
なし
補足
以下の関数が呼び出し可能です。
pinMode(), digitalWrite(), digitalRead(), millis(), micros(), delayMicroseconds(), min(), max(), constrain(), map(), lowByte(), highByte(), bitRead(), bitWrite(), bitSet(), bitClear(), bit(), randomSeed(), random()
Note: pinMode(), digitalWrite()は、loop()内で使用しているピンと同じ番号を指定すると誤動作する可能性があります。

detachIntervalTimerHandler

概要
1msインターバル関数の登録を解除します。/dd>
文法
detachIntervalTimerHandler()
パラメータ
なし
戻り値
なし

MsTimer2::set

概要
指定した周期間隔(ms)で処理する関数を登録します。
文法
MsTimer2::set(unsigned long ms, void (*function)())
パラメータ
ms: 周期(ms)
function: 関数名
戻り値
なし
注意
タイマー処理(function)内はデフォルトでは割り込み禁止で実行されます。割り込みを伴う処理はinterrupts()で割り込み許可してください。

MsTimer2::start

概要
setしたタイマーをスタートします。
文法
MsTimer2::start()
パラメータ
なし
戻り値
なし

MsTimer2::stop

概要
タイマーをストップします。
文法
MsTimer2::stop()
パラメータ
なし
戻り値
なし

attachCyclicHandler

概要
指定した周期間隔(ms)で処理する関数を登録します。関数呼び出し時にシステム開始からの時間(ms)が引数として取得できます。
文法
attachCyclicHandler(unsigned char number, void(*)(unsigned long) function, unsigned int time)
パラメータ
number: 0~7(関数の識別番号)
function: 関数名
time: 周期(ms)
戻り値
なし

detachCyclicHandler

概要
周期関数の登録を解除します。
文法
detachCyclicHandler(unsigned char number)
パラメータ
number: 0~7(関数の識別番号)
戻り値
なし
注意
loop関数内で処理されるため、loop周期よりも短い間隔を指定しても正しく実行されません。

サンプルプログラム

1ms周期関数とMsTimer2を使ったサンプルです。


#include <Arduino.h>
#include <MsTimer2.h>
void using_mstimer2() {
  static boolean output = HIGH;
 
  digitalWrite(PIN_LED0, output);
  output = !output;
}
 
// this function is called every 1ms.
void using_intervaltimer(unsigned long ms){
  static boolean output = HIGH;
  static unsigned long time;
 
  if((ms - time) > 1000){
      interrupts(); // to allow USB operation
      Serial.println(ms);
      time = ms;
      digitalWrite(PIN_LED1, output);
      output = !output;
  }
}
 
void setup() {
    pinMode(PIN_LED0, OUTPUT);
    pinMode(PIN_LED1, OUTPUT);
    Serial.begin(9600);
 
  MsTimer2::set(500, using_mstimer2); // 500ms period
  MsTimer2::start();
 
  attachIntervalTimerHandler(using_intervaltimer);
}
 
void loop() {
}