CPU実験室

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

パルス幅測定

テスト用治具ファームウェアに測定モードを追加しました。

パルス測定入力に与えられたパルス幅を測定するもので簡易的なストップウオッチのようなものです。構成は以下のようにTMR1を内蔵クロックで自走させパルス入力の立上り立下りでカウンタ値を取得するとパルス幅がわかります。本来はタイマを外部ゲート/T1Gで制御したりCCPユニットのキャプチャ機能でハード的にタイマ値を取得するのがタイムラグが無くていいのですがゲート入力やCCP入力は汎用入出力に使ってしまっておりアサインできません。今回の付け足し機能だけのためにジャンパを飛ばすのも何なので単純に汎用入力でパルス入力ピンをポーリングし状態が変わったところでタイマ値を読取ります。おそらくソフトのオーバヘッドは数μSであるし、立上り立下りのタイムラグが対称的であれば打ち消しあって意外に正確かもしれません

 

f:id:O3I:20201025162245j:plain

 

こうして測定モードを追加してボタン押下で以下の8モードの切り替えができます

 MODE0: 周波数カウンタ ゲートタイム:1ms    9999kHz(最大)

 MODE1: 周波数カウンタ ゲートタイム:10ms  999.9kHz

 MODE2: 周波数カウンタ ゲートタイム:100ms   99.99kHz

 MODE3: 周波数カウンタ ゲートタイム:1s     9.999kHz

 MODE4: 積算カウンタ  ゲートタイム:無限大      9999

 MODE5: パルス幅計測  基準クロック:5MHz     9999us

 MODE6: パルス幅計測  基準クロック:625kHz   99.99ms

 MODE7:  温度計     分解能0.1℃         125℃

 

 

パルス幅測定モードのテストの様子です

f:id:O3I:20201025162303j:plain

右側の小さい基板はpickit3にお試し用についてきたPIC16F887評価基板で、ここでは半固定抵抗で分圧した電圧をA/D変換し得られた0~255の値×1ms幅のワンショット正パルスを出力するプログラムを載せた簡易パルスジェネレータにしています。いま10ms設定にしてMODE5で読取ると9962μSとなったので大体良いでしょう。

ここまで機能を載せた現状でPIC16F886のプログラミング状態は

Memory Summary:
 Program space used  867h ( 2151) of 2000h words ( 26.3%)
 Data space used          4Eh ( 78) of 170h bytes ( 21.2%)
 EEPROM space used      0h ( 0) of 100h bytes ( 0.0%)
 Configuration bits used  2h ( 2) of 2h words (100.0%)
 ID Location space used  0h ( 0) of 4h bytes ( 0.0%)

でまだかなり余裕がありました。ただ外部からのクロック、ゲート、CCP入力や割込みピンなどアサインが固定されている機能をあとから使おうとすると今回のようにジャンパしたりファームで何とかしなければなりません。回路設計の時点で機能を煮詰めておかないとだめだし、実装スペースに問題無ければ初めから多ピンのチップを使った方がいいかもです