PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.13 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆PIC18F14K50 PIC18F2550では大きすぎて、計画中のTK80互換マイコンボードND80ZVには組み込めそうにないことがわかりました。 USB機能内蔵のPICにはPIC18F4550、PIC18F2550のほかに20pinのPIC18F14K50があることはちょっと前から知っていました。しかしUSBに関する部分がPIC18F2550とはかなり異なっているようです。 案の定しっかり泥沼にはまってしまいました。 |
[第90回]
●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については、[第16回]でお見せいたしましたが、下に再掲いたします。
[出典]MICROCHIP社PIC18F2550/4550DataSheet
この表にありますように、アドレスFFFからF60までの間に割りつけられています。
PIC18F2550(4550)のRAM全体のメモリマップも、[第16回]でお見せいたしましたが、そちらについても下に再掲することにいたします。
[出典]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については[第20回]、[第21回]で説明していますので、参照ねがいます。
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の場合、これだけじゃあ足りませんでしょうよ。説明が。
このままだと、私のように、うっかりドツボにはまってしまうものが出て来てしまうのではありませんか。
うう。解決編のつもりだったのでありますが、本日もタイムアウトになってしまいました。
この続きは、次回にいたします。
CPUをつくろう!第519回(2010.6.8upload)を再編集
PICでUSBを![第90回]
2011.7.13upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る