【ソフトウェア全体構成】
PIC側のソフトウェアは、マイクロチップ社から提供されているCDCクラス、つまり、
「RS232C over USB」を使って簡単にUSB接続が実現できます。
このCDCクラスのライブラリをほとんどそのまま使い、main.cとio_cfg.hを変更するだけです。
PC側のソフトウェアはRS232C接続なので、CDCクラスで提供されているINFファイルを
使ってWindows標準内蔵のUSBドライバを使います。
これであとは通常のRS232Cのインターフェースで通信ができるようになりますので、
MSCommやWindowsAPIで通信するようにすれば問題なくアプリができます。
あるいは、ハイパーターミナルを使っても問題ありません。
ソフトウェア全体構成を図にすると下図のようになります。
【USBフレームワーク変更内容】
CDCクラスライブラリに含まれるUSBフレームワークを使ってユーザーアプリケーションを
作成する場合、変更が必要になるファイルは下記となります。
(1) io_cfg.hの変更
作成したポートの使い方に合わせてI/Oピンの指定をします。USB用に特別に使う
I/Oピンはありませんので、ユーザー側のI/O指定だけ考えれば問題ありません。
(2) main.cの作成
この中にユーザーアプリケーションを記述しますから、これは基本的に新規作成と
なります。USB用として唯一必要になる記述は、USBのイベントのポーリングをする
記述部分で、これは、CDCクラスでの記述をそのまま使えますので、残しておくだけです。
(3) user.cの作成
ユーザーアプリケーションをmain.c自身の中に記述するか、このuser.cファイルとして
独立させるかの差だけで、記述する内容は同じです。
(4) 液晶表示ライブラリの追加(lcd_lib.cとlcd_lib.h)
液晶表示器を使うためのライブラリです。これまで他のPICで使ったものを少し修正
して使っています。
(5) その他
細かい変更で必要になるのは、下記の2個所です。
@ USB電源チェック (usbcfg.h)
セルフパワーか、USBが接続されたかのチェックをI/Oピンで行うかどうかの設定です。
下記2行の記述部分で、電源チェックをポートで行わない場合にはコメントアウトします。
//#define USE_SELF_POWER_SENSE_IO //セルフパワーの電源オン
//#define USE_USB_BUS_SENSE_IO //バスパワーの電源オン
A IDの変更(usbdsc.c)
ベンダーIDとプロダクトIDを変更する場合には、デバイスデスクリプタを変更します。
usbdsc.cファイルの下記の部分が該当個所です。
このIDを変更した場合には、CDCクラスに同梱されている、PC用のUSBドライバ用INF
ファイルも変更する必要があります。そうしないとこのIDが認識されないことになります。
【PICメイン部詳細】
main.cのユーザーアプリケーション部は、目的によって自由に作ることができます。
今回作成したmain.cは動作テスト用で、PC側はハイパーターミナルを使うことを前提に
しています。
PC側からは、1文字の数字が送信されてくるという前提で、その数字によって下記のように
動作内容を決めています。
メイン関数内ですべて記述してしまいましたので、user.cはありません。
受信数字 機能内容 備 考 0 メッセージデータの返送 メッセージ内容は"Welcome xxxxxxCRLF"
xxxxxx部はカウンタ数値1 発光ダイオードLED1の表示反転 単純に点滅反転 2 発光ダイオードLED2の表示反転 〃 3 液晶表示器にメッセージ表示 メッセージ内容は"Welcome xxxxxxCRLF"
xxxxxx部はカウンタ数値4 液晶表示器の全消去 カウンタ値も0にクリア 5 可変抵抗のA/D変換値を送信 メッセージ内容は"Pot = xxxx CRLF"
xxxx部は4桁の10進数6〜9 何もしない
ユーザーアプリから、USBの入出力を行うときには、CDCクラスの関数を使います。
RS232Cの解説ページで説明した下記関数を使っています。
関数名 機 能 putrsUSBUSART プログラムメモリ内の文字列データをUSBで送信する putsUSBUSART データメモリ内の文字列データをUSBで送信する mUSBUSARTTxRom プログラムメモリ内の指定サイズのバイトデータをUSBで送信する mUSBUSARTTxRam データメモリ内の指定サイズのバイトデータをUSBで送信する mUSBUSARTIsTxTrfReady 送信レディ、次のデータが送れることを示す getsUSBUSART USBからバイト列データを受信する mCDCGetRxLength 最新の受信データの長さを取得する
この汎用入出力ユニットのテスト用プログラムのメイン関数のリストは下記のように
なっています。
まず宣言部で、ここはCDCクラスを元にして液晶表示器関連の追加とプロトタイプを
変更しています。
次がメイン関数の初期化部で、ポート、USB、LCDの初期化を行っています。
user.c関数を作りませんでしたので、UserIni()関数を作らずすべてこの部分で
実行しています。
次がメインループ部で、ここでUSBのイベントポーリングを実行し、受信データ
があれば、受信した内容に基づく処理を実行しています。
USBのポーリングにはできるだけ早く戻る必要があります。特にUSBと接続
する場合のプラグ&プレイの実行中は他の処理は何もしない方が安定に
接続できます。
残りはサブ関数部で表示制御とアナログ入力処理関数です。
これらのファイルをプロジェクトに登録して使いますが、登録は下図のように
行います。下記でヘッダファイルの登録はあっても無くても構いません。
リンカファイルの登録を忘れないようにして下さい。
【PC側ソフトウェア概要】
今回の汎用入出力ユニットでは、PC側のプログラムは特別に作っていません。
すべてハイパーターミナルだけで実験しています。