PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.9 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆PIC18F4550 PICとのつきあいはもうずいぶん長いのですが、今まで使ってきたのはPIC16FXXというナンバーのものばかりでした。 PIC18FXXは初めてさわります。 PIC18FXXはPIC16FXXに比べるとハードウェア、ソフトウェアの機能がかなり拡張されていることがわかりました。 USBを扱うためには、その拡張されたハード、ソフトについて理解する必要がありそうです。 ということでまずはPIC18F4550の機能を理解することからエントリーいたします。 |
[第16回]
●PIC18F4550のData Sheet(続き)
PIC18F4550がどの程度のものなのか、をはかる目安として、メモリサイズを見てみることにします。
プログラムメモリ(フラッシュメモリ)はなんと驚きの32Kバイトです。これはもう素直にびっくり、です。
参考までにPIC16F88と比較してみますと。
[出典]Microchip社 PIC16F88 Data Sheet
こちらは4K×14(ビット)です。8ビット換算で約8Kバイトほど、ということですから、PIC16F88と比べてPIC18F4550は4倍以上のプログラムメモリサイズということになります。
PICなどでしたら4KB〜8KBでも十分過ぎるサイズだと思うのですが、多分、Cを使おうとすると、4KBや8KBではとても足りないのでしょうね。
メモリサイズだけではなくて、命令の方も、かなり増えて、機能強化されています。
んでも、PICは命令数が少ないことがウリだったはずなんですけれど…。
やっぱりいつまでも「シンプル イズ ザ ベスト」というわけにはいかなくて、結局こうやってみーんな藪の中に入っていってしまうのですよねぇ。
単純なのが一番いいのですけれど。
PIC18F4550の命令表です。
こんだけありますと、PICに不慣れな方などは、ちょっと手が出しづらいでしょうね。
もっとも学校の授業じゃありませんから、これだけ全部を覚えてどうしても使わなければならない、なんてことは全くありませんから、自分の好きな(?)命令だけ覚えて、使うようにすればよいのです。
それにはスタンダードなPIC16Fの命令にまず慣れることがいいでしょう。
そうはいっても、いきなりこれだけの命令を見せられると、意欲がなくなってしまって、結局Cでプログラムをしようか、ということになりがちなのだと思います。
私は、Cなんぞよりも、アセンブラ(機械語)の方が簡単だと思うのですけれどねぇ。
参考までに、こちらがPIC16F88の命令表です。
[出典]Microchip社 PIC16F88 Data Sheet
ねえ。この程度なら取り組みやすいのですけれど、どうしてどんどん複雑にしていってしまうのでしょうね。
ま、実際には、PIC18F4550で拡張されたUSBなどの機能を扱おうとすると、どうしてもこれだけの命令では足りなくて、新しい命令が必要になってくるのだとは思いますけれど。
●メモリアクセスが複雑…
USBを扱うとなると、いままでのPIC16Fあたりのデータメモリサイズではちょいと不足してしまいます。
PIC16F88のユーザー用データメモリは368バイトです。
これでもPIC16F84あたりに比べるとずいぶん大きくなっています。
参考までにPIC16F88のデータメモリマップです。
[出典]Microchip社 PIC16F88 Data Sheet
アドレスは000〜1FFですから512バイトあるのですが、そのうち特別の目的のためにリザーブされているエリアがかなりありますから、全部を使うことができません。
PICのメモリアドレッシングは7ビットのアドレスしかアクセスできません。
つまり00〜7Fの128バイトしかアクセスできません。
そこで、PIC16F88の場合、512バイトのメモリ空間を4つのバンクに分割して、バンクを切り換えてアクセスするようになっています。このバンク切り換えというのはなかなかに面倒で、うっかりするとバンクの指定を忘れてトラブってしまうことになります。
特別の目的をもつシステムレジスタも4つのバンクに割り付けられていますから、扱いが面倒になります。
上の図で見ますと、各バンクでユーザーが自由に使えるエリアはアドレス20Hから後ろの96バイトなのですが、最後の16バイトは「窓」になっていて、どのバンクを指定していても、常にバンク0の70H〜7FHにアクセスすることになります。
その代わりに、バンク2とバンク3は10H〜1FHもユーザー用になっています。
で、それを合計すると、96+80+80+80+16+16=368バイトになります。
そして、こちらがPIC18F4550のデータメモリマップです。
PIC18F4550は2KBのデータメモリを使うことができるのですが、それを256バイトのバンクに分けてアクセスするようになっています。
なんとも苦しい…。
さらに、バンク0とバンク15は256バイトのアドレス空間を96バイトを境にして、前をユーザ用(汎用)、後ろをシステム用(専用)に分けてマッピングしています。
ここらあたりの考え方が実にややこしくて、理解できるまでにかなり戸惑いがありました。
アドレス60H〜FFHには特別の目的のレジスタ群がずらりとはりつけてあります。
こんな感じです。
このシステムレジスタの多さにもたまげてしまうのですけれど、問題は、256バイトに分割されたメモリをどのようにアクセスするのか、ということです。
とりわけバンク4〜バンク7の1KバイトはUSBのバッファメモリとして使う、ということのようですから、そのアクセスについて理解しなければ、そもそもUSBにとりかかることすらできません。
ところがData Sheetを読んでみると、そのメモリアクセスが実にややこしい。
なんでこんなに面倒なアクセス方法をとったりするのか、ってこれも多分あれでしょ、Cのせいなのでは?
さきほどのデータメモリマップをよく見てみると、バンクを指定するのにBSRつうレジスタを使って、ここに0000(0)〜1111(F)を指定することで、バンクを選択することができる、らしいのですけれど。
さらにさらに良く見てみますと、なにやら得体の知れないことが書いてあります。
そのバンク0のユーザーメモリエリアと、バンク15のSFR(Special Fanction Register)がペアで同一バンクとしてアクセスできるらしくて、これをAccess Bankというらしいのですけれど。
PIC18F4550のアセンブラでは、メモリアクセス関係の命令に、’a’というパラメータを追加するようになっていて、そのaを0にすると、このAccess Bankをアクセスすることになるのだけれど、その代わりに、BSRの指定が無視されてしまう(ignored)って。
じゃあ、他のバンクメモリがアクセスできないじゃないの。
で、a=1にすると、BSRが有効になって、バンクメモリがアクセスできるようになるんですって。
ううう。そんな面倒くさいもの、いったい誰が使うっていうのお。
PIC18F4550 Data Sheetをさらに読みますと、メモリアクセスの方法は他にもありました。
CPUをつくろう!第408回(2009.12.28upload)を再編集
PICでUSBを![第16回]
2011.7.9upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る