読者です 読者をやめる 読者になる 読者になる

Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

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が出来ないバグを修正しました