PIC16F84Aのファイルレジスタ

PIC16Fシリーズの入門用として有名な16F84Aには、83byteのファイルレジスタが用意されています。
ファイルレジスタというのは、パソコンで言うところのRAMと、メモリマップされたI/Oレジスタに相当するものです。

名前は、ファイル”レジスタ”ですが、IntelのCPUで使用されている演算用レジスタ(EAX,EBX等の名前で呼ばれています)とは意味が違うので注意してください。(これに相当する,汎用レジスタはWレジスタというもので別途用意されています)


ファイルレジスタのメモリマップ

利用可能な144byteにはそれぞれ固有の(ユニークな)番地が割り振られています。
具体的な番地はデータシートで明記されており、以下の通りとなっています。


上記表のうち、グレーになっている番地のレジスタは使用できません。
この為、実際に以下の番地にアクセスできるという事が分かります。

0x00~0x06
0x08~0x4f
0x80~0x86
0x88~0xCF



レジスタの各番地は8bit幅で、0x00~0xFFの256通りの値をセットできます。

SFR(Special Function Register)

その内、一部の番地のレジスタには特殊な意味があり、SFRと呼ばれています。
SFRというのはSpecial Function Registerの略です。

SFRをアクセスする事で、CPUの動作設定を変更させたり、マイコンから出ているI/Oピンの状態を読み書きする事が可能です。

以下にSFRの一覧を示します。

Addr 名称           内容
---- ----------     --------------------------------------
0x00 INDF           間接参照レジスタ
0x01 TMR0           タイマ
0x02 PCL            プログラムカウンタ(下位8bit)
0x03 STATUS         ステータスレジスタ
0x04 FSR            バンク切り替え用レジスタ
0x05 PORTA          ポートAの値
0x06 PORTB          ポートBの値
0x08 EEDATA         EEPROMの値
0x09 EEADR          EEPROMのRead/Writeアドレス
0x0A PCLATH         プログラムカウンタ(上位5bit)
0x0B INTCON         割り込みフラグ
0x81 OPTION_REG     オプションレジスタ(プリスケーラetc)
0x85 TRISA          ポートA入出力モード
0x86 TRISB          ポートB入出力モード
0x88 EECON1         EEPROM操作用
0x89 EECON2         EEPROM操作用





SFR以外の0x0C~0x4F(計67byte)はプログラマが自由に使用可能な汎用領域で、内部的にはSRAMとして実装されています。

0x8C~0xCF番地も同様にアクセス出来ますが、この領域はBank0にマップされています。これは、例えば0x8C番地の値を書き換えると0x0Cも書き換わるという意味ですが、バンクの概念については次節の”バンク切り替え処理”を参照してください。

ファイルレジスタのバンク切り替え処理


先ほどの表を見ると、ファイルレジスタは大きく0x00~0x7Fと0x80~0xFFの2つに分けられており、表の上を見るとそれぞれBank0,Bank1という名前が付いていることが分かります。PICでは、プログラムの実行中、プログラムからはBank0かBank1のどちらかしか読み書きする事が出来ないような制限が有ります(この制限はプログラムの機械語上、レジスタ指定のビットが7bitしかない事から来ています)。

どっちのバンクにアクセスしたいかは、後述するSTATUSレジスタのRP0,RP1ビットを操作することで切り替え可能です。

上記のレジスタの内、PCL,STATUS,FSR,PCLATH,INTCONレジスタはよく使用されるので,以下のアドレスからもアクセス可能です。

0x82 PCL
0x83 STATUS
0x84 FSR
0x8A PCLATH
0x8B INTCO


要は、バンク切り替えをしなくても常に参照できるという事です。


ビット毎に意味があるレジスタの内容一覧

SFRの内、STATUS/OPTION/INTCONレジスタは、ビット毎に意味を持たせています。
各レジスタが、ビット毎にどんな意味を持たせているかは以下の通りです。

STATUSレジスタ (0x03, 0x83)


STATUSレジスタは、CPUによる命令の実行結果や、CPUの動作状態を通知します。

ビット      名称    意味
7                   未実装(読むと常に"0")
 
5,6         #RP0        バンク指定(負論理)
            #RP1        01 = Bank 1 (80h - FFh)
                        00 = Bank 0 (00h - 7Fh)
                        ※読み込み専用です。
 
