USBインターフェースの汎用I/Oユニット

 パソコンとUSBで接続し、最大28ビットの
 入出力ができる汎用のユニットです。


【概要】

PIC16F877にUSBデバイスコントローラである、ナショナルセミコンダクタ社の
USBN9603」を接続し、フルスピードでのUSB通信で、汎用の入出力を行い
ます。
このユニットのUSB通信で可能なことは下記となっています。

 (1) パソコンから PICのポートの入出力モードの設定
     ビット毎に入力か出力かを指定出来ます。
 (2) パソコンからのポート入出力
    最大28ピンの入出力が出来ます。
 (3) 液晶表示器への表示メッセージ出力
   パソコンからのメッセージを液晶表示器に表示する。

【ユニットの構成】

本ユニットの全体構成は下図のようになっていて、PIC16F877とSUBN9603だけで
大部分が構成されています。USBN9603でパソコンとフルスピードモードで接続し
PIC16F877の余ったポートは全て外部に取り出しています。
ポートBは、液晶表示器にも使えるように、ポートCと組み合わせています。






また、全ての入出力のポートには10kΩのプルアップ抵抗を付けていますので
スイッチ類をそのまま接続すれば入力が可能となっています。

【回路構成】

上記の構成を回路図で表すと下図のようになります。USBN9603には、クロック用
として24MHzのクリスタル発振器を使いました。この発振器は、通常のクリスタル
振動子と同じHC49USタイプなので、小型で使いやすいと思います。ただし20mA
とやや消費電流が多いですが。
あとは特別な素子回路も無いので簡単だと思います。下図は拡大出来ます。







下記ファイルはWinDraft、WinBoard用の回路図とパターン図です。
ダウンロードし解凍してお使い下さい。

  ★ 回路図ファイル(WinDraft用)
  ★ パターン図ファイル(WinBoard用)


【デバイス側プログラム】

C言語版のUSB基本プログラムに、各エンドポイントのユーザー処理部を
追加して作成します。
エンドポイントの構成は下表のようにしています。IN/OUTの見方はホスト側から
見た入出力となっています。
USBN9603は最大でエンドポイントがコントロール+6個まで使えます。基本デバ
イスプログラムでは、全部が使えるようになっていますが、汎用I/Oとして使って
いるのは、下表のようにコントロール+4個です。

パイプNo エンドポイント IN/OUT 処理関数 用途
無し IN/OUT コントロール転送
コンフィギュレーション用
バルクIN do_tx1( ) 未使用
バルクOUT do_rx1( ) コマンド出力
 ・汎用入出力モード設定コマンド
 ・液晶表示器モード設定コマンド
 ・状態入力コマンド
バルクIN do_tx2( ) 未使用
バルクOUT do_rx2( ) 全ビットへの出力
バルクIN do_tx3( ) 全ビットの状態入力
バルクOUT do_rx3( ) 液晶へのメッセージ出力
16文字×2行のメッセージ表示用

デバイスのプログラムはC言語ベースとなっています。C言語で作成したUSBの
基本プログラムにユーザー処理部分を追加しています。
プログラムの構成としては下記の4つとなっています。
  
  usb_io2.c  :メインプログラム
  usbmain.h :USB処理メインリンクモジュール
  usbn960x.h :USBN9603のレジスタ類の定義ファイル
  usbdef.h   :USB関連の定数とデバイスディスクリプタを定義したファイル

以下からデバイス側の上記プログラムがダウンロード出来ますので
解凍して、CCSのCコンパイラでお使い下さい。 MPLABに統合してコンパイル
するのが便利です。

  ★ USB接続汎用I/Oデバイスプログラム  
  

 USB基本ライブラリ更新に伴い大幅更新

  ★ USB接続 汎用I/Oデバイスプログラム (3/3)
   プロダクトIDが0x0041に変わっています。


メインプログラムでUSB処理メインリンクモジュールをインクルードすれば、
あとは、ユーザー処理部分だけをメインプログラムで作成すれば良いように
なっています。
メインプログラムでユーザー処理部として追加した部分は下記となっています。

(1) メイン処理の基本部分
  メイン処理として基本となる部分で、ここでUSBのバッファのサイズ指定と
  usbmain.hというUSB処理のメイン関数をリンクしています。
  あとは自分のハードウェア関連の設定を追加し、最後にUSB初期化関数
  のinit_usb( )をコールすたあと、名名ループになります。
  メインループでは何も追加していないので、空白のままです。







