ファイルレジスタ(RAM)の解説
PIC16F84のファイルレジスタについて説明します。

ファイルレジスタはバンクが2つあって後述のステータスレジスタのRP0,1ビットでページ切り替え可能です。 ファイルレジスタは全て8ビット幅です。
PIC16F84は68バイト!のファイルレジスタ(汎用RAM)を備えています。
ファイルレジスタのアドレス0hからは特殊レジスタで用途が既に決まっています。このあとからがこの汎用RAMエリアとなります。プログラマーはこのエリアを有効に使ってプログラムを書いていくのです。たった68バイトですが、パソコンなどの様に数10MバイトのRAM領域はありませんが、制御用マイコンではこのくらいでなんとかなるものです。
PIC16F84レジスタファイルマップ

表レジスタ
00h〜7Fh
裏レジスタ
80h〜FFh

00h Indirect Addr. Indirect Addr. 80h
01h TMR0 OPTION 81h
02h PCL PCL 82h
03h STATUS STATUS 83h
04h FSR FSR 84h
05h PORT A TRIS A 85h
06h PORT B TRIS B 86h
07h Unimplemented Unimplemented 87h
08h EEDATA EECON1 88h
09h EEADR EECON2 89h
0Ah PCLATH PCLATH 8Ah
0Bh INTCON INTCON 8Bh
0Ch



4Fh
General
Purpose
Registers
汎用RAM
68バイト
General
Purpose
Registers
汎用RAM
68バイト
イメージ
8Ch



CFh
50h



7Fh
Unimplemented Unimplemented
D0h



FFh
'Unimplemented'は存在しないアドレス空間です。リードすると0が返ります。
表・裏両方にあるレジスタはどちらにアクセスしても同じです。
でも通常は表からアクセスします
インダイレクトレジスタ(indirect):00h
後述のファイルセレクトレジスタ(fsr)を参照。
タイマー0レジスタ(TMR0):01h
PIC内蔵の8ビットハードウェアカウンタのレジスタです。
カウンタのソースには外部ピン(RA4)やPICのクロック等から選べる様になっています。
また、立ち上がりエッジ・立ち下がりエッジ、プリスケーラ等を選択、設定することもできます。
オプションレジスタ(OPTION):81h
ポートBのプルアップ設定,外部割り込みピンのエッジ(立ち上がり/立ち下がり) ,TMR0カウンタのクロック源・分周比等を設定します。

OPTION
~RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
~RBPU:
このビットを0にするとポートBの入力すべてに内蔵プルアップがかかります。 キーボード入力等を行う場合、ポートBにSWをつないでこのビットを0にすれば、外部のプルアップ抵抗が不要です。
INTEDG:
このビットが1の時立ち上がりエッジでカウントします。0の時は立ち下がりです。
ステータスレジスタ(STATUS):03h/83h
いわゆるフラグレジスタです。
CPU演算結果(ゼロ、キャリー等)を保持します。他にファイルレジスタのバンクを指定するのにも使われます。このレジスタはファイルレジスタとしてアクセスできるので、汎用のRAMと同じアクセス方法です。

STATUS
IRP RP1 RP0 ~TO ~PD Z DC C

C キャリー・ボローフラグ
演算結果にキャリー(桁上げ)・ボロー(桁下がり)が発生したことを示します。
ADD系命令のとき桁上げあり=1,なし=0となります。
SUB系命令のとき桁下りあり=0,なし=1となります。
SUB命令の場合は一般的なCPUとは結果が反転していますので十分注意してください。
又、INC/DEC系命令はCフラグには影響を与えないので注意しましょう。
DC デジットキャリー・ボローフラグ
演算結果の下位4ビットに対するキャリー(桁上げ)・ボロー(桁下がり)を示します。
他はCフラグと同様です。
Z ゼロフラグ
演算結果が0になった場合ビットが“1”となります。
それ以外の値のときは“0”になります。
RP0
RP1
バンクセレクトビット
このビットでアクセスするファイルレジスタのバンクを切り替えます。
レジスタアクセス時にこのビットが暗黙のうちに参照されます。

RP1 RP0 アクセス可能なアドレス
0 0 000h〜07Fh
1 0 080h〜0FFh
0 1 100h〜17Fh
1 1 180h〜1FFh
上記のうち100h〜1FFhのアドレス空間はPIC16F84にはありませんので、
000h〜0FFhまでのアドレスを使うことになります。(RP1のビットは0のままで、RP0だけを使う)

