[H8-ML(4005)] キャプチャとオーバーフローの競合 (Was Re:位相計数カウンタについて)
From: Shigeru Makino <mac@xxxxxxxxxxxxxx>
Date: 2003年10月09日(木)11時15分08秒
macです。

> そのときはインプットキャプチャを使って、トリガ間のカウント数をGRAとOVFの
> 回数で算出したのですが・・・
> 
> 他のタイマなどの割込み処理中に
> オーバーフローとインプットキャプチャが立て続けに起こった場合、
> 同IPRの中ではGRAインプットキャプチャが強いので他のタイマの割込み処理終了
> 後にインプットキャプチャ割込みが先に発生します。

ITUで、2^16以上を勘定出来るように、
ソフト的な解決を目指すと、
簡単そうなところで、
予想外のタイミングがからみ、
一気に難問化するのは、案外、
良くあることなのかもしれません。

パルス周期を安全に計測する場合、
ITUを2個おごってやると、
うまく行く用に思えます。

同じクロックソース、同じキャプチャー条件で、
駆動するITUを2個用意します。
ITU1, 2を使うと仮定しましょう。

インプットキャプチャが発生したら、
値を読み取り、直ちにTCNT1に"0"を書き込みます。
i = TCNT1;
TCNT1 = 0;
その後、TCNT2を読み、
キャプチャした値と等しいか比較し、
TCNT2をリセットします。

switch (TCNT2 - i) {
	case 0:
		TCNT2 = 0;
		break;
	case 1:
		TCNT2 = 1;
		i++;
		break;
	default:
		/* エラー処理 */
}

再び、TCNT1を読み、
この処理中にカウントが変化しなかったか調べます。

switch (TCNT1) {
	case 0:
		return(i);
	case 1:
		TCNT1 = TCNT2 = 0;
		return (i+1);
		break;
	default:
		/* エラー処理 */
}

1. オーバーフローが発生しないような処理を書く。
2. 割り込み処理中に、1 count以上のパルスが入らないような、
	処理速度で動作するハードウエアにする。

を考慮すれば、この問題は回避可能と思います。

-- mac

スレッド概略
[3936(R)](起点)
 └[4001(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]