(2) コマンド受信処理(パイプ1)
  パイプ1の受信処理でパソコンからのコマンド受付と現在状態の返送です。
  パソコンからのコマンドとしては、液晶表示器を使うモードか、単純な入出力
  だけのモードかの切替と、何も変更しないモードの3種類があります。
  いずれの場合にも、現在状態をTX3、パイプの4で送り返しています。
  液晶表示器モードの時には、液晶表示器の初期化をして、スタートメッセージ
  を表示します。
  何も変更しないモードは、単純に現在状態を送り返すだけの処理を行います。






(3) ポート出力制御(パイプ3)
 パイプ3の受信処理で受信したデータを各ポートへ設定出力します。このとき
 液晶表示モードかどうかによって、出力するポートを制限しています。
 つまり液晶表示器を使うモードの時には、液晶表示器が接続されているポート
  には入出力できませんから、そこには何もしないようにしています。











(4) 液晶表示制御(パイプ5)
  パイプ5からは液晶表示データが送られて来ます。この表示データの1バイト目は
  液晶表示器に対するコマンドになっていて、下記の制御を行います。

    0: 液晶表示器の全クリア
    1: 1行目の最初にカーソルセット
    2: 2行目の最初にカーソルセット
  その後に続く16文字が表示データとなります。












【ホスト側プログラム】

ホスト側のプログラムとしては、デバイスドライバとアプリケーションプログラムが
必要となります。
まず、デバイスドライバは下記をそのまま使わせて頂きました。
INFファイルにデバイスを追加します。追加デバイスは下記とします。
  プロダクトID  : 0x9B9
  プロダクトID  : 0x0041

 ★ 柏野 政弘氏作 「汎用USBドライバ」(Interface 2000年3月号)

アプリケーションプログラムは、Visual Basic Ver6 で作成しました。
プロジェクト関連ファイルをダウンロードできるようにしましたので、お使い下さい。

 ★ USB接続汎用I/Oプログラム実行ファイル  (7/20)
    (VB6のランタイムパッケージが必要です)

【汎用I/O制御プログラム】   

汎用I/O制御用のホストプログラムとしては、汎用I/Oユニットの全機能を
確認出来るようになっています。その機能は下記のようになっています。

(1) プログラムロード時にUSBロガ-をオープン
  プログラム起動時にUSBロガーのパイプをオープンします。従って
  本プログラム起動前に、ロガ-ユニットのUSB接続が完了し、汎用USB
  ドライバが起動している必要があります。
(2) モードの制御
  LCD Modeボタンを押すと液晶表示モードに、I/O Modeボタンを押すと
  I/Oモードにモードの切替制御を出力します。
(3) 全入出力ポートの状態表示
  通常の入出力モードでは28個の窓に緑と赤でHighかLowかを表示します。
  液晶表示器を使うモードでは、使えないポートは青色となって使えない
  ことを表します。
  単発読込ボタンを押したときは1回だけ入力して表示します。連続読込の
  時には、0.1秒間隔で入力し状態表示をすることを繰り返します。
(4) 入出力モード設定
  チェックマークの所にチェックを入れると入力モードに、チェックを解除すると
  出力モードに設定します。実際の設定出力は設定出力ボタンを押したときに
  出力されます。
(5) データ出力
  状態表示窓をクリックすると状態が反転し、その状態で設定出力ボタンを
  押すとそのデータが出力されます。
(6) 液晶表示出力
  LCD Modeにして、表示データを入力してから表示出力ボタンを押すと表示
  データが出力されます。
  表示データは上側が1行目で下側が2行目となります。両方ともブランクの
  時には、液晶表示器を全クリアします。
(7) 終了処理
  終了ボタンを押すと、プログラムを終了し、USBをクローズしてからフォーム
  を消去します。

 プログラムを起動すると汎用I/OユニットがUSBで接続されていれば、下図の
画面が表示され準備完了となります。赤と緑で表示されるのが、現在の全ポート
の状態となります。







LCD Modeボタンを押して液晶表示モードにすると、下図のように使えない
ポートは青色となります。









【外観】

USB接続の汎用I/Oユニットの外観は下図のようになっています。ボード単体
です。


液晶表示器を接続して、パソコンからのメッセージを
表示することも可能です。



PIC16F877と裏側にUSBN9603が実装されているだけです。
外部との接続はピンとコネクタとなっています。



USB用のBタイプソケットとクロック用の24MHzの
小型クリスタル発振器です。


USBN9603は裏側に直接半田付けです。



外部コネクタで液晶表示器を接続できるピンは
コネクタに、他は1ピンごとにストラップピンと
なっています。入力用のプルアップ抵抗は全ての
ピンに10kΩが接続されています。



USBN9603の半田付けは、一度たっぷりの半田で
ピンとパターンを半田付けしてしまい、その後で、
基板を縦にしながら、半田こてをあてて余分な半田を
下側に流し取るようにして仕上げます。



目次に戻る