目次8章.機能が豊富なPICを使う(PIC12F683)>(1)PIC12F683のピン配置とメモリ構造

PIC12F683のピン配置とメモリ構造

更新日2006.10.7


PIC12F683のピン配置とメモリ構造について説明します。
ピン数は、8ピンでありPIC16F84Aとは異なります。
メモリの考え方は、PIC16F84Aと同様ですが、各種の機能が追加されており、いくつかの特殊レジスタが増えています。

ここでは、PIC12F683の以下の内容を説明します。
PIC12F683のピン配置と、各ピンの使い方
PIC12F683のメモリ構造
PIC12F683のレジスタ (特殊レジスタ:SFR)
PIC12F683のコンフィグレーションビット
PIC12F683のピン配置と、各ピンの使い方
PIC12F683のピン配置は以下のようになっています。
左は外観、右は同じ向きでのピン配置図です。上に半円の切りかきがありますが、これが目印になります。

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

各ピンの意味と使い方は以下のようになります。一つのピンに複数の機能が割り当てられており、特殊レジスタの設定で使い分けます。
番号ピンの機能意味・使い方
Vss電源(0V)
Vdd電源(+5V)
GP5/T1CKI/OSC1/CLKIN主に入出力ピンとして使用します。

GP0〜GP2,GP4〜GP5は入出力として使用でき、各ピンは最大25mAの電流が流せます。LEDなどを直接接続する事が可能です。(抵抗を使って電流制限しますが。)
モーターのように大きな電流を必要とするものを制御する場合は、トランジスタで増幅して使用します。
ロジックICは直接接続可能です。
尚、GP3は入力専用で出力には使用できません。

GP4/AN3/^T1G/OSC2/CLKOUT
GP3/^MCLR/Vpp
GP2/AN2/T0CKI/INT/COUT/CCP1
GP1/AN1/CIN-/Vref/ICSPCLK
GP0/AN0/CIN+/ICSPDAT/ULPWU

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

プログラムメモリ作成したプログラムが格納されるメモリで、PICライタで書き込みます。 フラッシュメモリですので、電源を切っても消えません。PICライタで書き込むことで変更することができます。

メモリのサイズは2Kワードです。1ワードは14ビットとなっています。PIC12F683の命令は、全て1ワード(14ビット)ですので、2048の命令を格納できます。
プログラムの先頭アドレスが0で、1ワード(1命令)毎にアドレスが+1されます。

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

・リセットベクタ:電源投入時やMCLRピンによるリセット時に、ここの命令から実行される。
・割込みベクタ:割込み発生時にここの命令から実行される

データメモリデータメモリは、プログラムから読み書き可能なメモリで最小単位は1バイト(8ビット)です。 プログラムメモリと異なり、電源を切ると内容は消えてしまします。

