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

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

今までの説明はPIC18F4550を使って行なってきましたが、PIC18F4550は40pinのICでサイズが大きすぎます。ピン数が多いだけにI/Oポートも十分あるのですが、USBインターフェースとしての用途に限定すれば、そんなに沢山のI/Oは必要ありません。
そこでこれからはPIC18F2550を使って説明をしていくことにしました。

[第58回]

●PIC18F2550

やっとのことでWriteFile()関数についての説明が終わったところで、続いてこれからいよいよReadFile()関数の説明に取りかかる、というところだったのですけれど、お話はまたまた中断して、突如としてPIC18F2550のお話になってしまいます。

なんとも統一性と計画性に欠けるお話の展開で、読者の皆様にはまことに申し訳ないと思うのでありますが、これも全て裏方の事情ですので、曲げてご理解を賜りたいと思います。
裏方の事情といいますのは、私のやっております、といいますか、やらなくてはならない作業の進展状況のことです。

もとは、もうすでに半年前のことになってしまいますが、昨年秋に、PIC18F4550にはUSBインターフェースの機能が内蔵されている、と知ったことに端を発しております。
ご承知いただいておりますように、MYCPU80キットでは、USBとのインターフェースの部分に、FTDI社のUSB−RS232C変換ICであるFT232RLを使いました。

で、CPU回路とFT232RLとの間は、PIC16F88を使って、RS232C(TTLレベル)での通信をさせていました。
ところが、このFT232RLは普通のICのようにDIPではなくて、フラットパッケージタイプしかありません。

MYCPU80は組立キットとして供給しています。
普通のDIPタイプのICならば、そこそこハンダ付けの経験がある方でしたら、特に難しいものではありませんし、どうしても心配でしたら、ICソケットを使うことも可能です。
しかしピン間わずか0.65mmのフラットパッケージのハンダ付けは、組立キットとしては、ちょいとハードルが高くなってしまいます。
仕方がありませんから、窮余の策として、FT232RLの回路部分だけ小さな別基板を作って、そこのみは完成品として供給することにいたしました。

そのような現状から致しますと、そのFT232RLが無くてもよい、直接PICがUSBでデータのやり取りが出来てしまう、というのは、これはもう、願ってもないことで、それを知ったときは、思わず、おおおおっ、と声をあげてしまいそうになったくらいです。

なにしろPICのことですから、私は最初は、PIC内蔵のUSART(RS232Cコントローラ)と同じような機能のものだろう、と浅はかにも早合点してしまいました。

PIC内蔵のUSARTコントローラは扱いが簡単で、最初に必要な初期設定さえ済ませておけば、あとはほとんど、送信用バッファにデータを書き込むだけ、あるいは受信バッファからデータを読み出すだけ、といってもよいほどシンプルにできています。
USBもそれと同じていどのものだろう、と思ったのでしたが。

それは、とんでもない思い違いでありました。
かくて長い長い泥沼の日々が続いたのでありましたが、それもようやく今年の2月になって、やっと長いトンネルから抜け出すことができました。

実は、これも何回か書いておりますように、MYCPU80の次のキットとしまして、こんどは8080にこだわらない独自仕様のCPU回路として、4ビットのものと、8ビットのものを作る予定にしております。
ええ。忘れてはおりませんです。
それから、Z80を使った、Z80版TK80も作りたい、ということも書きました。

そうしましたところ、ある学校様から、そのZ80版TK80ボードを特注仕様で、というご注文をいただきました。
まだPICを使ったUSBインターフェースは、やっとテスト的な送信受信ができた、というところでしたから、その完成を待っていたのでは、とても納期には間に合いません。
幸いなことに、今回の特注品の仕様では、USBインターフェースは不要で、代わりにRS232Cインターフェースがあればいい、というご注文でした。
そこで、USBのテストについては一旦棚上げにしまして、それから3月末まで、その特注品のZ80版TK80ボード(ND80ZH)の製作と納品に集中しておりました。

それもやっと3月末に納品できましたので、4月に入ってから、棚上げにしておりましたPICのUSBインターフェースの完成に向けて作業を再開したのでありましたが…。

なにしろおよそ2ヶ月のブランクがありましたから、私にとってそれは全てを忘れてしまうにはもう十分な期間でありました。
ええ。もう、悲しいくらいに、ほとんど、すっきりと忘れてしまいました。
せめてメモでも残しておけばよかったのでしょうけれど、当時はメモどころではなくて、それこそ毎日泥沼を酸欠状態でさまよっておりましたので、そんな余裕はとてもありませんでした。

今あらためて思いますと、このようにしてほとんど毎日書いておりますブログ風という記事なのですが、これは私にとっても貴重な資料となっております。
だいたい自分のためだけのノートなどは、つい面倒くさくて、いい加減に走り書きをしたり、肝心なことをはしょってしまって、あとから読み直してみると、なんのことかさっぱりわからんではないか、というメモならぬメモであったりします。

しかしながら、この記事などは、曲がりなりにもひとさまに読んでいただきたい、と思って書くものでありますから、そこのところを他人が読んでも理解していただけるように、と努めようといたしますと、まずは自分が理解していなくてはならない、ということになりますから、おのずから自分自身の勉強になります。

まあ。皆様にご理解していただける、というところにつきましては、あまり成功している、とは言えないのでありますけれど、自分自身の勉強になっている、ということについては、これはもう間違いありません。
あわせて、自分自身のための製作ノートとしての価値も非常に高いものだと思うようになってきております。

