割り込みハンドラで時間を計測してるっぽい箇所がありましてね。
int count = 1;
void wait_timer()
{
// カウントが100000以上になったらリセット
// 約0.4602 msecごとに呼び出される
if (count++ > 100000)
{
count = 1;
}
}
H8OSでは8192カウント毎に割り込みが発生します。
つまり、今回のように20MHzの水晶だと、1 / 20000000 * 8192 = 0.0004096 secとなり、0.4096 msec毎に割り込みが発生するはずなのです。
で、問いただしてみると、オシロで計測した数値だとのこと・・・うーん・・・それでいいのかよ・・・。
実際の理論値と比較しても、1カウント辺り0.0506 msecのズレが発生している訳ですよ。ということはこれを100000回繰り返している訳ですから、条件を満たす頃には5 secほど誤差が発生しますよと。
まぁ、仮に誤差を許容するとして、1カウント辺り0.4602 msecだとしても100000カウントって46.02 secですよ。
そんな長い時間計測して何に使用しているのかな?と解析してみると計測終了の監視に使っているようなのですね。
しかし、終了する条件が(count == 1)を満たした場合・・・おいおい。
たまたま、この条件を満たした状態で判定文を通過してくれればいいですが、最初の割り込みが発生する前に判定文に到達したら即終了ですし、そうでなかったらもう46秒待機ですよ。(幸いにもここでおかしくなっているという報告は今のところないですが・・・)
今、たまに固まって暴走(にみえる)状態になってしまうってんで、原因を解明すべくデバッグしてるんですけどね・・・もうね、序盤にしてツッコミどころが満載過ぎて疲れました・・・。