※ 念願のプリント基板を製作する前に。

【6】メモリーとレジスタ・・・

FPICにはプログラムを格納するプログラムメモリー以外にレジスタファイル(以降レジスタ)と呼ばれるメモリーが20個あり、アドレスが割り当てられていると書きましたが、これらは電源が入っているあいだは一時的に記憶することが可能なメモリーです。RAMエリアと呼んでも間違いが無いように思えますが、レジスタのアドレス0番から10番(PIC16F84ではアドレス11番)までは、ハードウエアに密接した記憶部分でビット単位で設定変更する部分がたくさんありますので、RAMエリとは別の呼び方をします。

 この特別なメモリー部分はSFR(Special Function Register あるいはSpecial File Register)と呼び、これらは個々に重要な役割が決まっています。そしてアドレス11番から20番までがユーザーが自由に使えるメモリー部分で、ユーザーエリアとかRAMエリアなどと呼ばれています。実際のPICではもっとたくさんのSFRとユーザーRAMがありますが、基本的な使用方法はFPICと変わりません。


 左の図がFPICのレジスタ一覧です。PIC16F84とほとんど同じです。レジスタはすべて1バイト(8ビット幅)の容量です。順に説明します。

 アドレス0番:INDF(インダイレクトレジスタ)
 アドレス4番のFSR(ファイルセレクトレジスタ)に書き込まれた値をアドレスとしたレジスタとアクセスする時に、INDFに対して読み書きします。間接アドレッシングと呼ばれるプログラム技法の一部です。詳しくは後序します。

 アドレス1番:TMR0(タイマーゼロレジスタ)
 内部タイマーの値を読み書き可能です。FPICでは現在準備中でまだ使えません。

 アドレス2番:PCL(プログラムカウンタ下位レジスタ)
 プログラムカウンタの下位8ビットの値が入っていて、読み書き可能です。プログラマーはこのPCLを変更して好きな場所のプログラムメモリーを読み出すようにすることができます。ただし下位8ビットに限定されますので、FPICでは現在のプログラムアドレスの前後最大で256バイトの範囲に限定されます。プログラムアドレスの9ビット目は変化しませんので注意が必要です。
 たとえば、現在のプログラムアドレスが0x60番地だとして、そこから200命令先(0xC8先)を指定するためにPCL+0xC8とすると、0x128となりますが、0~0xFFに丸められますので、指定先は0x28番地になります。


補足1:プログラムカウンターの加減算について

本物のPICでプログラムカウンタの下位に数値を加減算してデータを取り込もうとする場合、プログラムカウンタの上位桁への桁あふれを考慮しないと、同じ現象になり予期しないバグが出ることになります。
___________________________________________________________




 アドレス3番:STATUS(ステータスレジスタ)
 プログラムの計算結果の状況が保存されるレジスタでビット単位で使います。FPICでは下記の2個しか定義されていませんが、PICと同じビット位置になっています。



 ビット0がキャリーフラグ、ビット2がゼロフラグです。計算結果によって各ビットが〝1〟になったり〝0〟になったりします。ちょうど旗が立ったり、倒れたりしているのと同じですので、このようなビットの使い方をフラグと呼びます。 プログラマーはこのフラグを調べて、処理を分岐させたりします。


 アドレス4番:FSR(ファイルセレクトレジスタ)
 間接アドレッシングを行う時にターゲットとするレジスタのアドレスをFSRに入れて使います。

 アドレッシングの話が出ましたので説明します。


▽直接アドレッシングと間接アドレッシング△

プログラムでSFRやユーザーメモリをアクセス(読み書き)することは頻繁にあります。この時、レジスタのアドレスを直接指定してアクセスすることを直接アドレッシング。FSRレジスタを利用して間接的にアクセスすることを間接アドレッシングといいます。PICではこの二通りの指定方法があります。
 間接アドレッシングを具体的に説明しますと、例えばアドレス0x0C(10進で12)番のユーザーメモリをアクセスする時に、一旦FSRへ0x0Cと入れておき、INDFレジスタに対してアクセスすれば、ユーザーメモリ0x0Cをアクセスできるという方法です。なぜ、こんなまわりくどい方法があるかといいますと、ユーザーメモリ0x0C~0x14までの8つのメモリに対して、連続的にアクセスしたい時に、FSRの内容を+1するだけで、次の0x0D番地のメモリーへ、また+3すれば、0x0F番地にアクセス可能になり、計算結果によってアクセスする番地を変更できるという利点があります。



補足1:BANK切り替えについて

PICではSFRやユーザーメモリがたくさんあり、実際はBANK切り換えという方法でアクセスしますが、これが、ビギナーの方には複雑で混乱しやすい原因になっています。FPICではひとつのBANKに全レジスタを並べて、解りやすくしましたので、BANK切り換えはありません。
________________________________________



 アドレス5番:TRIS-A(トライステートレジスタ ポートA用)
 ポートAの各端子を入力ピンにするか出力ピンにするかを設定するレジスタです。ビット位置がポートAの各ビットに対応しており、このTRIS-Aレジスタの〝1〟にしたビットに対応するポートAの端子が入力ピンに設定されます。〝0〟にすると出力ピンになります。FPICでは、ポートAのビット7も入出力設定は可能ですが、端子が外部に出ていません。




 アドレス6番:TRIS-B(トライステートレジスタ ポートB用)
 ポートBの入出力ピン設定レジスタです。




 アドレス7番:TRIS-C(トライステートレジスタ ポートC用)
 ポートCの入出力ピン設定レジスタです。


 アドレス8番:PORT-A(ポートAレジスタ)
 外部ポートAの状況が反映されるレジスタです。出力ピンに設定している端子にはこのレジスタのビットの状態が出力されます。また、入力端子にしている場合は、外部のH/Lの状況がこのレジスタのビットに反映されます。ポートAのビット7番も存在しますが、端子が無いために外部には出ません。


 アドレス9番:PORT-B(ポートBレジスタ)
 外部ポートBの状況が反映されるレジスタです。出力ピンに設定している端子にはこのレジスタのビットの状態が出力されます。また、入力端子にしている場合は、外部のH/Lの状況がこのレジスタのビットに反映されます。


 アドレス10(0x0A)番:PORT-C(ポートCレジスタ)
 外部ポートCの状況が反映されるレジスタです。出力ピンに設定している端子にはこのレジスタのビットの状態が出力されます。また、入力端子にしている場合は、外部のH/Lの状況がこのレジスタのビットに反映されます。


 アドレス11(0x0B)番 ~ アドレス20(0x14)番:ユーザーエリア
 FPICではユーザーが自由に使えるメモリーが10個ありますが、実際はPICと同じ0x7F番地まで存在しています。ただメモリー一覧ウィンドウ(WATCH)では0X16までしか表示されません。


【6】メモリーとレジスタ・・・ ----------(ここまで)