USB接続周波数カウンタ(ソフトウェア編)


【ソフトウェア全体構成】

PIC側のソフトウェアは、これまでのものと同様にマイクロチップ社から提供されている
CDCクラス、つまり、「RS232C over USB」を使って簡単にUSB接続が実現できます。
このCDCクラスのライブラリをほとんどそのまま使い、main.cとio_cfg.hを変更するだけです。

PC側のソフトウェアはRS232C接続なので、CDCクラスで提供されているINFファイルを
使ってWindows標準内蔵のUSBドライバを使います。
これであとは通常のRS232Cのインターフェースで通信ができるようになりますので、
MSCommやWindowsAPIで通信するようにすれば問題なくアプリができます。
あるいは、ハイパーターミナルを使っても問題ありません。

ソフトウェア全体構成を図にすると下図のようになります








【PICメイン部詳細】

PICのアプリをmain.c内で記述してしまいました。このmain部のプログラムの流れは
簡単で、最初に初期化を実行したあと、メインループに入り、USBのイベントポーリング
をしたあと、受信の有無をチェックしています。受信データがある場合にはその内容に
従って処理を行います。

処理が済んだら、次にカウント中にタイマ0がオーバーフローしたかどうかをチェック
しています。オーバーフローしていたらカウンタ変数FreqHighを+1しています。
続いて、1秒ゲートが終了したかどうかをEndFlagをチェックして判定します。
もし終了していたら、周波数計測が終了したということですから、周波数を計算して
液晶表示器に表示し、USB送信用バッファにも格納しておきます。
表示が完了したら、次の計測を開始するために、タイマや変数をクリアしてから
タイマ1とタイマ0をスタートさせます。

このあとは、一定時間間隔でCCP1の割り込みが入りますので、その割り込み処理で
25回割り込みをカウントして25回目になったら、タイマ0とタイマ1を停止させてEndFlagを
1にセットします。

これで一巡の処理を完了しUSBのイベントポーリングに戻ります。
この一巡の周期はできるだけ高速に行う必要があります。特に、USB接続時の最初の
プラグ&プレイ処理の間は、他の処理は何も入れないで即応答するようにした方が
安定に接続を完了できます。

PCからのコマンドデータのフォーマットは最初の1文字をコマンドとしていて下記の
ようになっています。この1文字をswitch文で判定して各処理に分岐しています

 0:最新の計測結果を送り返す
 1:タイマ0のプリスケーラ値を1/1にする。これで最大10MHz、分解能1Hzとなる
 2:タイマ0のプリスケーラ値を1/8にする。これで最大50MHz、分解能8Hzとなる



【PC側ソフトウェア概要】

今回はPC側のソフトウェアはハイパーターミナルを使いました。




  トップページへ