4           #TO     タイムアウトビット(負論理)
                        1 = 起動時か、CLRWDT/SLEEP命令実行時
                        0 = ウォッチドッグタイマによるタイムアウトが発生
                        ※読み込み専用です。
 
3           PD      パワーダウンビット
                        1 = 起動後か、CLRWDT命令実行時
                        0 = SLEEP命令実行時
 
2           Z       ゼロフラグ
                        1 = 直前の数値演算・論理演算の結果が0だった
                        0 = 直前の数値演算・論理演算の結果が0以外だった
 
1           DC      キャリー発生フラグ
                    (ADDWF, ADDLW,SUBLW,SUBWF命令)
                        1 = bit3からのキャリーが発生した
                        0 = bit3からのキャリーが発生しなかった
 
0           C       キャリー発生フラグ
                            1 = 最上位ビットでキャリーが発生した
                            0 = 最上位ビットでキャリーが発生しなかった




OPTIONレジスタ (0x81)


OPTIONレジスタはCPUの動作を指定します

ビット      名称    意味
7           #RBPU   PORTBの内部プルアップ指定(負論理)
                        1 = PORTBの内部プルアップを無効にする
                        0 = PORTBの内部プルアップを有効にする
 
6           INTEDG  割り込みのエッジ指定
                        1 = RB0/INTピンの立上りエッジで割り込み発生
                        0 = RB0/INTピンの立下りエッジで割り込み発生
 
5           T0CS    TMR0タイマのクロック指定
                        1 = RA4/T0CKIピンからタイマクロック供給
                        0 = CPUシステムクロック(CLKOUT)からタイマクロック供給
 
4           T0SE    TMR0 Source Edge Select bit
                        1 = RA4/T0CKIピンの立下りでタイマ加算
                        0 = RA4/T0CKIピンの立上りでタイマ加算
 
3           PSA     タイマ/ウォッチドッグのプリスケーラ割当て指定
                        1 = Prescalerをウォッチドッグ(WDT)に割当てる
                        0 = Prescalerをタイマモジュール(TMR0)に割当てる
 
2-0         PS2     プリスケーラ値の指定
            PS1         値  TMR0使用時  WDT使用時
            PS0         000 1:2         1:1
                        001 1:4         1:2
                        010 1:8         1:4
                        011 1:16        1:8
                        100 1:32        1:16
                        101 1:64        1:32
                        110 1:128       1:64
                        111 1:256       1:128




INTCONレジスタ (0x0B, 0x8B)


INTCONレジスタは割り込みに関する処理を制御します

ビット      名称    意味
7           GIE:    Global Interrupt Enableフラグ
                        1 = 割込み制御を有効にします
                        0 = 全ての割込みを無効にします
 
6           EEIE    EEPROM書き込み完了の割込み通知
                        1 = EEPROM書き込み完了時に割込みを発生させます
                        0 = EEPROM書き込み完了時に割込みを発生させません
 
5           T0IE    TMR0オーバーフロー割込み通知
                        1 = TMR0オーバーフロー時に割込みを発生させます
                        0 = TMR0オーバーフロー時に割込みを発生させません
 
4           INTE    RB0/INTピンによる外部割込み通知
                        1 = RB0/INTピンによる外部割込みを発生させます
                        0 = RB0/INTピンによる外部割込みを発生させません
 
3           RBIE    PORTBの状態変化による割込み通知(RB7~RB4)
                        1 = PORTBの状態変化による割込みを発生させます
                        0 = PORTBの状態変化による割込みを発生させません
 
2           T0IF    TMR0オーバーフロー割込みフラグ
                        1 = TMR0割込みが発生した
                        0 = TMR0割込みが発生しない
 
1           INTF    RB0/INTピンによる外部割込みフラグ
                        1 = RB0/INTピンによる外部割込みが発生した
                        0 = RB0/INTピンによる外部割込みが発生しない
 
0           RBIF    PORTBの状態変化による割込みフラグ
                        1 = PORTBの状態変化による割込みが発生した
                        0 = PORTBの状態変化による割込みが発生しない


T0IF, INTF, RBIFフラグは、プログラマが割り込み処理内で0にクリアする必要があります。

RBIFはRB7~RB4の内、どのピンの状態が変わったかまでは通知してくれません。
割り込みハンドラ内で自分で判断する必要が有ります。

関連記事

コメントを残す

メールアドレスが公開されることはありません。