周期処理

周期的な処理を行うためのライブラリです。4タイプのライブラリが用意されています。

  • 1ms周期固定で1関数を実行する。
  • 1us周期固定で1関数を実行する。
  • 指定周期で1関数を実行する。(MsTimer2)
  • 指定周期で複数の周期関数を実行する。ただし、Loop関数の周期に影響されます。

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インターバル関数の登録を解除します。

文法

detachIntervalTimerHandler()

パラメータ

なし

戻り値

なし

attachMicroIntervalTimerHandler

概要

指定された間隔[us]で実行したい関数を登録します。

文法

attachIntervalTimerHandler(void(*)(unsigned long) function, uint16_t interval)

パラメータ

function: 関数名
interval: 周期[us]

戻り値

なし

補足

以下の関数が呼び出し可能です。
pinMode(), digitalWrite(), digitalRead(), millis(), micros(), delayMicroseconds(), min(), max(), constrain(), map(), lowByte(), highByte(), bitRead(), bitWrite(), bitSet(), bitClear(), bit(), randomSeed(), random()
Note: pinMode(), digitalWrite()は、loop()内で使用しているピンと同じ番号を指定すると誤動作する可能性があります。
関数の登録によりtone()が使用できなくなります。tone()から変更する場合は、HOOK_TIMER_CHANNELを変更してください。

detachMicroIntervalTimerHandler

概要

マイクロ秒のインターバル関数の登録を解除します。

文法

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)

戻り値

なし

注意

loop関数内で処理されるため、loop周期よりも短い間隔を指定しても正しく実行されません。

detachCyclicHandler

概要

周期関数の登録を解除します。

文法

detachCyclicHandler(unsigned char number)

パラメータ

number: 0~7(関数の識別番号)

戻り値

なし


サンプルプログラム

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


        #include <Arduino.h>
        #include <MsTimer2.h>
        void using_mstimer2() {
            static boolean output = HIGH;
            
            digitalWrite(12, 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(13, output);
                output = !output;
            }
        }
            
        void setup() {
            pinMode(12, OUTPUT);
            pinMode(13, OUTPUT);
            Serial.begin(9600);
            
            MsTimer2::set(500, using_mstimer2); // 500ms period
            MsTimer2::start();
            
            attachIntervalTimerHandler(using_intervaltimer);
        }
            
        void loop() {
        }