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