目次4章 PICの基礎>(1)PICの仕組み

PICの仕組み(PIC16F84A編)
更新日2005.9.10

PIC(PIC16F84A)のピン配置とメモリ構造について説明します。
PICを使った電子回路を作るため、およびプログラムを作るために最低限必要な情報です。

PICのピン配置と、各ピンの使い方
PICのピン配置は以下のようになっています。
左は外観、右は同じ向きでのピン配置図です。上に半円の切りかきがありますが、これが目印になります。

切りかきの左に小さな窪みがあり、ここが1番ピンです。後は反時計回りに連続した番号が振られ、最後は18番ピンとなります。

各ピンの意味と使い方は以下のようになります。
ピン意味・使い方
Vss電源(GND)
Vdd電源(+5V)
MCRマスター・クリア(リセット),通常+5Vに接続しておきます。
OSC1オシレータ,通常セラミック発振子などのレゾネータを接続します。
OSC2オシレータ,通常セラミック発振子などのレゾネータを接続します。
RA0入出力ピンとして使用します。

各ピンは、最大20mAの電流が流せますので、LEDを直接接続する事が可能です。(抵抗を使って電流制限しますが。)
ただし、PORTA(RA0〜4)全体で50mA(引き込み電流の場合は80mA),PORTB(RB0〜7)全体で100mA(引き込み電流の場合は150mA)を超えてはいけません。
モーターのように大きな電流を必要とするものを制御する場合は、トランジスタで増幅して使用します。
ロジックICは直接接続可能です。

RA4だけは特殊なピン(出力オープンドレイン)で、出力として使用する場合はプルアップが必要です。(使い方にもよりますが)

RA1
RA2
RA3
RA4
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

PICのメモリ構造
PICのメモリには以下の種類があります。

プログラムメモリ作成したプログラムが格納されるメモリで、PICライタで書き込みます。 フラッシュメモリですので、電源を切っても消えません。PICライタで書き込むことで変更することができます。
メモリのサイズは1Kワードです。1ワードは14ビットとなっています。PIC16F84の命令は、全て1ワード(14ビット)ですので、1024の命令を格納できます。
プログラムの先頭アドレスが0で、1ワード(1命令)毎にアドレスが+1されます。

プログラムメモリの先頭の0000h(0番地)と0004h(4番地)は、それぞれリセットベクタ,割込みベクタと呼ばれ、次のように使用されます。

