CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

割込み修正

今の処理には2つ問題があって1つ目はカウンタTMR0が8ビットしかないので0-255までしかカウントできないことです。

これはTMR0のオーバフロー割込みを許可して新たに割込み関数に追加したハンドラの中で変数TMR0Hをインクリメントするようにしました。これで見かけ8+16=24ビット長のカウンタとみなせます(実際には10進で9999までカウントできればいいので14ビットあれば十分ですが)

もう一つが低い周波数を測定するときにゲートタイムを長くしたいということです。現状TMR2の割込み間隔が1msで固定ですがこれを10倍にしようとしてもTMR2周りのプリ/ポストスケーラ、コンパレータ値の設定範囲が狭いためできません。これは割込みハンドラに回数カウンタを設けることで解決しました。定数GTIMEで割込み10回に一度、100回に1度しか計数処理をしなければgatetimeを10ms、100msにしたことになります。

修正後の割込み処理がこのような感じです

f:id:O3I:20200713091651j:plain

 

TMR0のクロック源を仮にFosc/4、プリスケーラを8に設定して見かけ625kHzを与え、ゲートタイム1msのときの表示です。「624」が表示されるので桁上げ処理もOKです。最後の桁の±1は測定原理上避けられません。ただしテスト測定クロックもタイムベースも同じ水晶が原振なのでこれは単に分周比を示しているだけであって絶対精度はわかりません。

 

f:id:O3I:20200713094603j:plain

 

いちおう周波数カウンタの実装はうまくいってそう。ちょっと失敗だったのがパラレルI/OをモニタするバーLEDが不規則に点灯してしまってます。これはターゲットCPU基板をつないで無いときにCMOS入力が浮いちゃってるためで本当はよろしくなかったです。

 

f:id:O3I:20200713100737j:plain