302.PICの命令とレジスタ一覧


2001/11/29 , 2002/10/23追記 【ソフトウエア編TOPに戻る】

PICは他の一般的なマイコンとはちょっと違ったアーキテクチャ(内部処理構造)を持ちます。その詳細な説明はここでは省略させて頂きますが、データメモリ領域とプログラムメモリ領域が別々に存在していること、各種機能の設定を行なうレジスタがデータメモリ領域の一部に存在すること、データメモリやプログラムメモリにはバンク、ページといったアクセス領域を切り替えるという概念があること、パイプライン処理によって、見かけ上1サイクルで1命令が実行されること、アセンブラ命令が35種類しかないこと...など、まだまだ他にもその独自性は沢山あります。

PICでプログラムを組む場合、大体がアセンブラかC言語で行なうことでしょう。PICの場合はメモリのアーキテクチャの関係から最大でも8Kワードまでのプログラムしか組めません。なので、余計なコードを生成してしまうC言語よりも、アセンブラプログラムを組んだ方が、メモリの節約になるし、高速なプログラミングができる、といわれていました。しかし最近の比較的高価なCコンパイラでは生成されるコードの効率も非常によくなり、プログラムの程度によってはアセンブラで組むのと大して違わないという話も聞きます。つまり、PICの場合でもC言語による開発は実用レベルで十分可能であるということになります。

しかしPICはアセンブラ命令が35種類しかなくておぼえやすく、またアセンブラでプログラムを行なうことによって、より深くPICの動作を理解できるのではないかという点から、しばらくはアセンブラでのプログラミングに挑戦していこうかと思っています。

PICのアーキテクチャの詳細については、マイクロチップテクノロジージャパンのサイトからデータシートをダウンロードして頂くか、井上誠一氏による「趣味の電子工作」のホームページなどをひも解いて頂くとして、ここでは、PICのプログラミングを行なう上で、最低限押さえておかなければならないことだけを、簡単にご紹介しようと思います。また、PICの基礎実験でご紹介しているプログラムで利用したレジスタの説明なども、合わせてここでご紹介することにします。


302−1.PICのアセンブラ命令

PICのアセンブラ命令の一覧を以下にご紹介します。

電子工作のためのPIC活用ガイドブック 後閑哲也氏 技術評論社 より

分類 命 令 機 能 影響フラグ サイクル

 

ADDWF  f , d 加算 W + f → W か f へ格納 C , DC , Z 1
ANDWF  f , d 論理積 W AND f → W か f へ格納 Z 1
CLRF  f f をゼロクリア Z 1
CLRW W を ゼロクリア Z 1
COMF  f , d f の0 , 1反転 → W か fへ格納 Z 1
DECF  f , d f - 1 → W か f へ格納 Z 1
DECFSZ  f , d f - 1 → W か f  結果ゼロなら次命令スキップ   1(2)
INCF  f , d f + 1 → W か f へ格納 Z 1
INCFSZ  f , d f + 1 → W か f  結果ゼロなら次命令スキップ   1(2)
IORWF  f , d 論理和 W OR f → W か f へ格納 Z 1
MOVF  f , d 移動 f から W または f 自身へ格納 Z 1
MOVWF  f 移動 W から f へ格納   1
NOP 何もしない   1
RLF  f , d 1ビット左へシフト → W か f へ格納 C 1
RRF  f , d 1ビット右へシフト → W か f へ格納 C 1
SUBWF  f , d 減算 f - W → W か f へ格納 C , DC , Z 1
SWAPF  f , d f の上位と下位を入れ替え → W か f へ格納   1
XORWF  f , d 排他的論理和 W XOR f → W か f へ格納 Z 1

ビット

BCF  f , b f の b ビット目をゼロにクリアする   1
BSF  f , b f の b ビット目を1にセットする。   1
BTFSC  f , b f の b ビット目がゼロだったら次命令スキップ   1(2)
BTFSS  f , b f の b ビット目が1だったら次命令スキップ   1(2)

ADDLW  k 定数加算 W + k → W へ格納 C , DC , Z 1
ANDLW  k 定数論理積 W AND k → W へ格納 Z 1
IORLW  k 定数論理和 W OR k → W へ格納 Z 1
MOVLW  k 定数移動 k → W へ格納   1
SUBLW  k 定数減算 k - W → W へ格納 C , DC , Z 1
XORLW  k 排他的論理和 W XOR k → W へ格納 Z 1

CALL  k サブルーチン k へジャンプ   2
GOTO  k k 番地へジャンプ   2
RETFIE 割り込み許可で戻る   2
RETLW  k W に k を格納して戻る   2
RETURN サブルーチンから戻る   2

