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

●PIC18F4550のData Sheet(続き)

PIC18F4550がどの程度のものなのか、をはかる目安として、メモリサイズを見てみることにします。



プログラムメモリ(フラッシュメモリ)はなんと驚きの32Kバイトです。これはもう素直にびっくり、です。
参考までにPIC16F88と比較してみますと。


[出典]Microchip社 PIC16F88 Data Sheet

こちらは4K×14(ビット)です。8ビット換算で約8Kバイトほど、ということですから、PIC16F88と比べてPIC18F4550は4倍以上のプログラムメモリサイズということになります。
PICなどでしたら4KB〜8KBでも十分過ぎるサイズだと思うのですが、多分、Cを使おうとすると、4KBや8KBではとても足りないのでしょうね。

メモリサイズだけではなくて、命令の方も、かなり増えて、機能強化されています。
んでも、PICは命令数が少ないことがウリだったはずなんですけれど…。
やっぱりいつまでも「シンプル イズ ザ ベスト」というわけにはいかなくて、結局こうやってみーんな藪の中に入っていってしまうのですよねぇ。
単純なのが一番いいのですけれど。
PIC18F4550の命令表です。







こんだけありますと、PICに不慣れな方などは、ちょっと手が出しづらいでしょうね。
もっとも学校の授業じゃありませんから、これだけ全部を覚えてどうしても使わなければならない、なんてことは全くありませんから、自分の好きな(?)命令だけ覚えて、使うようにすればよいのです。
それにはスタンダードなPIC16Fの命令にまず慣れることがいいでしょう。
そうはいっても、いきなりこれだけの命令を見せられると、意欲がなくなってしまって、結局Cでプログラムをしようか、ということになりがちなのだと思います。
私は、Cなんぞよりも、アセンブラ(機械語)の方が簡単だと思うのですけれどねぇ。

参考までに、こちらがPIC16F88の命令表です。

[出典]Microchip社 PIC16F88 Data Sheet

ねえ。この程度なら取り組みやすいのですけれど、どうしてどんどん複雑にしていってしまうのでしょうね。
ま、実際には、PIC18F4550で拡張されたUSBなどの機能を扱おうとすると、どうしてもこれだけの命令では足りなくて、新しい命令が必要になってくるのだとは思いますけれど。

●メモリアクセスが複雑…

USBを扱うとなると、いままでのPIC16Fあたりのデータメモリサイズではちょいと不足してしまいます。
PIC16F88のユーザー用データメモリは368バイトです。
これでもPIC16F84あたりに比べるとずいぶん大きくなっています。
参考までにPIC16F88のデータメモリマップです。


[出典]Microchip社 PIC16F88 Data Sheet

アドレスは000〜1FFですから512バイトあるのですが、そのうち特別の目的のためにリザーブされているエリアがかなりありますから、全部を使うことができません。
PICのメモリアドレッシングは7ビットのアドレスしかアクセスできません。
つまり00〜7Fの128バイトしかアクセスできません。
そこで、PIC16F88の場合、512バイトのメモリ空間を4つのバンクに分割して、バンクを切り換えてアクセスするようになっています。このバンク切り換えというのはなかなかに面倒で、うっかりするとバンクの指定を忘れてトラブってしまうことになります。
特別の目的をもつシステムレジスタも4つのバンクに割り付けられていますから、扱いが面倒になります。
上の図で見ますと、各バンクでユーザーが自由に使えるエリアはアドレス20Hから後ろの96バイトなのですが、最後の16バイトは「窓」になっていて、どのバンクを指定していても、常にバンク0の70H〜7FHにアクセスすることになります。
その代わりに、バンク2とバンク3は10H〜1FHもユーザー用になっています。
で、それを合計すると、96+80+80+80+16+16=368バイトになります。

そして、こちらがPIC18F4550のデータメモリマップです。

PIC18F4550は2KBのデータメモリを使うことができるのですが、それを256バイトのバンクに分けてアクセスするようになっています。
なんとも苦しい…。
さらに、バンク0とバンク15は256バイトのアドレス空間を96バイトを境にして、前をユーザ用(汎用)、後ろをシステム用(専用)に分けてマッピングしています。
ここらあたりの考え方が実にややこしくて、理解できるまでにかなり戸惑いがありました。
アドレス60H〜FFHには特別の目的のレジスタ群がずらりとはりつけてあります。
こんな感じです。


このシステムレジスタの多さにもたまげてしまうのですけれど、問題は、256バイトに分割されたメモリをどのようにアクセスするのか、ということです。
とりわけバンク4〜バンク7の1KバイトはUSBのバッファメモリとして使う、ということのようですから、そのアクセスについて理解しなければ、そもそもUSBにとりかかることすらできません。
ところがData Sheetを読んでみると、そのメモリアクセスが実にややこしい。
なんでこんなに面倒なアクセス方法をとったりするのか、ってこれも多分あれでしょ、Cのせいなのでは?

さきほどのデータメモリマップをよく見てみると、バンクを指定するのにBSRつうレジスタを使って、ここに0000(0)〜1111(F)を指定することで、バンクを選択することができる、らしいのですけれど。
さらにさらに良く見てみますと、なにやら得体の知れないことが書いてあります。



そのバンク0のユーザーメモリエリアと、バンク15のSFR(Special Fanction Register)がペアで同一バンクとしてアクセスできるらしくて、これをAccess Bankというらしいのですけれど。
PIC18F4550のアセンブラでは、メモリアクセス関係の命令に、’a’というパラメータを追加するようになっていて、そのaを0にすると、このAccess Bankをアクセスすることになるのだけれど、その代わりに、BSRの指定が無視されてしまう(ignored)って。
じゃあ、他のバンクメモリがアクセスできないじゃないの。
で、a=1にすると、BSRが有効になって、バンクメモリがアクセスできるようになるんですって。
ううう。そんな面倒くさいもの、いったい誰が使うっていうのお。

PIC18F4550 Data Sheetをさらに読みますと、メモリアクセスの方法は他にもありました。

2009.12.28upload

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