目次>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を指定した後バンク内のアドレスでアクセスします。
|
| | 00h〜0Bh | | 80h〜8Bh |
| | 0Ch〜4Fh | 8Ch〜CFh
|
| | 汎用RAM(GPR) | 汎用RAMは、プログラムから自由に使用できるメモリです。プログラムで必要なデータ(ループカウンタとか計算の中間値など)を自由に格納できます。
大きさは、バンク0に68バイト実装されています。バンク1には実装されていませんが、バンク1にアクセスするとバンク0の対応するメモリがアクセスされます。
| | 特殊レジスタ(SFR) | 特殊レジスタは、用途が規定されています。入出力ピンを入力/出力どちらにするか指定したり、計算の結果が0ならセットされるフラグなどがあります。
以下の「PICのレジスタ」で詳細を説明します。
|
|
| この他にEEPROMと言うメモリがありますが、ここでは省略します。(電源を切っても内容が消えない便利なメモリです。)
|
| PICのレジスタ (特殊レジスタ:SFR)
|
| ・ | PICのレジスタは、データメモリのバンク0,1にSFRとして存在します。 バンク0,1のSFRの構成は以下のようになっています。
|
|
| バンク0 | | バンク1
|
| 00h | Indirect
| | 01h | TMR0
| | 02h | PCL
| | 03h | STATUS
| | 04h | FSR
| | 05h | PORTA
| | 06h | PORTB
| | 07h | −
| | 08h | EEDATA
| | 09h | EEADR
| | 0Ah | PCLATH
| | 0Bh | INTCON
|
| |
| 80h | Indirect
| | 81h | OPTION
| | 82h | PCL
| | 83h | STATUS
| | 84h | FSR
| | 85h | TRISA
| | 86h | TRISB
| | 87h | −
| | 88h | EECON1
| | 89h | EECON2
| | 8Ah | PCLATH
| | 8Bh | INTCON
|
| | バンク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ビットで構成され、各ビットは以下のようになっています。
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | IRP | RP1 | RP0 | ^TO | ^PD | Z | DC | C
|
| IRP | PIC16F84では未使用
| | RP1 | PIC16F84では未使用
| | 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》
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | - | - | - | RA4 | RA3 | RA2 | RA1 | RA0
|
《PORTB》
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | RB7 | RB6 | RB5 | RB4 | RB3 | RB2 | RB1 | RB0
|
| | TRISA,TRISBレジスタ
| TRISA,TRISBレジスタはそれぞれ8ビットで構成され、各ビットはPORTAのRA0〜RA4ピンおよびPORTBのRB0〜RB7ピンの入出力モードを設定します。
各ビットの状態とピンのモード(入出力)は以下のようになります。
0=出力
1=入力 (使わないポートは安全のために1をセットしておきましょう)
《TRISA》
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | - | - | - | TRISA4 | TRISA3 | TRISA2 | TRISA1 | TRISA0
|
《TRISB》
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | TRISB7 | TRISB6 | TRISB5 | TRISB4 | TRISB3 | TRISB2 | TRISB1 | TRISB0
|
| | OPTIONレジスタ
| OPTIONレジスタは8ビットで構成され、各ビットは以下のようになっています。
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | ^RBPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0
|
| ^RBPU | PORTBプルアップイネーブル 1=PORTBプルアップを使用しない 0=PORTBプルアップを使用する
| | INTEDG | 割込みエッジ選択ビット 1=RB0/INTピンの立ち上がりエッジによる割込み 0=RB0/INTピンの立ち下がりエッジによる割込み
| | T0CS | TMR0クロックソース選択ビット 1=RA4/T0CKIピンの入力 0=内部命令サイクルクロック
| | T0SE | TMR0ソースエッジ選択ビット 1=RA4/T0CKIピンの入力がHighからLowでインクリメント 0=RA4/T0CKIピンの入力がLowからHighでインクリメント
| | PSA | プリスケーラ割り当てビット 1=プリスケーラはWDTへ割り当て 0=プリスケーラはTMR0へ割り当て
| | PS2-PS0 | プリスケーラレート選択ビット
| PS2-PS0 | TMR0レート | WDTレート
| | 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レジスタ
| INTCONレジスタは8ビットで構成され、割込み制御のために使用します。各ビットは以下のようになっています。
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| | GIE | EEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF
|
| GIE | グローバル割込みイネーブルビット 1=全てのマスクされていない割込み発生を許可する 0=全ての割込み発生を禁止する
| | EEIE | EEPROMライト完了割込みイネーブルビット 1=EEPROMライト完了割込み発生を許可する 0=EEPROMライト完了割込み発生を禁止する
| | T0IE | TMR0割込みイネーブルビット 1=TMR0割込みを許可する 0=TMR0割込みを禁止する
| | INTE | RB0/INT割込みイネーブルビット 1=RB0/INT割込みを許可する 0=RB0/INT割込みを禁止する
| | RBIE | RBポート変化割込みイネーブルビット 1=RBポート変化割込みを許可する 0=RBポート変化割込みを禁止する
| | T0IF | TMR0割込みフラグビット 1=TMR0割込みが発生した(ソフトウェアでクリア要) 0=TMR0割込みが発生していない
| | INTF | RB0/INT割込みフラグビット 1=RB0/INT割込みが発生した(ソフトウェアでクリア要) 0=RB0/INT割込みが発生していない
| | RBIF | RBポート変更割込みフラグビット 1=1つ以上のRB7:RB4ピンの状態が変化した(ソフトウェアでクリア要) 0=状態が変化したRB7:RB4ピンは無い
|
|
|