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

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

PICとのつきあいはもうずいぶん長いのですが、今まで使ってきたのはPIC16FXXというナンバーのものばかりでした。
PIC18FXXは初めてさわります。
PIC18FXXはPIC16FXXに比べるとハードウェア、ソフトウェアの機能がかなり拡張されていることがわかりました。
USBを扱うためには、その拡張されたハード、ソフトについて理解する必要がありそうです。
ということでまずはPIC18F4550の機能を理解することからエントリーいたします。

[第20回]

●PIC18F4550のメモリアクセスについて(まずはアクセスバンクの説明です)

[第16回]でPIC18F4550のデータメモリマップについて、その概略を説明しました。
PIC18F4550には2KBのユーザー用データメモリエリアがあります。
アドレス000H〜7FFHの範囲です。
ところがPICの一般的な命令は、データメモリをアクセスするのに8ビットしか使えません。
つまりデータメモリを指定するのに、00〜FFの256バイトしか使えないのです。

そこでPIC18F4550では2KBのデータメモリエリアを256バイトごとに区切って、メモリバンクとして、アクセスするようになっています。
000〜0FFがバンク0で、100〜1FFがバンク1、というようにして、700〜7FFのバンク7までを区切ってアクセスするようになっています。
各バンクを選択するためにBSRレジスタが使われます([第16回]のデータメモリマップ参照)。

たとえばプログラムの先頭部分で、
data1 equ 000
data2 equ 050
というように指定した場合、
BSR=0のときに、
movwf data1
movwf data2
を実行すると、wレジスタの値が、アドレス000及びアドレス050のデータメモリエリアに書き込まれます。

もしBSR=2にして、同じ命令を実行すると、wレジスタの値はアドレス200、250に書き込まれることになります。
BSRに値をセットするには、
movlw 2
movwf BSR
というようにすればよいのです。

ここで、ひとつの疑問が生じます。
BSRなど、システム用の特殊レジスタは全て、アドレスF60〜FFFの範囲にあって、この範囲はバンク15として割り当てられています([第16回]参照)。
すると、いまBSRの値が0だったとすると、さきほどのmovwf BSRは実行できないのではないか?
という疑問です。
BSRはアドレスFE0にありますが、movwfは256バイトの範囲しかアクセスできませんから、BSR=0のときには、アドレス0E0をアクセスすることになってしまうからです。

このために用意されているのがアクセスバンクです。
PIC18F4550のメモリアクセスに関係する命令は機能が拡張されていて、’a’パラメータを付加するようになっています。
PIC18F4550のデータシートのmovwfの説明を見てみましょう。

[出典]Microchip社PIC18F4550Data Sheet

Exampleにあるように、最後に’a’パラメータの’0’か’1’を付加するようになっています。
’0’を指定するとBSRは無視されてアクセスバンクが選択され、’1’を指定すると、BSRで指定しているメモリバンクのアドレスが選択されます。アクセスバンクは[第16回]のメモリマップの図のように、バンク0の000〜05Fとバンク15のF60〜FFFが00〜FFの範囲のアドレスとしてアクセスされる特殊なメモリアクセス方法です。

私ははじめ、この意味がピンとこなかったので、なんでこんなややこしいアクセス方式にしているのだろう、と思ったのですが、さきほどの疑問のように、単純なメモリバンク方式(BSRがベースになった)だと、BSRレジスタそのものをアクセスすることが困難になります。また、通常のユーザー用レジスタと、PORTA、PORTBのように頻繁に使うシステムレジスタとをアクセスするのに、いちいちBSRの値を切り換えなければならない、ということではとてもまともなプログラムは組めません。
そこでアクセスバンクという方法が考え出されたのだと思います。

ところで上のmovwf命令の説明を読みますと、’a’はデフォルトでは1であると書いてあります。
ということは、
movwf BSR
のように’a’パラメータを省略した場合には、アセンブラによって1が選択されますから、
movwf BSR,1
と書いたのと同じになります(のはずです)。
すると、BSRが有効になってしまって上で書いたように、BSRそのものがアクセスできなくなってしまうはずなので、ここは
movwf BSR,0
のように’0’を明示しなければいけないと思ったのですけれど…(この点については、今回はちょっと時間がありませんので、次回に説明をすることにいたします)。
CPUをつくろう!第412回(2010.1.4upload)を再編集

PICでUSBを![第20回]
2011.7.9upload

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