目次4章 PICの基礎>(1)PICの命令とアセンブラ命令

PICの命令とアセンブラ命令
更新日2005.9.18

PIC(PIC16F84A)には、35個の命令があります。
命令が体系だっている事と数が少ないので、覚えるのはそれほど大変ではありません。

命令の書き方
PICの命令は、メモ帳などのテキストエディタで作成します。
命令の構文は次のようになっています。

ラベル 命令 オペランド

ラベル命令の場所(アドレス)に名前を付けたい時に記述します。
行の先頭から記述します。使用できる文字は、英数字と特殊文字のみで日本語は使用できません。
命令命令(ニーモニック)を記述します。
ラベルがある場合は、1つ以上スペースを空けて記述します。ラベルが無い場合は、行の先頭から1つ以上のスペースを空けて記述します。
オペランド命令毎に決められているオペランド(命令のパラメータ)を記述します。
命令の後に1つ以上のスペースを空けて記述します。

; コメント
セミコロン(;)より右は、行の最後までコメントとなります。日本語もOKです。

《例》
ラベル 命令 オペランド ; コメント
LOOP ; ラベルだけの行があっても良い
 ; COUNTが0になるまで繰り返す処理を記述
 DECFSZ COUNT,F ; COUNT - 1 が0なら次の命令をスキップ(NEXTへ)
 GOTO LOOP ; LOOPに戻る
NEXT

PICの命令
PICの命令は、以下の3種類に分類されます。
・バイト対応のファイルレジスタ命令(18命令)
・ビット対応のファイルレジスタ命令(4命令)
・リテラルおよびコントロール命令(13命令)

各命令については、PICの命令一覧を参照して下さい。
当ページで扱う全てのPICに共通です。(PIC16F84A,PIC12F683,PIC16F88,PIC16F877A など)

アセンブラ命令 
アセンブラ命令は、PICの命令では無く、アセンブラ(MPLAB IDE)に対する命令です。
アセンブラがソースプログラムを翻訳する時に、アセンブラ命令に従って翻訳し、PICの命令(機械語)を作成(ビルド)します。

代表的なアセンブラ命令には以下があります。
LIST使用するPICの種類などを定義する
INCLUDE設定ファイルを指定する
__CONFIGPICの動作モードなどを指定する
EQU定数をラベル名で定義する
CBLOCK
ENDC
連続した定数をラベル名で定義する
ORG以降の命令の先頭アドレスを指定する
ENDソースの最後である事を定義する

《使用例》

        LIST    P=PIC16F84A  ; LIST宣言で使用するPICを16F84Aと定義する
        INCLUDE P16F84A.INC  ; 設定ファイルp16f84a.incを読み込む

        __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


        ORG     0           ; リセットベクタ(0番地)を指定する。

 

LIST命令
LIST命令では、使用するPICの種類を定義します。
当ホームページでは主にPIC16F84Aを使用しますので、以下のように定義します。
 LIST P=PIC16F84A

INCLUDE命令
INCLUDE命令では、設定ファイルを指定します。設定ファイルは、PICの種類毎にアセンブラ(MPLAB IDE)により提供されています。
PIC16F84Aでは以下のように定義します。
 INCLUDE P16F84A.INC

__CONFIG命令<PIC16F84A>
__CONFIG命令では、PICの動作モードを指定します。

設定できる値は以下の通りです。(PIC16F84の場合)
それぞれの設定値は、「&」でつなげて記述します。

動作モード設定値と意味
コードプロテクト有無_CP_ONコードプロテクトする
_CP_OFFコードプロテクトしない
オシレータの種類_LP_OSC100KHz以下(水晶振動子,省電力モード)
_XT_OSC4MHz以下(水晶振動子orセラミック振動子)
_HS_OSC4MHz〜20MHz(水晶振動子orセラミック振動子)
_RC_OSC4MHz以下(R/C発振)
パワーアップタイマ有効・無効_PWRTE_ONパワーアップタイマ有効
_PWRTE_OFFパワーアップタイマ無効
ウォッチドックタイマ使用有無_WDT_ONウォッチドックタイマ有効
_WDT_OFFウォッチドックタイマ無効

当ホームページでは以下の定義を基本とします。
 __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

EQU命令
EQU命令は、オペランドで指定した値を使う代わりに、ラベルで指定した名前を使用できるようにします。

例えば、データメモリの0Ch番地(汎用RAMの先頭)をカウンタで使用するケースでは、以下のどちらの方法でも同じ結果になりますが、名前が付いていた方が分かりやすいと思います。
0Ch番地を値で参照0Ch番地を名前で参照
 DECFSZ 0Ch,F
COUNTER EQU 0Ch
 DECFSZ COUNTER,F

また、汎用レジスタの先頭アドレスは、PICの種類により異なりますので、名前を付けて使っていれば別の機種に移行する時も楽になります。(EQU命令のアドレスを変えるだけで良い)

CBLOCK,ENDC命令
CBLOCKとENDC命令は、EQU命令と同じで、値に名前を付ける命令です。

EQU命令との違いは、連続した値に名前を付ける時、個々の名前に値を指定せずにCBLOCK命令のオペランドで値を指定すれば、ENDCまでの名前に+1した値が自動的に割り当てられます。
CBLOCK〜ENDC命令の例を、EQU命令と対比して載せます。

CBLOCK〜ENDCの例同じ事をEQU命令で書くと
CBLOCK0Ch
SAVE_ST
SAVE_W
COUNTER
ENDC
SAVE_STEQU0Ch
SAVE_WEQU0Dh
COUNTEREQU0Eh

ORG命令
ORG命令は、以降に続く命令をプログラムメモリの何番地から格納するかを指定します。

プログラムの先頭では、通常以下のように記述します。
 ORG 0 ; リセットベクタ(0番地)を指定
 GOTO START ; STARTに行く
 ORG 4 ; 割込みベクタ(4番地)を指定
 ; ここに割込み処理を記述
START ; ここから通常処理開始

割込みについては、(5)TMR0割込みを使うの「割込みとは」を参照下さい。

END命令
END命令は、ソースプログラムの最後を宣言する命令で、最終行に記述します。
 END