« 2009年度トライアルコースのWay Point設定を検証する | トップページ | レポートと発表の準備 »

2009年11月30日 (月)

ファームにバグ発見

今年度のつくばチャレンジは終わりましたが、まだ12月24~26日にSI2009の発表が残っているので、開発が間に合わなかった分を少しずつ作っています。

今日は台車を制御しているファームウェアにちょっとした機能を追加しましたが、その際にバグを見つけました。Windows側の時間管理があまり信用できないのでファームからロータリーエンコーダのカウント数を取得する際に、ファーム側にミリ秒単位のタイムスタンプをつけるようにしました。そしてPCでそのタイムスタンプ付きのロータリーエンコーダカウント数を取得させてみたところ、本来ならばタイムスタンプは100ms毎になっているはずなのに、きれいに105ms毎になっていました。

ファームではSH7125のCMT0のコンペアマッチ割り込みで 1ms 単位の時間管理をしているのですが、これが正確に 1ms になっていなかったようです。理由は、CMT0の初期化を行う部分のソースコードを見たらすぐにわかりました。周辺クロックを20MHzで計算してました。

このSH7125のCMT0初期化部分のソースコードは、以前アルファプロジェクトのSTK-7125用に書いたものをそのまま使いまわしたのですが、今回使っているCPUボードは秋月電子のAKI-7125なので、クロック周波数が少し違います。周辺回路のクロックはSTK-7125なら20MHzでしたが、AKI-7125では25MHzになります。なので、コンペアマッチを作るためのカウンタの値が違います。

参考までにCMT0の初期化部分のソースコードをUpします。


/**
	CMT0を 1ms のインターバルタイマとして使用するための初期化
*/
void CMT0_init(void)
{
	// 周辺回路動作周波数がφMHz、プリスケーラ P, のとき、
	// 時間 t を作るのに必要なカウント値 tcnt は
	//		tcnt = (t ×φ×10^6 ÷ P) - 1
	// である。
	// tcnt が出来る限り大きな値になるよう、プリスケーラを
	// 選択すること。
	
	// 周辺回路クロック		20MHz
	// プリスケーラ		8
	// 作りたい時間		10-^3 sec
	unsigned short tcnt = ((20 * 1000)/8) - 1;
	
	CMT0.CMCSR.BIT.CKS  = 0;		// プリスケーラ(0:φ/8)
	CMT0.CMCOR 		= tcnt;		// 1msタイマーSET
	CMT0.CMCSR.BIT.CMF	= 0;		// コンペアマッチフラグクリア
	CMT0.CMCSR.BIT.CMIE = 1;		// コンペアマッチ割り込みを許可
	
	
	INTC.IPRJ.BIT._CMT0 = 8;		// 割り込み優先度
	
	CMT.CMSTR.BIT.STR0  = 1;		// CMCNT0カウントスタート	
	
}

直すべき部分は、すぐわかりますね。

« 2009年度トライアルコースのWay Point設定を検証する | トップページ | レポートと発表の準備 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/46894712

この記事へのトラックバック一覧です: ファームにバグ発見:

« 2009年度トライアルコースのWay Point設定を検証する | トップページ | レポートと発表の準備 »

最近の写真