標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第519回]
●SFR(Special Function Registers)
どうしてPIC18F2550でまともに動くプログラムがPIC18F14K50だとうんともすんとも言ってくれないのか(USBに限ってのことなのですが)。
PIC18F2550とPIC18F14K50との間には、なにかとんでもない相違があるのではなかろうか。
それをさんざ探ってはみたのですが、どうにもわかりませんでした。
まさかこんなことだったとは…。
SFR(Special Function Registers)はPICのさまざまな制御に関する特殊レジスタ群のことです。
たとえばI/Oポートの向きを設定する、TRISAとかTRISBとかといったレジスタもそうですし、またI/Oポートそのもの、PORTAやPORTBもSFRです。
PICではこれらのレジスタは全てRAMの特定のアドレスに割り当てられています。
お話の流れとしまして、まずはPIC18F2550(4550)のFSRについて説明をいたします。
PIC18F2550(4550)のFSRについては、[第408回]でお見せいたしましたが、下に再掲いたします。
[出典]MICROCHIP社PIC18F2550/4550DataSheet
この表にありますように、アドレスFFFからF60までの間に割りつけられています。
PIC18F2550(4550)のRAM全体のメモリマップも、[第408回]でお見せいたしましたが、そちらについても下に再掲することにいたします。
[出典]MICROCHIP社PIC18F2550/4550DataSheet
PIC18F2550(4550)のデータRAMは図のようにアドレス000〜7FFのGPR(General Purpose RAM)とアドレスF60〜FFFのFSRとから成ります。
GPRはユーザーが自由に使うことのできる汎用のレジスタエリアです。
●ACCESS BANK
ところでPIC18Fの機械語命令は、特殊な命令を除いては、8ビットのメモリアドレスしかアクセスできません。
8ビットのアドレスですから00〜FFの256アドレスしかアクセスできないことになります。
でも、それでは、図のように000〜7FF、F60〜FFFのアドレスをアクセスすることはできません。
そこでPIC18Fでは、図のように、RAMを256バイトごとにメモリバンクに分けて、あらかじめアクセスしたいメモリバンクbBSRというレジスタにセットしてから、そのアドレスに対する命令を実行するというアクセス方法が用意されています。
しかしこれはなかなかに面倒な方法です。
たとえばユーザー用のワークレジスタは普通はアドレス000〜のバンク0におきますが、するとそのバンク0のユーザー用ワークエリアと、バンクFのシステムレジスタ(SFR、たとえばPORTAなど)との間でデータのやりとりをする場合を考えてみますと、それぞれをアクセスするたびに、BSRに0またはFをセットしなければなりません。
なんと「BSR」自体がバンクFにある(FE0)のですから、これはたまりません。
実はPIC18Fでは、それとは別の簡便なアクセス方法が用意されています。
それがACCESS BANKです。
このACCESS BANKも上の図にあります。
ACCESS BANKはバーチャルなメモリ空間で00〜FFのメモリアドレスをもっています。
8ビットのアドレスですから、PIC18Fの全ての命令で無理なくアクセスすることができます。
ACCESS BANKについては[第412回]、[第413回]で説明していますので、参照ねがいます。
ACCESS BANKが通常のメモリバンクとどこが違っているかと言いますと、先に書きましたように実際に存在するメモリバンクではなくてバーチャルなメモリバンクである、というところです。
そのアドレスのうち00〜5Fは、バンク0の000〜05Fがアクセスされ、60〜FFはバンクFのF60〜FFFがアクセスされるように働きます。
なかなかよくできたシステムです。
ええ。そう思いましたよ。素直に。
ですから、こいつは便利だ、と思いましてPIC18F2550のプログラムでは、もうACCESS BANK一本で通してしまいました。
まさか、それがもとで、PIC18F14K50でドツボにはまってしまうなどとは、思いもよらないことでありましたよ。
参考までに、DataSheetのそのあたりの説明です。
ところで、上の説明文はPIC18F14K50のDataSheetからのコピーです。
PIC18F14K50の場合も、PIC18F2550(4550)と全く同じように、ACCESS BANKが使えるようになっていて、バンク0の000〜05Fのユーザー用ワークエリアと、バンクFのF60〜FFFのシステムワークエリア(SFR)とを面倒なバンク切り換えをせずに、シームレスにアクセスすることができます。
と、そのように、PIC18F14K50のDataSheetにも書いてあります。
うそばっかり。
いや、うそ、というのはこの場合不適切な表現でありました。
うそではありませんけれど、でもPIC18F14K50の場合、これだけじゃあ足りませんでしょうよ。説明が。
このままだと、私のように、うっかりドツボにはまってしまうものが出て来てしまうのではありませんか。
うう。解決編のつもりだったのでありますが、本日もタイムアウトになってしまいました。
この続きは、次回にいたします。
2010.6.8upload
前へ
次へ
ホームページトップへ戻る