用途で、汎用RAM(GPR)特殊レジスタ(SFR)の2つにより構成されます。
さらに、バンクと呼ぶ単位で2つに分かれています。(バンク0バンク1

イメージ的に表すと以下のようになります。
データメモリにアクセスするには、バンク0か1を指定した後バンク内のアドレスでアクセスします。

バンク0
バンク1
00h〜1Fh
SFR
GPR
80h〜9Fh
SFR
GPR
20h〜7FhA0h〜BFh

汎用RAM(GPR)汎用RAMは、プログラムから自由に使用できるメモリです。プログラムで必要なデータ(ループカウンタとか計算の中間値など)を自由に格納できます。
大きさは、バンク0に96バイト,バンク1に32バイト実装されています。
特殊レジスタ(SFR)特殊レジスタは、用途が規定されています。入出力ピンを入力/出力どちらにするか指定したり、計算の結果が0ならセットされるフラグなどがあります。
以下の「PIC12F683のレジスタ」で詳細を説明します。
コンフィグレーション
ビット
コンフィグレーションビットは、プログラムメモリの2007h番地に存在し、PICの動作モードを設定します。(オシレータの選択や、WDT(ウォッチドックタイマ)使用有無など)
設定は、アセンブラ命令の「__CONFIG」命令で指定し、PICライタでプログラムと一緒にメモリに書き込みます。

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

バンク0バンク1
00hIndirect
01hTMR0
02hPCL
03hSTATUS
04hFSR
05hGPIO
06h
07h
08h
09h
0AhPCLATH
0BhINTCON
0ChPIR1
0Dh
0EhTMR1L
0FhTMR1H
10hT1CON
11hTMR2
12hT2CON
13hCCPR1L
14hCCPR1H
15hCCP1CON
16h
17h
18hWDTCON
19hCMCON0
1AhCMCON1
1Bh
1Ch
1Dh
1EhADRESH
1FhADCON0
80hIndirect
81hOPTION
82hPCL
83hSTATUS
84hFSR
85hTRISIO
86h
87h
88h
89h
8AhPCLATH
8BhINTCON
8ChPIE1
8Dh
8EhPCON
8FhOSCCON
90hOSCTUNE
91h
92hPR2
93h
94h
95hWPU
96hIOC
97h
98h
99hVRCON
9AhEEDAT
9BhEEADR
9ChEECON1
9DhEECON2
9EhADRESL
9FhANSEL
バンク0とバンク1に同じレジスタが存在するものがありますが、これはどちらのバンクからでも同じものがアクセスできる事を意味します。
良く使うレジスタはこのようになっています。

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


必ず使うレジスタは、STATUS,GPIO,TRISIO,OSCCON,CMCON0,ANSELレジスタです。

STATUSレジスタ
STATUSレジスタは、命令を実行した結果などが設定されます。バンク切り替えにも使用します。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
IRPRP1RP0^TOPDZDCC

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

GPIOレジスタ
GPIOレジスタの各ビットはGP0〜GP5ピンに対応しています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--GP5GP4GP3GP2GP1GP0

入力モードであれば、GPIOレジスタのビットの状態をチェックすることで該当ピンの状態(オンかオフ)を知る事ができます。
出力モードの場合は、GPIOレジスタのビットをオン/オフする事で該当ピンの出力を変更できます。(GP3は入力のみ)
入力モードか出力モードかは、次に説明するTRISIOレジスタでポート毎(ビット毎)に設定します。

TRISIOレジスタ
TRISIOレジスタでは、GPIOのGP0〜GP5ピンの入出力モードを設定します。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--TRISIO5TRISIO4TRISIO3TRISIO2TRISIO1TRISIO0

各ビットの状態とピンのモード(入出力)は以下のようになります。
 0=出力
 1=入力

ただし、GP3は入力専用ですので、TRISIO3は常に1がセットされていて書き込みは無視されます。

IOCレジスタ
IOCレジスタでは、ピン変化割り込み(GPIO変化割り込み)で使用するピン(GP0〜GP5)を指定します。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--IOC5IOC4IOC3IOC2IOC1IOC0

各ビットの設定方法は以下のようになります。
 0=ピン変化割り込みで使用しない
 1=ピン変化割り込みで使用する

OSCCONレジスタ
OSCCONレジスタでは、オシレータの動作モードやクロックを設定します。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
-IRCF2IRCF1IRCF0OSTSHTSLTSSCS

IRCF2-0クロック選択ビット
IRCF2-0クロック
00031kHz
001125KHz
010250KHz
011500KHz
1001MHz
1012MHz
1104MHz
1118MHz
電源ON時は、110(4MHz)が設定されています。
OSTSオシレータスタートアップタイムアウト状態
HTSHFINTOSCの状態
LTSLFINTOSCの状態
SCSシステムクロック選択ビット
1=IRCF2-0で決定
0=コンフィグレーションビットのFOSC2-0で決定

OPTIONレジスタ
OPTIONレジスタでは、各種機能に対する付加情報を設定します。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
^GPPUINTEDGT0CST0SEPSAPS2PS1PS0

^GPPUGPIOプルアップイネーブル
1=GPIOプルアップを使用しない
0=GPIOプルアップを使用する
INTEDG割込みエッジ選択ビット
1=GP2/INTピンの立ち上がりエッジによる割込み
0=GP2/INTピンの立ち下がりエッジによる割込み
T0CSTMR0クロックソース選択ビット
1=GP2/T0CKIピンの入力
0=内部命令サイクルクロック
T0SETMR0ソースエッジ選択ビット
1=GP2/T0CKIピンの入力がHighからLowでインクリメント
0=GP2/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レジスタは、割込み制御のために使用します。各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
GIEPEIET0IEINTEGPIET0IFINTFGPIF

GIEグローバル割込みイネーブルビット
1=全てのマスクされていない割込み発生を許可する
0=全ての割込み発生を禁止する
PEIE拡張機能の割込みイネーブルビット
1=拡張機能の割込み発生を許可する(詳細はPIE1レジスタで指定する)
0=拡張機能の割込み発生を禁止する
T0IETMR0割込みイネーブルビット
1=TMR0割込みを許可する
0=TMR0割込みを禁止する
INTEGP2/INT割込みイネーブルビット
1=GP2/INT割込みを許可する
0=GP2/INT割込みを禁止する
GPIEGPIO変化割込みイネーブルビット
1=GPIO変化割込みを許可する
0=GPIO変化割込みを禁止する
T0IFTMR0割込みフラグビット
1=TMR0割込みが発生した(ソフトウェアでクリア要)
0=TMR0割込みが発生していない
INTFGP2/INT割込みフラグビット
1=GP2/INT割込みが発生した(ソフトウェアでクリア要)
0=GP2/INT割込みが発生していない
GPIFGPIO変化割込みフラグビット
1=1つ以上のGP0-GP5ピンの状態が変化した(ソフトウェアでクリア要)
0=状態が変化したGP0-GP5ピンは無い

PIE1レジスタ
PIE1レジスタは、拡張機能の割込み制御に使用されます。PIR1レジスタとペアで使用します。各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
EEIEADIECCP1IE-CMIEOSFIETMR2IETMR1IE

各ビットは、対応する割込みを許可するか禁止するかを設定します。設定する値により以下の動作になります。

1=割込み許可
0=割込み禁止
EEIEEEPROM書き込み完了割込み許可フラグ
ADIEA/D変換割込み許可フラグ
CCP1IECCP1割込み許可フラグ
CMIEコンパレータ割込み許可フラグ
OSFIEオシレータ失敗割込み許可フラグ
TMR2IETMR2−PR2一致割り込み許可フラグ
TMR1IETMR1オーバーフロー割り込み許可フラグ

PIR1レジスタ
PIR1レジスタは、拡張機能の割込みフラグとして使用されます。PIE1レジスタとペアで使用します。各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
EEIFADIFCCP1IF-CMIFOSFIFTMR2IFTMR1IF

EEIFEEPROM書き込み完了割込みフラグ
1=EEPROM書き込み完了割込み発生(ソフトウェアでクリア要)
0=EEPROM書き込み完了割込み無し
ADIFA/D変換割込みフラグ
1=A/D変換完了割込み発生
0=A/D変換完了割込み無し
CCP1IFCCP1割込みフラグ
<キャプチャモード>
1=TMR1レジスタのキャプチャが発生した(ソフトウェアでクリア要)
0=TMR1レジスタのキャプチャが発生していない
<コンペアモード>
1=TMR1レジスタのコンペア一致が発生した( ソフトウェアでクリア要)
0=TMR1レジスタのコンペア一致が発生していない
CMIFコンパレータ割込みフラグ
1=コンパレータ1出力変化発生(ソフトウェアでクリア要)
0=コンパレータ1出力変化発生無し
OSFIFオシレータ失敗割込みフラグ
1=システムオシレータ動作失敗。INTOSCに切り替えた(ソフトウェアでクリア要)
0=システムクロック正常動作中
TMR2IFTMR2−PR2一致割り込みフラグ
1=TMR2−PR2一致割り込みが発生した(ソフトウェアでクリア要)
0=TMR2−PR2一致割り込み発生無し
TMR1IFTMR1オーバーフロー割り込みフラグ
1=TMR1レジスタがオーバーフローした(ソフトウェアでクリア要)
0=TMR1レジスタがオーバーフローしていない

CMCON0レジスタ
CMCON0レジスタは、コンパレータの動作を設定するために使用します。各ビットは以下のようになっています。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
-COUT-CINVCISCM2CM1CM0

COUTコンパレータ出力ビット
CINVコンパレータ出力反転ビット
CISコンパレータ入力スイッチビット
CM2GP0-2をデジタル入出力で使用する場合は、CM0-2を全て1に設定する。
CM1
CM0

ADCON0レジスタ
ADCON0レジスタは、A/D変換の動作を設定します。各ビットは以下のようになっています。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
ADFMVCFG--CHS1CHS0GO/^DONEADON

ADFMA/D変換結果の10ビットを、ADRESHレジスタとADRESLレジスタを連結した16ビットのレジスタに対してどのようにセットするかを指定する。
1=右詰めでセットし、左(上位ビット)の6ビットは0
0=左詰めでセットし、右(下位ビット)の6ビットは0
VCFG基準電圧を何にするかを指定
1=VREFピン(6番ピン)の電圧を基準電圧とする
0=VDD(電源電圧)を基準電圧とする
CHS1A/D変換のチャネル(ポート)選択
00=AN0
01=AN1
10=AN2
11=AN3
CHS0
GO/^DONEA/D変換状態ビット
1=A/D変換開始指示
0=A/D変換完了
ADONA/D変換状態ビット
1=A/D変換機能は有効
0=A/D変換機能は無効

ANSELレジスタ
ANSELレジスタは、A/D変換のクロック設定とアナログ入力(A/D変換)ピンを設定します。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
-ADCS2ADCS1ADCS0ANS3ANS2ANS1ANS0

ADCS2A/D変換クロック選択ビット
000=Fosc/2
001=Fosc/8
010=Fosc/32
x11=Frc(500KHz以下の内部クロック)
100=Fosc/4
101=Fosc/16
110=Fosc/64
ADCS1
ADCS0
ANS3アナログ/デジタル選択ビット
AN0−3ピンに対応し、アナログ入力ピンとして使用するかデジタル入出力ピンとして使用するかを指定する。
1:アナログ入力とする
0:デジタル入出力とする
ANS2
ANS1
ANS0

ADRESH,ADRESLレジスタ
ADRESHとADRESLレジスタは、2つをペアで使用し、16ビットとして扱います。そして、16ビットの中にA/D変換結果の10ビットが左詰めまたは右詰めで格納されます。
(PIC12F683のA/D変換の分解能(精度)は10ビットです)

ADRESHADRESL
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
A/D変換結果(10ビット)000000
000000A/D変換結果(10ビット)

上の図の水色部分にA/D変換結果が格納されます。
2列で表しているように、格納方法は2パターンあります。どちらにするかは、ADCON0レジスタのADFMビットで指定します。
 ADFM=0:左詰め(2列の上のパターン)
 ADFM=1:右詰め(2列の下のパターン)

TMR2レジスタ
TMR2レジスタは8ビットのタイマで、主にCCP(Capture/Compare/PWM)機能と組み合わせて使用します。

PR2レジスタやCCP1Lレジスタなどと比較され、等しくなると出力を変化するなどの動作を行います。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
TMR2

T2CONレジスタ
T2CONレジスタは、TMR2のポストスケール/プリスケールの設定と、TMR2の動作開始・停止を指定します。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
-TOUTPS3TOUTPS2TOUTPS1TOUTPS0TMR2ONT2CKPS1T2CKPS0

TOUTPS3ポストスケーラ
 0000 1:1
 0001 1:2
  :
 1111 1:16
TOUTPS2
TOUTPS1
TOUTPS0
TMR2ONTMR2オン・オフビット
 1:TMR2オン
 0:TMR2オフ
T2CKPS1プリスケーラ
 00 1:1
 01 1:4
 1x 1:16
T2CKPS0

CCP1CONレジスタ
CCP1CONレジスタは、CCP(Capture/Compare/PWM)モジュールの動作を設定します。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--DC1B1DC1B0CCP1M3CCP1M2CCP1M1CCP1M0

DC1B1CCPモジュールをPWMモードで使用する時、デューティを10ビットで設定するが、その下位2ビットをここで指定する。上位8ビットは、CCPR1Lレジスタで指定。
キャプチャモード,コンパレータモード時は未使用。
DC1B0
CCP1M3CCPモード選択ビット
0000CCPモジュールを使用しない
0100キャプチャモード,立ち下がりエッジごと
0101キャプチャモード,立ち上がりエッジごと
0110キャプチャモード,立ち上がりエッジ4回ごと
0111キャプチャモード,立ち上がりエッジ16回ごと
1000コンペアモード,一致時に出力をセット(CCP1IFビットをセット)
1001コンペアモード,一致時に出力をクリア(CCP1IFビットをクリア)
1010コンペアモード,一致時にソフトウェア割込みを生成(CCP1IFビットをセット,CCP1ピンには影響しない)
1011コンペアモード,スペシャルイベントトリガ(CCP1IFビットをセット,CCP1ピンには影響しない);
(A/D変換が機能している場合は、CCP1でTMR1をリセットし、A/D変換を開始する)
11xxPWMモード
CCP1M2
CCP1M1
CCP1M0

PR2レジスタ
PR2レジスタは、TMR2と比較する値を設定します。

・TMR2モジュール使用時は、TMR2の値がPR2と等しくなった時、TMR2割込みが発生します。
・CCP(Capture/Compare/PWM)モジュールをPWMモードで使用時は、PWMの周期を指定します。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
TMR2との比較値

CCPR1Lレジスタ
CCPR1Lレジスタは、CCP(Capture/Compare/PWM)機能使用時にTimerと比較する値を設定します。

・コンペア/キャプチャモード時は、TMR1の下位バイトを指定します。
・PWMモード時は、TMR2と比較する値を指定します。PWMのデューティになります。

Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
TMR2との比較値または、TMR1との比較値(TMR1Lに対応)

PIC12F683のコンフィグレーションビット

PIC12F683の動作モードなどを設定するコンフィグレーションビットは、以下のように14ビットで構成されています。

Bit13Bit12Bit11Bit10Bit9Bit8Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--FCMENIESOBODEN1BODEN0^CPD^CPMCLRE^PWRTEWDTEFOSC2FOSC1FOSC0

各ビットの意味は次の通りです。

ビット動作モード設定値と意味
FCMENフェールセーフクロックモニタ有効・無効_FCMEN_ON有効
_FCMEN_OFF無効
IESO内部・外部切り替えモード選択_IESO_ON内部・外部切り替えモード有効
_IESO_OFF内部・外部切り替えモード無効
BODEN1
BODEN0
電源電圧低下時の処理選択_BOD_ON電源電圧低下リセットを有効にする
_BOD_NSLEEP通常動作時は有効,Sleep時は無効
_BOD_SBODENPCONレジスタのSBODENビットに従う
_BOD_OFF電源電圧低下監視無効
^CPDEEPROMメモリ
コードプロテクト有無
_CPD_ONコードプロテクトする
_CPD_OFFコードプロテクトしない
^CPプログラムメモリ
コードプロテクト有無
_CP_ONコードプロテクトする
_CP_OFFコードプロテクトしない
MCLREマスタクリア
有効・無効
_MCLRE_ONマスタクリア有効(4番ピンをMCLRとして使用)
_MCLRE_OFFマスタクリア無効(4番ピンをGP3として使用)
^PWRTEパワーアップタイマ
有効・無効
_PWRTE_ONパワーアップタイマ有効
_PWRTE_OFFパワーアップタイマ無効
WDTEウォッチドックタイマ
使用有無
_WDT_ONウォッチドックタイマ有効
_WDT_OFFウォッチドックタイマ無効
FOSC2-0オシレータの種類_LP_OSC100KHz以下,水晶振動子,省電力モード(2番ピン:OSC1,3番ピン:OSC2)
_XT_OSC4MHz以下,水晶振動子orセラミック振動子(2番ピン:OSC1,3番ピン:OSC2)
_HS_OSC4MHz〜20MHz,水晶振動子orセラミック振動子(2番ピン:OSC1,3番ピン:OSC2)
_RC_OSC4MHz以下,R/C発振(2番ピン:OSC1,3番ピン:CLKOUT)
_EC_OSC外部クロック(2番ピン:CLKIN,3番ピン:CLKOUT)
_INTOSCIO内部クロック(2番ピン:GP5,3番ピン:GP4)
_INTOSC内部クロック(2番ピン:GP5,3番ピン:CLKOUT)
_EXTRCIORC発振(2番ピン:OSC1(RC),3番ピン:GP4)
_EXTRCRC発振(2番ピン:OSC1(RC),3番ピン:CLKOUT)