CLRWDT ウォッチドックタイマクリア   1
SLEEP スリープモードにする   1

■表中の命令のパラメータ(オペランド)の意味

 f :レジスタファイルのアドレス

 W :ワーキングレジスタ

 b :ビットの位置(0〜7)

 k :リテラル(定数データ)

 d :格納先 0 なら W へ格納、1 なら 指定のレジスタファイルに格納

■表中の影響フラグの意味 (STATUS レジスタ)

 Z :ゼロステータス

  C :キャリーステータス

  DC:下位4ビットのキャリーステータス

 

PICのアセンブラ命令は、以上の35種類しかありません。さらに、この中でよく使うのは1/3くらいです。なので、非常に憶えやすいと言えます。ただし裏を返せば少ない命令を組み合わせて処理を行なわなければならず、そこが難しい点であるとも言えます。しかし、これら35種類の命令を積み木のように組み合わせてプログラミングするのも、とても楽しいことです。

これらの命令を見ても何のこっちゃ?という感じですが、実際のプログラム例を通しながら少しずつその使い方をご紹介していきますので、心配いりません。きっとすぐに憶えられることでしょう。

【先頭に戻る】


302−2.各種レジスタの場所

PICの動作を決定させたり動作状態を調べたりするためのレジスタ類はSFR(スペシャルファンクションレジスタ)と呼ばれ、データメモリ領域の一部にあります。なので、それぞれのレジスタにはきちんとアドレスが割り当てられ、メモリへのデータ読み書きと同じ要領でレジスタの操作が可能です。

実際にアセンブラでプログラムを組む場合でも、レジスタ名称とアドレスを関連付けたインクルードファイルを読み込むことによって、アドレス自体を意識することなくレジスタ名称を使ってプログラミングが可能になっています。

ところが、レジスタ名称とビットの意味が分かっていても、簡単にはそのレジスタにはアクセスできません。それは、データメモリ領域がバンクという考えで幾つかのブロックに分けられており、各種のレジスタはそれぞれのバンクに散らばって配置されているからです。PICの立ち上げ時はバンク0(ゼロ)にアクセス可能となっていますが、バンク1にあるレジスタにアクセスするためには、バンクを切り替えるための処理が必要になります。

その意味で、必要なレジスタがどのバンクに配置されているのか、を常に把握している必要があります。

以下にPIC16F84APIC16F873のレジスタ配置をご紹介します。

 

■PIC16F84Aレジスタ配置

Address Bank0 Bank1 Address
00h Indirect addr Indirect addr 80h
01h TMR0 OPTION 81h
02h PCL PCL 82h
03h STATUS STATUS 83h
04h FSR FSR 84h
05h PORTA TRISA 85h
06h PORTB TRISB 86h
07h 使用不可 使用不可 87h
08h EEDATA EECON1 88h
09h EEADR EECON2 89h
0Ah PCLATH PCLATH 8Ah
0Bh INTCON INTCON 8Bh
0Ch 68 SRAM

汎用レジスタ

Bank0に

マップ

8CH
   
   
4Fh CFh
50h 使用不可 使用不可 D0h
   
   
7Fh FFh

 

■PIC16F873レジスタ配置

Addr Bank0 Addr Bank1 Addr Bank2 Addr Bank3
00h Indirect Addr 80h Indirect Addr 100h Indirect Addr 180h Indirect Addr
01h TMR0 81h OPTION_REG 101h TMR0 181h OPTION_REG
02h PCL 82h PCL 102h PCL 182h PCL
03h STATUS 83h STATUS 103h STATUS 183h STATUS
04h FSR 84h FSR 104h FSR 184h FSR
05h PORTA 85h TRISA 105h 使用不可 185h 使用不可
06h PORTB 86h TRISB 106h PORTB 186h TRISB
07h PORTC 87h TRISC 107h 使用不可 187h 使用不可
08h PORTD 88h TRISD 108h   188h  
09h PORTE 89h TRISE 109h   189h  
0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah PCLATH
0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh INTCON
0Ch PIR1 8Ch PIE1 10Ch EEDATA 18Ch EECON1
0Dh PIR2 8Dh PIE2 10Dh EEADR 18Dh EECON2
0Eh TMR1L 8Eh PCON 10Eh EEDATH 18Eh 予約
0Fh TMR1H 8Fh 使用不可 10Fh DDADRH 18Fh 予約
10h T1CON 90h   110h 使用不可 190h 使用不可
11h TMR2 91h SSPCON2 111h   191h  
12h T2CON 92h PR2 112h   192h  
13h SSPBUF 93h SSPADD 113h   193h  
14h SSPCON 94h SSPSTAT 114h   194h  
15h CCPR1L 95h 使用不可 115h   195h  
16h CCPR1H 96h   116h   196h  
17h CCP1CON 97h   117h   197h  
18h RCSTA 98h TXSTA 118h   198h  
19h TXREG 99h SPBRG 119h   199h  
1Ah RCREG 9Ah 使用不可 11Ah   19Ah  
1Bh CCPR2L 9Bh   11Bh   19Bh  
1Ch CCPR2H 9Ch   11Ch   19Ch  
1Dh CCP2CON 9Dh   11Dh   19Dh  
1Eh ADRESH 9Eh ADRESL 11Eh   19Eh  
1Fh ADCON0 9Fh ADCON1 11Fh   19Fh  
20h 96Byte