・リセットベクタ:電源投入時やMCLRピンによるリセット時に、ここの命令から実行される。
・割込みベクタ:割込み発生時にここの命令から実行される
データメモリデータメモリは、プログラムから読み書き可能なメモリで最小単位は1バイト(8ビット)です。 プログラムメモリと異なり、電源を切ると内容は消えてしまします。
用途で、汎用RAM(GPR)特殊レジスタ(SFR)の2つにより構成されます。
さらに、厄介な事にバンクと呼ぶ単位で2つに分かれています。(バンク0バンク1
イメージ的に表すと以下のようになります。
データメモリにアクセスするには、バンク0か1を指定した後バンク内のアドレスでアクセスします。

バンク0
バンク1
00h〜0Bh
SFR
GPR
80h〜8Bh
SFR
GPR
0Ch〜4Fh8Ch〜CFh
汎用RAM(GPR)汎用RAMは、プログラムから自由に使用できるメモリです。プログラムで必要なデータ(ループカウンタとか計算の中間値など)を自由に格納できます。
大きさは、バンク0に68バイト実装されています。バンク1には実装されていませんが、バンク1にアクセスするとバンク0の対応するメモリがアクセスされます。
特殊レジスタ(SFR)特殊レジスタは、用途が規定されています。入出力ピンを入力/出力どちらにするか指定したり、計算の結果が0ならセットされるフラグなどがあります。
以下の「PICのレジスタ」で詳細を説明します。
この他にEEPROMと言うメモリがありますが、ここでは省略します。(電源を切っても内容が消えない便利なメモリです。)

PICのレジスタ (特殊レジスタ:SFR)
PICのレジスタは、データメモリのバンク0,1にSFRとして存在します。
バンク0,1のSFRの構成は以下のようになっています。

バンク0バンク1
00hIndirect
01hTMR0
02hPCL
03hSTATUS
04hFSR
05hPORTA
06hPORTB
07h
08hEEDATA
09hEEADR
0AhPCLATH
0BhINTCON
80hIndirect
81hOPTION
82hPCL
83hSTATUS
84hFSR
85hTRISA
86hTRISB
87h
88hEECON1
89hEECON2
8AhPCLATH
8BhINTCON
バンク0,バンク1のどちらを使用するかは、STATUSレジスタのRP0(ビット5)で切り分けます。

また、バンク0とバンク1に同じレジスタが存在するものがありますが、これはどちらのバンクからでも同じものがアクセスできる事を意味します。
良く使うレジスタはこのようになっています。

【例】バンク1のTRISBをクリアする
BSF STATUS,RP0  ; STATUSのRP0(ビット5)をセット(1に)する⇒バンク1に切り替え
CLRF  TRISB ; TRISBをクリア(0)⇒PORTBは全ビット出力モード
BCF STATUS,RP0  ; STATUSのRP0をクリア(0に)する⇒バンク0に戻す


必ず使うレジスタは、STATUS,PORTA/B,TRISA/Bレジスタです。
以下では、この5つのレジスタとOPTIONレジスタ,INTCONレジスタについて説明します。他のレジスタは必要に応じて説明します。

STATUSレジスタ
STATUSレジスタは8ビットで構成され、各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
IRPRP1RP0^TO^PDZDCC

IRPPIC16F84では未使用
RP1PIC16F84では未使用
RP0バンク選択ビット
0=バンク0
1=バンク1
^TOタイムアウトビット
1=電源ON後,CLRWDT命令またはSLEEP命令実行後
0=WDTタイムアウト発生
^PDパワーダウンビット(SLEEP命令実行有無判定用)
1=電源ON後またはCLRWDT命令実行により1になる
0=SLEEP命令により0になる
Zゼロビット
1=計算結果またはロジック演算結果がゼロ
0=計算結果またはロジック演算結果がゼロでない
DCデジットキャリービット
1=結果により下位4ビット目からキャリーが発生した
0=結果により下位4ビット目からキャリーが発生しなかった
Cキャリービット
1=結果により最上位ビットからキャリーが発生した
0=結果により最上位ビットからキャリーが発生しなかった

PORTA,PORTBレジスタ
PORTA,PORTBレジスタはそれぞれ8ビットで構成され、各ビットはPORTAのRA0〜RA4ピンおよびPORTBのRB0〜RB7ピンに対応しています。
入力モードであれば、レジスタのビットの状態をチェックすれば該当ピンの状態(オンかオフ)を知る事ができます。
出力モードであれば、レジスタのビットをオン/オフする事で該当ピンの出力を変更できます。
入力モードか出力モードかは、次に説明するTRISA,TRISBレジスタでポート毎(ビット毎)に設定します。

《PORTA》

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
---RA4RA3RA2RA1RA0

《PORTB》

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
RB7RB6RB5RB4RB3RB2RB1RB0

TRISA,TRISBレジスタ
TRISA,TRISBレジスタはそれぞれ8ビットで構成され、各ビットはPORTAのRA0〜RA4ピンおよびPORTBのRB0〜RB7ピンの入出力モードを設定します。
各ビットの状態とピンのモード(入出力)は以下のようになります。
 0=出力
 1=入力 (使わないポートは安全のために1をセットしておきましょう)

《TRISA》

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
---TRISA4TRISA3TRISA2TRISA1TRISA0

《TRISB》

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
TRISB7TRISB6TRISB5TRISB4TRISB3TRISB2TRISB1TRISB0

OPTIONレジスタ
OPTIONレジスタは8ビットで構成され、各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
^RBPUINTEDGT0CST0SEPSAPS2PS1PS0

^RBPUPORTBプルアップイネーブル
1=PORTBプルアップを使用しない
0=PORTBプルアップを使用する
INTEDG割込みエッジ選択ビット
1=RB0/INTピンの立ち上がりエッジによる割込み
0=RB0/INTピンの立ち下がりエッジによる割込み
T0CSTMR0クロックソース選択ビット
1=RA4/T0CKIピンの入力
0=内部命令サイクルクロック
T0SETMR0ソースエッジ選択ビット
1=RA4/T0CKIピンの入力がHighからLowでインクリメント
0=RA4/T0CKIピンの入力がLowからHighでインクリメント
PSAプリスケーラ割り当てビット
1=プリスケーラはWDTへ割り当て
0=プリスケーラはTMR0へ割り当て
PS2-PS0プリスケーラレート選択ビット
PS2-PS0TMR0レートWDTレート
0001:21:1
0011:41:2
0101:81:4
0111:161:8
1001:321:16
1011:641:32
1101:1281:64
1111:2561:128

INTCONレジスタ
INTCONレジスタは8ビットで構成され、割込み制御のために使用します。各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
GIEEEIET0IEINTERBIET0IFINTFRBIF

GIEグローバル割込みイネーブルビット
1=全てのマスクされていない割込み発生を許可する
0=全ての割込み発生を禁止する
EEIEEEPROMライト完了割込みイネーブルビット
1=EEPROMライト完了割込み発生を許可する
0=EEPROMライト完了割込み発生を禁止する
T0IETMR0割込みイネーブルビット
1=TMR0割込みを許可する
0=TMR0割込みを禁止する
INTERB0/INT割込みイネーブルビット
1=RB0/INT割込みを許可する
0=RB0/INT割込みを禁止する
RBIERBポート変化割込みイネーブルビット
1=RBポート変化割込みを許可する
0=RBポート変化割込みを禁止する
T0IFTMR0割込みフラグビット
1=TMR0割込みが発生した(ソフトウェアでクリア要)
0=TMR0割込みが発生していない
INTFRB0/INT割込みフラグビット
1=RB0/INT割込みが発生した(ソフトウェアでクリア要)
0=RB0/INT割込みが発生していない
RBIFRBポート変更割込みフラグビット
1=1つ以上のRB7:RB4ピンの状態が変化した(ソフトウェアでクリア要)
0=状態が変化したRB7:RB4ピンは無い