標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第412回]

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

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

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

たとえばプログラムの先頭部分で、
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として割り当てられています([第408回]参照)。
すると、いま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で指定しているメモリバンクのアドレスが選択されます。アクセスバンクは[第408回]のメモリマップの図のように、バンク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’を明示しなければいけないと思ったのですけれど…(この点については、今回はちょっと時間がありませんので、次回に説明をすることにいたします)。

2010.1.4upload
2010.1.5一部誤記訂正

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