このページではPIC16F84Aを使うときに必要な各種レジスタの内容の仕様を説明します。
INDFとEECON2は他のレジスタと扱いが違うので色を変えました。
上図の一部はクリッカブルイメージマップになっています。 | 各々のSFRは以下の機能を持っています。 |
|
INDF | : | 間接アドレスによるレジスタの内容 |
TMR0 | : | タイマーカウンター |
PCL | : | プログラムカウンターの下位8ビット |
STATUS | : | 演算結果の各種フラッグ |
FSR | : | 間接アドレス用レジスタ |
PORTA | : | PORTAデータ入出力 |
PORTB | : | PORTBデータ入出力 |
EEDATA | : | EEPROM用データ |
EEADR | : | EEPROM用アドレス |
PCLATH | : | プログラムカウンターの上位5ビット |
INTCON | : | 割り込み制御 |
OPTION_REG | : | 各種モード設定 |
TRISA | : | PORTAのモード設定 |
TRISB | : | PORTBのモード設定 |
EECON1 | : | EEPROM用制御レジスタ |
EECON2 | : | EEPROM書込保護レジスタ |
SFR(Special Function Registers)
RAMファイルレジスタの上位12バイトはSFRとして使われています。これらのレジスタ群はPICの動作で重要な役割をします。タイマー、プログラムカウンタ、間接アドレスレジスタ、EEPROMとのデータ授受、アドレス指定などPIC内部で使用するものもありますが、ソフトウェアで設定したり、読み出して判断する必要のあるものがあります。以下に状態管理に必要なレジスタを説明します。
STATUS レジスタ ( RAMメモリ・アドレス 03h,83h ) |
|
| R = | 読み出し可能ビット |
W = | 書き込み可能ビット |
-n = | 電源投入直後の値 |
Bit6,7 = | 未使用 |
|
|
ビット7:
IRP |
間接アドレス指定時のバンク指定ビット
PIC16F84Aでは使用しません。
設定内容は"0"にしておく必要があります。 |
|
ビット6,5:
RP1,RP0 |
直接アドレス指定時のバンク指定ビット
PIC16F84AではRP0のみを使用します。'0'はバンク0、'1'はバンク1です。
RP1の設定内容は"0"にしておく必要があります。 |
|
ビット4:
TO(inv) |
タイマーのタイムアウト表示ビット
1 = | 電源投入直後、CLRWDTまたはSLEEP命令を実行時 |
0 = | Watchdogタイマーのタイムアウトが発生 |
|
|
ビット3:
PD(inv) |
パワーダウン表示ビット
1 = | 電源投入直後、CLRWDT命令を実行時 |
0 = | SLEEP命令実行時 |
|
|
ビット2:
Z |
ゼロ状態表示ビット
|
|
ビット1:
DC |
デジットキャリービット
1 = | 演算結果の下位4ビットからのオーバーフローが発生 |
0 = | 演算結果の下位4ビットからのオーバーフローが発生していない |
|
|
ビット0:
C |
キャリービット
1 = |
演算結果の最上位ビットからのオーバーフローが発生
引き算の場合、結果が正 |
0 = | 演算結果の最上位ビットからのオーバーフローが発生していない |
|
OPTION_REG レジスタ ( RAMメモリ・アドレス 81h ) |
|
| R = | 読み出し可能ビット |
W = | 書き込み可能ビット |
-n = | 電源投入直後の値 |
|
|
ビット7:
RBPU(inv) |
ポートBプルアップ抵抗指定
1 = | プルアップ抵抗を使用しない |
0 = | プルアップ抵抗を使用する |
|
|
ビット6:
INTEDG |
割り込みパルスのエッジ指定
1 = | RB0/INTピンの立ち上がりで割り込み |
0 = | RB0/INTピンの立ち下がりで割り込み |
|
|
ビット5:
T0CS |
タイマー入力クロック指定
1 = | RA4/T0CKIピンをクロック入力に使用 |
0 = | 内部クロックを使用(CLKOUT) |
|
|
ビット4:
TOSE |
タイマーカウントアップエッジ指定
1 = | RA4/T0CKIピンの立ち下がりでカウントアップ |
0 = | RA4/T0CKIピンの立ち上がりでカウントアップ |
|
|
ビット3:
PSA |
タイマープリスケーラー指定
1 = | プリスケーラをWatchdogタイマーに使用 |
0 = | プリスケーラをTMR0タイマーに使用 |
|
|
ビット2-0:
PS2-0 | プリスケーラのスケール値
PS2 | PS1 | PS0 | TMR0 | WDT |
0 | 0 | 0 | 1:2 | 1:1 |
0 | 0 | 1 | 1:4 | 1:2 |
0 | 1 | 0 | 1:8 | 1:4 |
0 | 1 | 1 | 1:16 | 1:8 |
1 | 0 | 0 | 1:32 | 1:16 |
1 | 0 | 1 | 1:64 | 1:32 |
1 | 1 | 0 | 1:128 | 1:64 |
1 | 1 | 1 | 1:256 | 1:128 |
|
INTCON レジスタ ( RAMメモリ・アドレス 0Bh, 8Bh ) |
|
| R = | 読み出し可能ビット |
W = | 書き込み可能ビット |
-n = | 電源投入直後の値 |
|
|
ビット7:
GIE |
グローバル割り込み指定ビット
|
|
ビット6:
EEIE |
EEPROM書き込み完了割り込み指定ビット
1 = | EEPROM書き込み完了割り込み可能 |
0 = | EEPROM書き込み完了割り込み禁止 |
|
|
ビット5:
T0IE |
タイマー(TMR0)オーバーフロー割り込み指定ビット
1 = | オーバーフロー割り込み可能 |
0 = | オーバーフロー割り込み禁止 |
|
|
ビット4:
INTE |
外部割り込み(RB0/INT)割り込み指定ビット
|
|
ビット3:
RBIE |
RBポート変化割り込み指定ビット
1 = | RBポート割り込み可能 |
0 = | RBポート割り込み禁止 |
|
|
ビット2:
T0IF |
タイマー(TMR0)オーバーフロー表示ビット
1 = | タイマーオーバーフローが発生(ソフトでのクリアが必要) |
0 = | タイマーオーバーフローは発生していない |
|
|
ビット1:
INTF |
外部割り込み(RB0/INT)表示ビット
1 = | 外部割り込みが発生(ソフトでのクリアが必要) |
0 = | 外部割り込みは発生していない |
|
|
ビット0:
RBIF |
RBポート変化割り込み表示ビット
1 = | RB4からRB7の少なくても1で変化が発生(ソフトでのクリアが必要) |
0 = | RB4からRB7で変化は発生していない |
|
EECON1 レジスタ ( RAMメモリ・アドレス 88h ) |
|
| R = | 読み出し可能ビット |
W = | 書き込み可能ビット |
S = | 設定可能ビット |
U = | 未使用 |
-n = | 電源投入直後の値 |
|
|
ビット7-5:
未使用 | 読み込み値は"0" |
|
ビット4:
EEIF |
EEPROM書き込み完了割り込み表示ビット
1 = | 書き込み完了割り込みが発生(ソフトでのクリアが必要) |
0 = | 書き込みが完了していないか書き込み動作が行われていない |
|
|
ビット3:
WRERR |
EEPROM書き込み障害表示ビット
1 = | 書き込み動作が完了前に終了 |
0 = | 書き込み障害は発生していない |
|
|
ビット2:
WREN |
EEPROM書き込み指定ビット
|
|
ビット1:
WR |
EEPROM書き込み制御ビット
1 = | 書き込みサイクルを初期化(ソフトで設定、ハードでクリア) |
0 = | 書き込み初期化動作はしていない |
|
|
ビット0:
RD |
EEPROM読み込み制御ビット
1 = | 読み込みサイクルを初期化(ソフトで設定、ハードでクリア) |
0 = | 読み込み初期化動作はしていない |
|
INDF レジスタ ( RAMメモリ・アドレス 00h ) |
|
このレジスタは間接アドレス方式でメモリの内容の読み書きを行う場合に使用するレジスタです。
直接アドレス方式でメモリを読む場合には命令コードの中でメモリアドレスが直接指定されます。
直接アドレス方式の例
movwf 30h
この場合、メモリアドレス(30h)は命令コードの中に組み込まれ 00 0000 1011 0000 のようになります。
赤い部分がmovwfを示す命令コード、青い部分(1ビット)はファイル・レジスタへの書き込み指定(固定)、緑の部分がメモリアドレスです。
この場合、連続したメモリを読み書きするためにはメモリ毎に命令を書く必要があります。連続したメモリの読み書きをする場合には間接アドレス方式が便利です。
間接アドレス方式でメモリの読み書きを行う場合にはメモリのアドレスをFSRレジスタに設定します。
これにより、FSRレジスタで指定されたアドレスのメモリ内容がINDFレジスタを介して読み書きできます。要は、INDFレジスタが実際のメモリとの中継役になるわけです。この方法を使うとFSRの内容を1つ加算すれば、次のメモリの内容がINDFにリンクされることになり、各々の命令を書かなくても計算でメモリアドレスを変えることができます。 | |
EECON2 レジスタ ( RAMメモリ・アドレス 89h ) |
|
EEPROMにデータを書く際、このレジスタに55hとAAhを順番に書くことによりEEPROMへの書き込みを可能にします。
EEPROMに書かれたデータは電源を切っても消えないため、誤った書き込みが行われると電源を再投入しても元には戻りません。ですから、誤った処理で異常なデータを書かないようにするためです。ただし、誤った処理でこのシーケンスが使われている場合にはプロテクトできません。
以下にEEPROMの書き込みシーケンスのサンプルを示します。
赤い部分がプロテクト処理です。
bsf status,rp0 ;Change to Bank1
bcf intcon,gie ;Disables all interrupts
bsf eecon1,wren ;Allows write cycles
movlw h'55' ;Set 55h data
movwf eecon2 ;Write 55h to EECON2
movlw h'aa' ;Set AAh data
movwf eecon2 ;write AAh to EECON2
bsf eecon1,wr ;Initiates a write cycle
bsf intcon,gie ;Enables all un-masked interrupts |
コンフィギュレーションワード ( プログラム・メモリ・アドレス 2007h )
|
R = | 読み出し可能ビット |
P = | プログラム可能ビット |
-n = | 電源投入直後の値 |
u = | 変化なし |
|
ビット13-4:
CP |
コードプロテクション指定ビット
1 = | コードプロテクトしない |
0 = | 全てのメモリーをプロテクト |
| |
コードプロテクトはPICのメモリ内容が読み出されないようにガードするために使用します。
必要がなければプロテクトしないに設定します。 |
|
ビット3:
PWRTE(inv) |
パワーアップタイマー指定ビット
1 = | パワーアップタイマーを使用しない |
0 = | パワーアップタイマーを使用する |
| |
パワーアップタイマーは電源投入後約72ms間、リセットし続けるためのタイマーです。
通常は使用するに設定します。 |
|
ビット2:
WDTE |
Watchdog Timer(WDT)指定ビット
|
ビット1-0:
FOSC1
FOSC0 | クロック発振器タイプ指定ビット
FOSC1 | FOSC0 | 発振器タイプ | 発振周波数 |
1 | 1 | Resistor/Capacitor | 1MHz以下 |
1 | 0 | High Speed Crystal/Resonator | 4MHz〜20MHz |
0 | 1 | Crystal/Resonator | 4MHz以下 |
0 | 0 | Low Power Crystal | 200KHz以下 |
|
|