汎用レジスタ

A0h 96Byte

汎用レジスタ

120h Accesses

20h-7Fh

1A0h Accesses

A0h-FFh

7Fh AFh 7Fh 1FFh

これもまた、なんのこっちゃ?とう感じですが、ここでは各バンク(Bnak)にレジスタが散らばって配置されている様子だけ、何となく知っておいて頂ければ十分です。良くみると、違うバンクに同じレジスタが配置されているものもあることが分かります。これは良く利用されるレジスタは、各バンクから共通に参照できるようにしてあるということです。

実際にプログラムを組む上では、各レジスタの意味や使用方法について知っておく必要がありますが、ここでは省略させて頂きます。追って、各個別機能のプログラミング方法を紹介する時に、その利用方法について触れていくことにしましょう。

【先頭に戻る】


302−3.良く使うレジスタの機能

ここでは、「基礎実験のお話」でご紹介しているレジスタの機能を、少しずつ集めて見たいと思います。実際のプログラム例で使用しているレジスタをその都度寄せ集めて行きますので、良く使うレジスタであると言えるでしょう。プログラムを作る時の参考にして下さい。

 

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

ビット名 選択肢 説 明
FOSC RC/HS/XT/LP PICに使用している発振回路を指定する。
WDTE ENABLE/DISABLE ウォッチドックタイマを利用するかしないかを指定する。
PWRTE ENABLE/DISABLE 電源投入直後の72mS期間のリセット動作をするかしないかを指定する。
CP ENABLE/DISABLE コードプロテクトをするかしないかを指定する。

 

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

ビット名 選択肢 説 明
FOSC RC/HS/XT/LP PICに使用している発振回路を指定する。
WDTE ENABLE/DISABLE ウォッチドックタイマを利用するかしないかを指定する。
PWRTE DISABLE/ENABLE 電源投入直後の72mS期間のリセット動作をするかしないかを指定する。
BODEN ENABLE/DISABLE ブラウンアウトリセット(電源電圧低下によるリセット)をするかしないかを設定する。
LVP RB3:PGM/RB3:GPIO 低電圧(5V)プログラミングの有効/無効を設定する。有効だとRB3端子はプログラミング専用になる。
CPD DISABLE/ENABLE 内部EEPROMデータメモリのコードプロテクトをするかしないかを設定する。
WRT ENABLE/DISABLE ユーザープログラムがEECONレジスタを使用してFLASHプログラムメモリへの書き込みをするかしないかを設定する。
DEBUG DISABLE/ENABLE インサーキットデバッグモードの有効/無効を設定する。有効だとRB6,RB7端子はデバッグ専用になる。
CP DISABLE/0800H-0FFFH/0F00H-0FFFH/ALL コードプロテクトをするかしないかを指定する。

FOSC(発振回路指定)の部分は、以下を参考にモードを選択します。

モード 説 明 発振周波数の範囲 備 考
LP 低電力/水晶発振 200KHz以下 極低消費電力動作が可能
XT 水晶/セラミック発振 4MHz以下 標準的な用途
HS 高周波水晶/セラミック発振 4MHz〜20MHz 高速動作が可能
RC RC発振 約1MHz以下 抵抗とコンデンサで組める安価

 

STATUSレジスタの機能

 

7 6 5 4 3 2 1 0
(IRP) (RP1) RP0 TO PD Z DC C

IRP:関節アドレス指定の際、レジスタバンクを選択します。16F84Aでは未使用です。

RP1:PR0:レジスタのバンク切り替えを行ないます。RP1は16F84Aでは未使用です。

       RP0 = 0 → BANK0 、 RP0 = 1 → BANK1

