目次>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に共通です。(PIC16F84A,PIC12F683,PIC16F88,PIC16F877A など)
|
| ・ |
|
| アセンブラ命令
|
| アセンブラ命令は、PICの命令では無く、アセンブラ(MPLAB IDE)に対する命令です。
アセンブラがソースプログラムを翻訳する時に、アセンブラ命令に従って翻訳し、PICの命令(機械語)を作成(ビルド)します。
- 代表的なアセンブラ命令には以下があります。
-
| LIST | 使用するPICの種類などを定義する
| | INCLUDE | 設定ファイルを指定する
| | __CONFIG | PICの動作モードなどを指定する
| | 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を使用しますので、以下のように定義します。
| |
| | INCLUDE命令
| | INCLUDE命令では、設定ファイルを指定します。設定ファイルは、PICの種類毎にアセンブラ(MPLAB IDE)により提供されています。
| | PIC16F84Aでは以下のように定義します。
| |
| | __CONFIG命令<PIC16F84A>
| | __CONFIG命令では、PICの動作モードを指定します。
設定できる値は以下の通りです。(PIC16F84の場合)
それぞれの設定値は、「&」でつなげて記述します。
| 動作モード | 設定値と意味
| | コードプロテクト有無 | _CP_ON | コードプロテクトする
| | _CP_OFF | コードプロテクトしない
| | オシレータの種類 | _LP_OSC | 100KHz以下(水晶振動子,省電力モード)
| | _XT_OSC | 4MHz以下(水晶振動子orセラミック振動子)
| | _HS_OSC | 4MHz〜20MHz(水晶振動子orセラミック振動子)
| | _RC_OSC | 4MHz以下(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命令で書くと
|
| CBLOCK | | 0Ch |
| | SAVE_ST | | |
| | SAVE_W | | |
| | COUNTER | | |
| | ENDC | | |
|
|
| SAVE_ST | | EQU | | 0Ch
| | SAVE_W | | EQU | | 0Dh
| | COUNTER | | EQU | | 0Eh
|
|
| | ORG命令
| | ORG命令は、以降に続く命令をプログラムメモリの何番地から格納するかを指定します。
| | プログラムの先頭では、通常以下のように記述します。
| ORG | 0 | ; リセットベクタ(0番地)を指定
| | GOTO | START | ; STARTに行く
| | ORG | 4 | ; 割込みベクタ(4番地)を指定
| | | | ; ここに割込み処理を記述
| | START | | | ; ここから通常処理開始
|
割込みについては、(5)TMR0割込みを使うの「割込みとは」を参照下さい。
| | END命令
| | END命令は、ソースプログラムの最後を宣言する命令で、最終行に記述します。
| |
|
|