PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.11

前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆C++でUSB(HID)アクセスプログラムを作成

PIC側のプログラムはC18コンパイラを使わずPICアセンブラで作成しますが、パソコン側のUSB(HID)アクセスプログラムはBorland C++コンパイラで作成します。
しかしこれがまた難物で悪戦苦闘の連続でありました。

[第51回]

●パワーオンでHIDデバイスが認識できません

テスト作業をしている過程でたまたま気がついたことがあります。
HIDテスト回路をUSBに接続したままでパソコンの電源を入れるとHIDデバイスを認識してくれません。
私が作ったPIC側のプログラムに問題があるのかも、と思ったのですが、念の為に確認してみましたところ、秋月のPICプログラマも全く同じであることがわかりました。

その状態でデバイスマネージャを開いてみると、下のように表示されています。

私のHID試作基板と秋月のPICプログラマが!マークになっています。

USBコネクタを一旦抜いて、もう一度差し直せばちゃんと認識されるようになります。


さらに、さらに、確認してみましたところ、この現象はWindows98SEで発生しますが、WindowsXPでは発生しないことがわかりました。

HIDデバイスはUSBに接続されて電源が回路に供給されたときに、ホストに認識されて、そこでデバイスディスクリプタなどの情報がホストに伝えられて、HIDデバイスとして認識されます(回路の電源がUSBを通じて供給されるバスパワーの場合の話です)。
ところがUSBケーブルを接続したままでパソコンの電源を立ち上げると、Windowsが起動する前にUSBには電源が供給されてしまうために、HID回路側が先に動いてしまって、ホスト側とかみあわなくなってしまうようです。
バスパワーではなくて、HID側にパソコンとは別に電源を供給する場合には、Windowsが立ち上がってしまってから、HID回路側の電源をONにすれば、正しく認識されます。

WindowsXPの場合には、Windowsが立ち上がって、「ようこそ」の表示が出る直前にHID回路にリセット信号が送られるようです。
たしかに。
その点ではWindowsXPの方が楽であることには違いありませんけれど。

まあ、Windows98SEでHIDデバイスを接続したままで、パソコンの電源を入れてしまった場合でも、一度USBケーブルの抜き差しをすればよいのですから、どうっていうほどのことはありません、です。
ええ。そうしますとも。
この程度のことで、Windows98SEを袖にしたりはいたしませんです。

●HID送受信プログラムが実用レベルになりました

前にも書きましたけれど、そろそろPIC側のプログラムにとりかかる、というつもりでおりました。

ですけれど、このところ作業をしておりました、HID通信プログラムの仕上げ作業が進んで、なんとか実用できるところまでになりました。
その過程であれこれわかったことなどもありますが、これを後回してしておりますと、また全部忘れてしまいます。

という次第で、またまた予定を変更してしまいまして、PICプログラムの方は一時棚上げといたしまして、WriteFile()、ReadFile()について、もう少し先まで説明をしてしまうことにいたします。

[第29回]で、Windowsマシン(USB・HID)→PIC18F4550→RS232C(RS485)という方向で送信することができました、と書きました。
ただこのときはまだHIDデータパケットサイズである64バイト固定のテストデータを送信することができただけで、任意の長さのデータを送信するところまではできていませんでした。

また[第37回]ではReadFile()に成功しましたが、このときはPIC18F4550のバッファのデータを機械的に読み出すことができただけでした。
そのバッファを介して、PICの先の回路が送ってきたデータをWindowsマシンに伝送する、というレベルではありませんでした。

ここ1〜2週間、その未完成だったところを作り上げる作業をしておりましたが、今日になってやっとなんとか動くところまでてきあがりました。
できたてのほやほやです。
テストとして使った回路は[第29回]でお見せした回路と同じものです。
WindowsマシンとPIC18F4550の間はUSB(HID)で、PIC18F4550とターゲットボード(当社BASICボードZB25K)との間はRS485で送受信します。
RS485はRS232Cに比べて接続が簡単なので利用しましたが、CPU側から見たときにはRS232Cと全く変わりません。
今回はボーレート9600ボーでテストをしました。

今回作成したプログラムは、PIC18F4550をUSB(HID)・RS232C変換器として使うものです。
Windowsマシン側のC++プログラムはRS232Cアプリケーションではありませんが、関数の形に仕上げてしまえば、実用上特に問題は無いと思います。
私は、PIC18F4550を使ってUSB(HID)・RS232C変換器を作ることが目的ではなくて、最終的には、これから作る予定のZ80版TK80ボードや、4ビットCPU回路ボート、8ビットCPU回路ボードに組み込んで使えるUSB(HID)通信回路にすることが目的です。
けれど、USB(HID)・RS232C変換までできれば、そこから先は多分それほど時間はかからないと思います。

本日は時間がなくなってしまいました。この続きはまた次回にいたします。
CPUをつくろう!第478回(2010.4.16upload)を再編集

PICでUSBを![第51回]
2011.7.11upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る