MARY-DUINO、マイクロ秒オーダのユーザ割込み関数とウエイト関数に対応
MTM07に出展の皆様お疲れさまです。
風邪など引かぬようお気をつけて下さい。
さて、Arduinoのウェイト関数でMARY-DUINOに未実装だった関数を実装しました。
- delayMicroseconds()
- micros()
加えて
- attachMicroseconds((void *)user_function, int us)
- detachMicroseconds(void)
前者2つの関数はArduinoを使っている方なら言うまでもないでしょう。
後者二つはオリジナル関数です。これは
- Ethernetライブラリのタイムアウト関数
- LPC11U14などUSB関連でOSレスのエンドポイント管理
- mbedのtimerクラスに対応するための準備
- 音声再生のためにはマイクロ秒オーダの割り込みが出来た方が良い
といった要求に対応する為に準備段階として実装しました。
なおこれにより、TIMER32B1がこれら4つの関数のために消費されます。PWMなどを実装しようとしている方はご注意下さい。
■使い方
attachMicroseconds( [自分で決めた関数名] , [割り込みさせたい周期[マイクロ秒]] )
で宣言します。
この宣言文より前に、割り込みさせたい関数が宣言されている必要があります。
割り込みを停止させたい場合は
detachMicdoseconds();
とすれば割り込みは止まります。実例を示します。main.cppに記述して下さい
#include <math.h> #include <libmary.h> #include <stdlib.h> void foobarfunction(void)// ユーザ定義の割り込み関数 { Serial.println("interrupt..."); // known bugs: No use delay() functions in user-defined interrupt functions // 既知のバグ:delay()関数がユーザ定義の割り込み関数内では使えません } void setup() { Serial.begin(9600); } void loop() { attachMicroseconds(foobarfunction,100000); // 100000マイクロ秒ごとにfoobarfunction()をコールする delay(1000); //1秒停止 detachMicroseconds(); //割り込みを停止 while(1) { Serial.print("loop..."); Serial.println(micros(),DEC); delay(500); } }
■既知のバグ
割込み関数内部ではdelay(),micros(),millis(),delayMicroseconds()といったウェイト関連の関数が使えません。使うとプログラムが停止します。
将来的にこのエラーは取り除かれる予定です。
■ダウンロードリポジトリ
http://github.com/lynxeyed-atsu/MARY-DUINO
※バージョン20111203 になります
20111205:detachが出来ないバグを修正しました