パルス測定入力に与えられたパルス幅を測定するもので簡易的なストップウオッチのようなものです。構成は以下のようにTMR1を内蔵クロックで自走させパルス入力の立上り立下りでカウンタ値を取得するとパルス幅がわかります。本来はタイマを外部ゲート/T1Gで制御したりCCPユニットのキャプチャ機能でハード的にタイマ値を取得するのがタイムラグが無くていいのですがゲート入力やCCP入力は汎用入出力に使ってしまっておりアサインできません。今回の付け足し機能だけのためにジャンパを飛ばすのも何なので単純に汎用入力でパルス入力ピンをポーリングし状態が変わったところでタイマ値を読取ります。おそらくソフトのオーバヘッドは数μSであるし、立上り立下りのタイムラグが対称的であれば打ち消しあって意外に正確かもしれません
こうして測定モードを追加してボタン押下で以下の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℃
パルス幅測定モードのテストの様子です
右側の小さい基板は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入力や割込みピンなどアサインが固定されている機能をあとから使おうとすると今回のようにジャンパしたりファームで何とかしなければなりません。回路設計の時点で機能を煮詰めておかないとだめだし、実装スペースに問題無ければ初めから多ピンのチップを使った方がいいかもです