IRP バンクセレクトビット(間接アドレッシング用)
このビットはfsrを使用してレジスタアクセスを行う場合のMSBビットを指定するためのものです。
しかしPIC16F84はFFhまでのアドレス空間しか存在しないため、fsrの8ビットで用が足りてしまいます。
このビットは0に固定しておきます。
プログラムカウンタ(PCL):02h/82h
このレジスタはプログラムが実行しているアドレスの下位8ビットを保持しています。命令が1つ実行されればこのレジスタの値が1つカウントアップします。PICマイコンではPCLがファイルレジスタ上に配置されています。こうすることで、ファイルレジスタと同様にPCへ直接値を書き込むことで、プログラムの推移を変えることが簡単にできます。

PIC16F84は1024ワードのプログラム領域を持っています。1024=210 ですからアドレスを表現するには 少なくとも10ビット必要です。ところがPCは8ビット幅しかありません。上位のビットはどこにいったのでしょうか?
ご安心ください。実際のPICマイコンにはちゃんと13ビット分のPCを保持されています。(←これにはプログラマがアクセスできない)PCLにはその下位8ビット分しか反映されていないのです。PCLにアドレスを書き込むと下位8ビットはここに書き込んだ値、上位のビットは後述のPCLATHというレジスタからコピーされます。

PCLATHレジスタ:0Ah/8Ah
このレジスタにPCの上位5ビット分(3ビットはDon't care)を格納しておきます。
このレジスタは値を書き込むと、PCに直接影響を与えるのではなく、PCに変化を与える命令を実行した時に暗黙の内に参照されるレジスタなのです。具体的にはgoto,call命令とPCLに変化を与えた命令の3パターンです。
ファイルセレクトレジスタ(fsr):04h/84h
このレジスタはindirectレジスタと対で使用されます。
プログラム中で配列を使わなければならない場面が必ず出てくるはずです。fsrにレジスタアドレスを入れておいてindirectレジスタにアクセスすると、実際はindirectレジスタ(00h)にアクセスしているのではなくて、fsrにいれたアドレスにアクセスしていることになるのです。
C言語風にいうとfsrがポインタとなり、indirectにアクセスすると(*fsr)にアクセスしていることになるのです。
RAMを全てゼロクリアする様な場合・RAMをデータバッファ等に使う用途で特に有効です。
ポートA(PORTA):05h
このレジスタはPICのポートAと直結しており、I/Oピンが出力ポートになっている場合はこのレジスタに“0”,“1”を書き込むことでPICのピンに信号が出力されます。同様に入力ピンになっている場合はこのレジスタを読み込むことで、ピンの状態をソフトが認識できます。このレジスタはビット0から4までが有効です。
RA4に注意
RA4ポートはオープンドレインのポートです。ここから電流を引っ張ることはできません。
入出力レジスタA(TRISA):85h
このレジスタはPICのポートAの入出力する方向を決定するレジスタです。
ビット0〜4がRA0〜4に対応していて、1をセットすると入力ピン・0をセットすると出力ピン(PORTAレジスタ内容の出力)となります。
リセット時はFFh(全ビット入力ピン)となっていますので、出力にしたい時は必ずこのレジスタを変更してください。単にPORTAレジスタに値を書き込んでも無駄です。
ポートB(PORTB):06h
このレジスタはPICのI/Oポートと直結しており、I/Oピンが出力ポートになっている場合はこのレジスタに“0”,“1”を書き込むことでPICのピンに信号が出力されます。同様に入力ピンになっている場合はこのレジスタを読み込むことで、ピンの状態をソフトが認識できます。ビット0〜7までがそれぞれRB0〜7に対応しています。
入出力レジスタB(TRISB):86h
このレジスタはPICのポートBの入出力する方向を決定するレジスタです。
ビット0〜7がRA0〜7に対応していて、1をセットすると入力ピン・0をセットすると出力ピン(PORTBレジスタ内容の出力)となります。
リセット時はFFh(全ビット入力ピン)となっていますので、出力にしたい時は必ずこのレジスタを変更してください。単にPORTBレジスタに値を書き込んでも無駄です。
* EEDATA: * EEADR: * EECON1: * EECON2: EEDATA,EEADRはPIC16F84に内蔵されているデータ用EEPROM(プログラム領域ではありません)の書き込み・読み出しを行うための、制御レジスタです。このレジスタを介してEEPROMにアクセスします。これらのレジスタ以外を通じてEEPROMにアクセスすることは出来ません。 PIC16F84では64バイトの領域を持っています。電源・バッテリーが切れても情報が失われないので便利です。 * オプションレジスタ(OPTION) このレジスタはPICマイコンの細かな設定をする為のレジスタです。 ビット7 このビットを0にすると、RBポート(入力ポートのみ)の内部プルアップが有効になります。これを利用すると、外部にDIPSW等のSWをつけてキー入力を行う時のプルアップ抵抗が不要になります。RAポートにはこの機能が無いため、キー入力はRBポートにくるよう設計したほうが部品点数を減らせます。