周波数カウンタの動作はできているのですが被測定用のクロックの周波数を上げたりゲートタイムを延しているとカウンタ動作がフリーズしたり、突然リセットがかかったりすることがあります。Cで書いているなら暴走なんてそうそうないことなんですがあるとすれば割込み周りでしょう。
TMR2によるインターバル割込みはこれは不可欠なんですが、TMR0の桁上げのための割込み、これがちょっと余計な仕事です。これは測定周波数が上がるとそれに応じて割込みも増え、割込み処理に必要な時間より短い周期で桁上げされると多重割込みが起こったりスタックを食い潰している可能性があります。
ここはもう初めから16ビットカウンタであるTMR1でカウントをすべきでした。これならば桁上げもハード的にやってくれるわけです。
被測定信号はT1CKIに入力し赤ラインでTMR1に接続されます。デバッグ時は青ラインでテスト信号も入力できます。
割込みルーチンも書き換え。要因はTMR2タイムアウトのみで、割込みハンドラの中でTMR1の16ビットカウントを読取ります。
16ビットカウンタを1バイトづつ読取るとき、下位バイトから上位バイトの桁上げの瞬間に不正な値を読んでしまうのを防ぐために2度読みしたり、ハード的なラッチをかける(i8253/4など)等の工夫をするのが定石ですが、ここではベタで読み取って上位下位合成しているだけです。桁上げの瞬間に読取るなんて確率的にまず起きないし、起きたとしてもカウント値を目視するだけなのでわからないでしょう
ソフト修正はこれだけで簡単なのですが、残念なのはここでパタン修正が入ってしまうことです。測定信号をT1CKIへ入力するためジャンパ飛ばし。T1CKIはポートCのRC0ビットと多重化していますがこのこのピンはすでに7セグLEDの小数点セグメントドライブに使っていました。これを泣く泣くパタン切断し、未使用だったポートAのRA5ビットに接続です
痛恨のパタンカット、ジャンパ飛ばしです。今回パタンを考えるとき、PICと周辺デバイスとの接続がシンプルになるようピンアサインも考えたのですが台無しです