TO:タイムアウトビット

       1 = 電源ON後、CLRWT命令またはSLEEP命令の実行後。

       0 = WDT(ウォッチドックタイマー)のタイムアウト発生。

PD:パワーダウンビット

       1 = 電源ON後またはCLRWDT命令による。

       0 = SLEEP命令の実行による。

Z:ゼロビット

       1 = 計算またはロジック演算の結果がゼロ。

       0 = 計算又はロジック演算の結果がゼロではない。

DC:デジットキャリー

       1 = 結果により下位4ビット目からキャリーが発生した。

       0 = 結果により下位4ビット目からキャリーが発生しなかった。

C:キャリー

       1 = 結果により最上位ビットからキャリーが発生した。

       0 = 結果により最上位ビットからキャリーが発生しなかった。

※ボロービットについては説明を省略します...。

 

TRISAレジスタの機能

PORTAの入出力を設定するレジスタです。

7 6 5 4 3 2 1 0
- - (TRISA5) TRISA4 TRISA3 TRISA2 TRISA1 TRISA0

     1 = 指定のビットを入力ポートに設定する。

     0 = 指定のビットを出力ポートに設定する。

TRISA0から5の各ビットは、PORTAの各ビットに対応しています。TRISA5ビットは、16F84Aでは未使用です。

 

■TRISBレジスタの機能

PORTBの入出力を設定するレジスタです。

7 6 5 4 3 2 1 0
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

     1 = 指定のビットを入力ポートに設定する。

     0 = 指定のビットを出力ポートに設定する。

TRISBの各ビットは、PORTBの各ビットに対応しています。

 

■OPTION_REGジレスタの機能

外部割り込みの設定、タイマー0の設定、PORTBのプルアップ設定を行なうレジスタです。

7 6 5 4 3 2 1 0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

RBPU:PORTBプルアップイネーブルビット

     1 = PORTBを内部プルアップしない。(出力設定時に使用)

     0 = PORTBを内部プルアップする。(入力設定時に使用)

INTEDG:割り込みエッジ選択ビット

     1 = RB0/INT端子の立ち上がりエッジで割り込み発生

     0 = RBO/INT端子の立下りエッジで割り込み発生

T0CS:TMR0(タイマー0チャンネル)クロックソース選択ビット

     1 = RA4/T0CK1端子の入力をタイマークロックとする。

     0 = 内部命令サイクル(φ/4)をタイマークロックとする。

T0SE:TMR0(タイマー0チャンネル)ソースエッジ選択ビット

     1 = RA4/T0CK1端子の立下りタイミングでインクリメント(カウントアップ)

     0 = RA4/T0CK1端子の立上がりタイミングでインクリメント

PSA:プリスケーラ割り当てビット

     1 = PS2〜0で指定するプリスケーラをWDT(ウォッチドックタイマー)に割り当てる。

     0 = PS2〜0で指定するプリスケーラをTMR0(タイマー0チャンネル)に割り当てる。

PS2〜0:プリスケーラ選択ビット。

PS2,1,0 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ジレスタの機能

割り込み発生の状態を監視したり、割り込み発生を許可/禁止するレジスタです。

7 6 5 4 3 2 1 0
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF

GIE:グローバル割り込みイネーブルビット

     1 = 全てのマスクされていない割り込み発生を許可する。

     0 = 全ての割り込み発生を禁止する。

EEIE:EEPROM書き込み完了割り込みイネーブルビット

     1 = EEPROMへの書き込み完了割り込みの発生を許可する。

     0 = EEPROMへの書き込み完了割り込みの発生を禁止する。

TOIE:TMR0オーバーフロー割り込みイネーブルビット

     1 = TMR0割り込みの発生を許可する。

     0 = TMR0割り込みの発生を禁止する。

INTE:RB0/INT割り込みイネーブルビット

     1 = RB0/INT割り込みの発生を許可する。

     0 = RB0/INT割り込みの発生を禁止する。

RBIE:RBポート変化割り込みイネーブルビット

     1 = RBポート変化割り込みの発生を許可する。

     0 = RBポート変化割り込みの発生を禁止する。

TOIF:TMR0オーバーフロー割り込みフラグビット

     1 = TMR0でオーバーフローが発生した。

     0 = TMR0でオーバーフローが発生していない。

INTF:RB0/INT割り込みフラグビット

     1 = RB0/INT割り込みが発生した。

     0 = RB0/INT割り込みが発生していない。

RBIF:RBポート変化割り込みフラグビット

     1 = RBポート変化割り込みが発生した。

     0 = RBポート変化割り込みが発生していない。

 

