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

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

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

[第41回]

●これまでの説明を整理してみました

前回までで、やっとZ80版TK80ボード(ND80ZH)についての説明がひとまず終わりました。
もともと「PICでUSB通信を」というテーマで説明していたところ、突然特注品の作業がはまり込んでしまったものですから、PICUSBの説明も中断して、そちら(ND80ZH)の説明をしてきました。
で、その説明もやっと終わりましたので、さて、もとのUSBの説明に戻って…、と思いましたが、はて、なにをどこまで説明していたのか、もうすっかり忘れてしまいました。
説明の続きを再開するために、まずは、きれいに失われてしまった記憶を取り戻すことからはじめなければなりません。
ということで、過去にさかのぼってざっと読み直しながら内容を整理してみました。

[2011.7.10注記]ここで「前回」というのは PICでUSBを![第40回] のことではなくて、CPUをつくろう![第467回]を指しています。
PICでUSBを![第40回](実はCPUをつくろう![第432回])をuploadしたのは2010年2月8日で、CPUをつくろう![第467回]をuploadしたのは2010年4月1日です。
その間はUSBの説明を中断して、ずっと特注品のZ80版TK80ボード(ND80ZH)の説明を書いてきていたのです。
上の文章はその間の事情について書いたものです。
[注記ここまで]

「PICでUSB通信を」は、[第1回]から始まりました。

09/12/6 [第2回]
PICにUSB通信機能内蔵のものがあることに気がつきました(PIC18F2550、PIC18F4550)。
それならば、新しくつくる予定の4ビットCPUボード、8ビットCPUボードにそれを使わないという手はありません。
ということで、すべてはここからのスタートでした。
長い長い泥沼のはじまりでありました。
Microchip社が供給するC18コンパイラを使って、同社が供給する仮想COMポート通信ファームウェアを組み込めば楽々USB通信ができてしまうと思ったのがそもそもの間違いでした。

09/12/7 [第3回]
MPLAB最新版ダウンロードの顛末。

09/12/9 [第4回]
秋月のPICプログラマを購入したのですけれど、PICをうっかり逆差しして壊してしまいました。
逆差ししたPICは壊れないで、PICプログラマの方が壊れてしまいました(と思い込んでしまったのですが、後にこれも勘違いであったことに気がつきます)。

09/12/10 [第5回]
肝心のPICプログラマが壊れてしまったのでは、この先USB通信ソフトの開発もすることができません。
かといってもう1台同じPICプログラマを購入するというのも余りに情けない話です。
そこで、7〜8年も昔に自作したパラレルポート接続のPICプログラマを利用することを思いつきます。
でも、それはPIC16F用のフリーソフトをダウンロードして使っていたものなので、PIC18F用の書き込みソフトはありません。
無いならそれも自分で作るしかありません。
かくしてPIC18F4550書き込みソフトの製作にとりかかることとなります。
それもCではなくて、8086アセンブラを使って、です。

09/12/13 [第6回]
なぜ今ごろCではなくてアセンブラなのか、というお話です。

09/12/14 [第7回]
DOS/Vのパラレルポート出力にはウェイトがかけられている、というお話です。

09/12/15 [第8回]
FreeなDOSのお話です。

09/12/16 [第9回]
フロッピーディスク版FreeDOSのお話です。

09/12/17 [第10回]
フロッピーディスク版FreeDOSの作成についての補足説明です。

09/12/18 [第11回]
余計な道草をして関係のなさそうなお話をしている間に、PICライタソフトの作業は着々と進んでおりました。
ずっと昔に自作したパラレルポートを使ったPICプログラマを使って、PIC18F2550、PIC18F4550の読み出し、書き込みに成功しました。
さっそく[第4回]で壊れてしまったPICプログラマに搭載されていたPIC18F2550の複製を作ってみたところ、なんとすんなりコピーができてしまいました。
そこで複製したほうのPIC18F2550を壊れてしまったはずのPICプログラマに実装してみましたら、なんとPICプログラマが復活してしまいました。

09/12/19 [第12回]
てっきり壊れたと思い込んでいたPICプログラマが全く壊れていませんでした。
もともとついていたオリジナルのPIC18F2550をPICプログラマに実装して、つまり購入したときと同じ状態にしてみても、ちゃんと書き込みができるようになってしまいました。

09/12/21 [第13回]
PICプログラマが壊れた、と思い込んでしまったことの、意外な、そしてなんともお粗末な真相です。

09/12/23 [第14回]
お話をもとに戻しまして、PICプログラマのソフトを自力で、しかもCではなくて8086アセンブラを使って作成しようと思ったことの次第について、です。