今回のUSB(HID)に関する記事につきましても、もっと裏方の進行状況に合わせて、その時々のタイムリーな内容を書いていくようにしておりましたら、もう少しは役に立ったのではないか、と思います。
ま、しかし説明しなければならないことも次々に山ほど出てきてしまいますから、どうしても記事として書くことと、自分が現在やっている作業との間に時間のズレが出て来てしまうことも、やむをえないことであるかもしれません。

ともあれ、そういう次第でありまして、4月のはじめから、その忘れてしまったもろもろを思い出しつつ、ウォーミングアップを兼ねてあれこれ書いてまいりましたが、やっと大体は思い出すところまで戻ってくることができました。
そうなってきますと、このさきReadFile()の説明にと入っていきますと、またまた現在私がとりかかっております作業と乖離していってしまいます。

先日はやっとHIDでのデータの送信、受信について、ほぼ実用レベルのテストを行うことができました。
いよいよ、まずはZ80版TK80ボード(ND80ZH)に、PICを組み込んでの本番テストを行うぞよ、というところまできました。
ああ。今はまだこれから接続する、というところなのですけれど、もうすでに、ぜひメモを取っておきたいことなども出てきておりますので、せっかくの、この連載記事でありますから、ReadFile()につきましては、いずれ現在の作業およびその実況中継が一段落つきましたらまた再開させていただくことといたしまして、まずは裏方で行っております作業に焦点を合わせたいと思います。

と、ながなが枕をふってきましたが、そこで、やっと、今回のタイトルであります、PIC18F2550のお話です。

今まではずっとPIC18F4550で説明をしてきました。
それがここにきて、なぜPIC18F2550なのか、ということなのですが、それにつきましては、まずは、なぜPIC18F4550だったのか、ということについて説明しなければなりません。

なぜPIC18F4550だったのか、と言いますと、それは単にUSBを使ったPICの使用例が(そのほとんどすべてがC18コンパイラとVBもしくはVC++だったのでありますが)、PIC18F4550であったためです。
なにしろ私としては、USBに取りかかった当初はもう何もかもわからずちんぷんかんぷんで、そこへもってきて、PIC18Fシリーズもさわるのが初めて、だったものでありますから、PIC18F4550を使う、というのが当然の成り行きだったわけです。

しかし最終的にはZ80版TK80ボートや4ビットCPUボード、8ビットCPUボードのためのUSBインターフェースとして組み込む、という目的を忘れてしまったわけではありませんから、そういたしますと、このままPIC18F4550でいくわけにはいかんなあ、ということになります。
なんたってPIC18F4550はでかすぎます。
いくらなんでもフラットパッケージの代わりに40pinのICつうのは、ちょっとなんだかなあ、という感じです。

そうは言っても、それしかなければ、PIC18F4550でいくしかないのでありますけれど、USBに取りかかった当初から、PIC18F4550のほかにPIC18F2550でも同じようにUSBコントローラを内蔵している、ということはわかっておりましたから、いずれUSBについて理解ができた、どこかの段階で、本番用としてPIC18F2550に切り換えよう、と考えておりました。
今や、その時がきた、というわけです。

で、PIC18F2550ですが、実は、その機能はほとんどPIC18F4550と変わるところはありません。
話を簡単に進めるために、今までは「PIC18F4550のData Sheet」という表現をしておりましたけれど、ときおり引用しておりますData Sheetは、正しくは、「PIC18F2455/2550/4455/4550 Data Sheet」なのです。
そのData Sheetについては、こちら([第15回])でご紹介いたしました。

同じ1冊のData Sheetの中で説明されておりますから、PIC18F4550とPIC18F2550は、同じように扱うことができる、ということになります。
どこが違うか、といいいますとPIC18F4550が40pinワイド(幅広)であるのに対して、PIC18F2550は28pinナロウ(幅狭)です。
そのピン数の違いは、I/Oポートの数が違うだけ、と言ってしまってもよいだろうと思います。
そのほかにも違いはあるのですけれどPICをUSBインターフェースとして使う、という今回の目的についてのみ考えれば、I/Oの数が違う、ということのほかには両者には相違はありません。

こちらがPIC18F2550とPIC18F4550の機能比較です。

[出典]Microchip社PIC18F2455/2550/4455/4550DataSheet

そしてこちらがPIC18F2550とPIC18F4550の端子図です。


[出典]Microchip社PIC18F2455/2550/4455/4550DataSheet

PIC18F2550と18F4550の端子図をよーく見比べてみますと、PIC18F2550は片側が1pinから14pinで、pic18F4550は1pinから20pinですが、pic18F2550はPIC18F4550の、RE0、RE1、RE2、VDDとRD0、RD1の6本を削除して1pin側に寄せただけで、その他のpinのレイアウトは同じであることがわかります。
また反対側についてもPIC18F2550はPIC18F4550のRD7、RD6、RD5、RD4、RD3、RD2の6本を削除して28pin側に寄せただけで、その他のpinのレイアウトは同じであることがわかります。

どうでもよいことなのですけれど、なぜかPICのDataSheetは端子図のIC名の表記が実際のチップの上のマーキングの向きとは反対になっています。
どうやらドキュメントの製作ルールが、図のIC名のようにタテ向きの場合には、図の方向に印字するように統一されているようなので、そのせいかと思いますけれど、なんとなく逆差しをイメージしてしまって面白くありませんから、こういうレイアウトはできればしてほしくないものだと思います。

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

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

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