■PIE1(ペリフェラルインタラプトイネーブル)レジスタの機能

周辺機能の割り込みの許可/禁止設定を行います。

7 6 5 4 3 2 1 0
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

PSPIE:パラレルスレーブポート割り込みイネーブルビット

    PIC16F873では無効です。0にしておきます。

ADIE:AD変換器割り込みイネーブルビット

     1 = ADコンバータ割り込みを使用可能にする。

     0 = ADコンバータ割り込みを使用不可にする。

RCIE:USART受信割り込みイネーブルビット

     1 = USART受信割り込みを使用可能にする。

     0 = USART受信割り込みを使用不可にする。

TXIE:USART送信割り込みイネーブルビット

     1 = USART送信割り込みを使用可能にする。

     0 = USART送信割り込みを使用不可にする。

SSPIE:同期シリアルポート割り込みイネーブルビット

     1 = SSP割り込みを使用可能にする。

     0 = SSP割り込みを使用不可にする。

CCP1IE:CCP1割り込みイネーブルビット

     1 = CCP1割り込みを使用可能にする。

     0 = CCP1割り込みを使用不可にする。

TMR2IE:TMR2-PR2一致割り込みイネーブルビット

     1 = 一致割り込みを使用可能にする。

     0 = 一致割り込みを使用不可にする。

TMR1IE:TMR1オーバーフロー割り込みイネーブルビット

     1 = TMR1オーバーフロー割り込みを使用可能にする。

     0 = TMR1オーバーフロー割り込みを使用不可にする。

 

■PIR1レジスタの機能

周辺機能の割り込みフラグビットが割り当てられています。

7 6 5 4 3 2 1 0
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

PSPIF:パラレルスレーブポート割り込みフラグビット

    PIC16F873では無効です。

ADIF:AD変換器割り込みフラグビット

     1 = AD変換が完了した。

     0 = AD変換が完了していない。

RCIF:USART受信割り込みフラグビット

     1 = USART受信バッファがフル。

     0 = USART受信バッファが空。

TXIF:USART送信割り込みフラグビット

     1 = USART送信バッファが空。

     0 = USART送信バッファがフル。

SSPIF:同期シリアルポート割り込みフラグビット

     1 = SSP割り込みコンディションが発生した。

     0 = SSP割り込みコンディションが発生していない。

CCP1IF:CCP1割り込みフラグビット

     1 = CCP1割り込みが発生した。

     0 = CCP1割り込みが発生していない。

TMR2IF:TMR2-PR2一致割り込みフラグビット

     1 = 一致割り込みが発生した。

     0 = 一致割り込みが発生していない。

TMR1IE:TMR1オーバーフロー割り込みフラグビット

     1 = TMR1オーバーフロー割り込みが発生した。

     0 = TMR1オーバーフロー割り込みが発生していない。

 

■T1CONレジスタの機能

タイマー1の動作設定を行います。

7 6 5 4 3 2 1 0
T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

T1CKPS1,0:プリスケーラ選択ビット

T1CKPS1,0

プリスケール値

1 1 1:8
1 0 1:4
0 1 1:2
0 0 1:1

T1OSCEN:タイマ1オシレータイネーブルビット

    1 = オシレータを動作させる。

    0 = オシレータを停止させる。

T1SYNC:タイマ1外部クロック入力同期コントロールビット(TMR1CSが1の時に有効)

     1 = 外部クロック入力を同期させない。

     0 = 外部クロック入力を同期させる。

TMR1CS:タイマ1クロックソース選択ビット

     1 = RC0/T1OSO/T1CK1ピンからの外部クロックを有効にする。

     0 = 内部クロックを有効にする。

TMR1ON:タイマ1オン(スタート)ビット

     1 = タイマ1を動作させる。

     0 = タイマ1を停止させる。

 

【先頭に戻る】


アセンブラでプログラムを作る時には、ここでご紹介したアセンブラ命令一覧と、ジレスタ配置一覧をにらめながら考えていきます。あと、もちろん回路図も見ながら信号の入出力を含めて検討していきます。

今回は全然具体的な説明ができませんでしたが、一応予備知識程度に、これらのことを知っておいて頂ければ、プログラミングの勉強へと進んでいくことができるのではないかと思います。

 

【ソフトウエア編TOPに戻る】


改版: 2001.12.9  レジスタの機能説明について追記 (OPTION REG)

改版: 2002.4.3    レジスタの機能説明について追記 (INTCON)

改版    2002.10.23  レジスタの機能説明について追記  (PIE1PIR1,T1CON)

 


【表紙に戻る】