PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.9 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆PIC18F4550 PICとのつきあいはもうずいぶん長いのですが、今まで使ってきたのはPIC16FXXというナンバーのものばかりでした。 PIC18FXXは初めてさわります。 PIC18FXXはPIC16FXXに比べるとハードウェア、ソフトウェアの機能がかなり拡張されていることがわかりました。 USBを扱うためには、その拡張されたハード、ソフトについて理解する必要がありそうです。 ということでまずはPIC18F4550の機能を理解することからエントリーいたします。 |
[第27回]
●POSTINC0…奇妙だけれども便利な「レジスタ」(前回からの続きです)
前回、POSTINC、POSTDEC、PREINC、PLUSWの各レジスタの動作とその使い方について、ざっと説明をしましたが、いつものことで、時間切れになってしまいましたので、DataSheetを参照してお見せするところまではできませんでした。
あらためて、PIC18F4550のDataSheetの該当部分のコピーをお見せいたします。
[出典]Microchip社PIC18F4550DataSheet
POSTDEC、POSTINC、PREINCについては前回説明した通りですが、PLUSWについては不正確なコメントだったようです。
むむむ。
PLUSWはそういう使い方をするのですねぇ。
POSTDEC、POSTINC、PREINCはそれぞれアクセスの後または前でFSRレジスタをインクリメント、デクリメントし変化させます。
これに対して、PLUSWはFSRレジスタの値を変化させない、と書いてあります。
FSRレジスタペアの現在の値は変化させないで、Wレジスタの値を符号付の増分(−127〜+128)として、そのFSRレジスタペアに加えてアドレスを算出し、そのアドレスでメモリにアクセスするのだそうです。
ああ、そうか。
Z80で、インデックスポインタIX、IYの値を変化させないで、(IX+d)、(IY+d)としてメモリアクセスしたのと全く同じ使用法なのですね(これは、前回そうではないか、と書きましたが、やっぱりそういうことのようです)。
でもその増分としてWレジスタを使ってしまいますから、これは「テーブル参照」専用ということになりそうです。
FSRレジスタペアにテーブルのトップアドレスを与えておいて、そのテーブルのアクセスキーをWレジスタに入れて、
movf PLUSW,w
を実行すれば、Wレジスタには、そのアクセスキーに対応した値が得られることになります。
この命令の実行によって、FSRレジスタペアの値は変化しませんから、繰り返しこの処理を行うことができます。
おお。これは、コード変換に使えるではありませんか!
たとえば、0〜Fの16進数をASCIIコードの30〜39、41〜46に変換する処理を考えてみます。
30、31、32、…、39、41、…46の順にデータが並んだテーブルを用意しておいて、たとえばFSR0H、FSR0Lレジスタペアにデータトップの30の置いてあるアドレスを入れておきます。
ASCIIコードに変換したい、もとの16進数00〜0Fを、Wレジスタに入れて、
movf PLUSW,w
を実行すると、Wにはもとの16進数に対応するASCIIコードが入るはずです。
本当にそうなるのかどうか、時間をみつけて試してみることにします。
ところで、上記DataSheetコピー右側の5.4.3.3は、またまた苦しい説明が書いてあります。
[第25回]で、PIC16F88DataSheetには「INDFレジスタはバーチャルなレジスタなので、FSRにINDFレジスタのアドレス(00)を入れてINDFレジスタを間接的にアクセスしても、期待した結果は得られません」という意味のことが書いてある、と紹介しました。
でも、FSRでINDFのアドレスをアクセスすることに一体何の意味があるのだろうか、とかえって疑問に思えてしまいます。
しかし今回のPIC18F4550にはFSR、INDFレジスタペアが3組もあるのですから、PIC16F88の例よりは余程現実的です。
今回はFSR0H、FSR0LレジスタペアにINDF1のアドレス(FE7)を入れて、INDF0をアクセスしたら、INDF1に間接的にアクセスできるのではないだろうか、という考えに対して、「やっぱりそういうことは無意味ですよ」、という説明がされています。
うん、まあ、そうですよね。
FSR0レジスタペアでINDF1をアクセスする処理なんて、何か意味のあることだとは思えませんですよね。
それでも、わざわざそういう注意書きというか余計な説明を書かなくてはいけないのは、「バーチャルなレジスタ」なのに、それを他のレジスタと同じ実メモリアドレスに割り付けてしまったりするからなのだと思います。
そこのところは隠しておいて、「ぜーんぶバーチャルなんだから、これ以上詮索しないで」とでも書いておけばよろしいのに。
まあ、なんといいますか。
Microchipの技術屋さんたちは、根っからの技術屋といいますか、律儀な方たちなのでしょうね。
あ、しかし、その次のくだり、On the other handから:FSR2L.まではちょいと意味不明です。
FSRレジスタはバーチャルなレジスタではないから、それを間接アドレッシングすることは出来る、けれどもincrement、decrementはしないよって、はて、POSTINC、POSTDECを使った場合にそうなる、ということなのでしょうか?
で、後半のThus以下になると何をいってるのかさっぱり意味不明です。
まあ、前にも書きましたように、SFR(Special Function Register)エリアである、F60〜FFFの範囲に対してFSR、INDFを使って間接アドレッシングをすること自体に何の意味があるか(はなはだ疑問)、ということだと思いますから、こんな説明は理解できなくても構わないのですけれどね。
CPUをつくろう!第419回(2010.1.14upload)を再編集
PICでUSBを![第27回]
2011.7.9upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る