09/12/25 [第15回]
PIC18F4550のデータシートについて。

09/12/28 [第16回]
PIC18F4550の命令とメモリマップについて。

09/12/30 [第17回]
PIC18F4550のメモリアクセス(メモリバンク)。

09/12/31 [第18回]
PICのプログラムはCではなくてアセンブラで書きましょう、というお話です。

10/1/2 [第19回]
PICのプログラムはアセンブラで書きましょう、の続きです。

10/1/4 [第20回]
PIC18F4550のメモリアクセス(アクセスバンク)について。

10/1/5 [第21回]
PIC18F4550のメモリアクセス(アクセスバンク)について、の続きです。

10/1/6 [第22回]
PICのメモリアクセス(間接アドレッシング)。

10/1/7 [第23回]
PICの直接アドレッシングと間接アドレッシング。

10/1/8 [第24回]
PIC16F88のメモリバンクについて。
PICのプログラムにミスがありました。

10/1/9 [第25回]
プログラムミスを訂正して再実行してみました(出力波形がシャープになりました)。
PIC16F88の間接アドレッシングについて。

10/1/13 [第26回]
PIC18F4550の間接アドレッシングについて。

10/1/14 [第27回]
PIC18F4550の間接アドレッシングについて、の続きです。

10/1/18 [第28回]
ここまでPIC18F4550について、ざっと説明をしてきましたので、いよいよUSBプログラムについての説明にとりかかります。
PIC18F4550のUSBプログラムのサンプルリストはMicrochip社のサイトからダウンロードできるのですが、それがC18なるもので書かれていて、しかもとにかく余りに長すぎて、さっぱり理解できません。
そこにもってきて、PC側のサンプルプログラムが、VB.NetとVC++とVC#で書いてあって、そのままではBorland C++ではコンパイルできそうにありません。
まさに前途多難です。
PIC側のプログラムは、PICプログラマのときと同じように、アセンブラで書くことにしました。

10/1/19 [第29回]
唐突なのですが、USB送信に成功しました。
[第28回]からの流れでは、まずPIC側のUSB制御をアセンブラプログラムでどうやって書いていくのか、PIC側のUSB制御の動作、仕組みはどうなっているのか、について説明を進めていくところなのですが、説明の方がもたもたしているうちに、実際の作業がずっと先に進んでしまって、PCとPICをつないで、PC側からPICにUSBでデータを送信するのに成功してしまいました。
そこで、PIC側の説明は一時棚上げにしておいて、USB通信の仕組みから先に説明をすることにしました。
ここまで、主にPIC側のプログラムを中心に作業してきたのですが、そのPIC側のプログラムは、今まではCDCクラス(仮想COMポート)として作業をしてきました。
ところが、どうもCDCクラスはWindows98ではサポートされていないらしいことがわかりました。VISTAでは問題が発生するとの情報も。とするとWindows7でもどうなるのか、そのあたりも考慮すると、これはとても信頼できるものではありません。
そこで、予定を変更してHIDクラスで行くことにしました。
そして、USB送信に成功したのです。

10/1/21 [第30回]
HIDの送信速度を測定。少し準備不足でした。

10/1/25 [第31回]
HIDで受信ができません。
HIDについて参考資料をダウンロードして調べてみました。

10/1/28 [第32回]
HIDのデータ転送方式について。
送信データの構造について。フレーム、トランザクション、パケット、パイプ、エンドポイントなど。

10/1/30 [第33回]
パイプとエンドポイントについて。

10/1/31 [第34回]
パイプとエンドポイントについて(続き)。

10/2/1 [第35回]
パイプとフレームとトランザクション。

10/2/2 [第36回]
インタラプト転送の転送速度について。
転送速度はやっぱり64KB/秒でした。

10/2/3 [第37回]
HID受信に成功。
送受信テストを行って、転送速度を測定してみました。

10/2/4 [第38回]
HID送受信の仕組みと転送速度について。

10/2/7 [第39回]
HID送受信プログラム(C++)をコンパイルするとエラーになってしまいます。
外部シンボル …が未解決。

10/2/8 [第40回]
Win98DDKを捜してきて、ヘッダーファイルを組み込んでみたのですが、エラーは解決できませんでした。

ここまでで、USBについての説明は中断したままになっています。
こうして読み直してみますと、途中でも何回か説明を中断してしまっていることがわかります。
いずれそれぞれの続きを書かなければなりません。
が、ともかくは、まずは[第40回]の続きから説明を再開することにいたしましょう。
CPUをつくろう!第468回(2010.4.2upload)を再編集

PICでUSBを![第41回]
2011.7.10upload

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