舞鶴技術研究会ホームページへ
2002年7月4日
1チップマイコンPICの勉強会
〜アーキテクチャの理解からロボットランサーの設計製作まで〜
by 舞鶴技術研究会 情報システム部門「ものづくりプロジェクト:PIC&AVRによる1チップマイコン応用技術」
付録A:PICの全命令
情報システム分科会幹事 舞鶴工業高等専門学校 電子制御工学科 町田秀和
連絡先 E-mail machida@maizuru-ct.ac.jp 電話 0773-62-8957
assisted by the 舞鶴工業高等専門学校 電子制御研究会同好会
テキスト CQ出版社、トランジスタ技術別冊、ECB No.4 PICマイコンを使おう
目次
本文
A. PICの全命令
PICの命令は全てで35種類しかない。かなり特殊な命令もあるが、全部覚えてしまうのも
それほど困難ではないだろう。
詳細な解説は、PICファンにお任せするとして、
ここでは、全命令の一覧とプログラム(シミュレータで確認用)を掲載する。MPLABに
コピペしてその振る舞いを確かめられたい。
A.1 命令一覧
PICの命令は次の5種類に分類される。
【バイト処理命令】
【ビット処理命令】
【リテラル処理命令】
【コントロール命令】
【ジャンプ命令】
以下に命令の一覧を示す。ただしオペランドの記号の意味は以下のとおりである。
f:レジスタアドレス(00〜127)
b:ビット指定(0〜7)
d:格納先(0または1)(0はWレジスタ、1はファイルレジスタ)
k:リテラルデータ(00〜256)
【バイト処理命令詳細】 |
No | 書式 | 影響フラグ | 実行内容 | 実行説明 |
(1) | ADDWF f,d | C,DC,Z | (Wreg)+(f)→(dest) | Wregとfレジスタとの加算 |
(2) | ANDWF f,d | Z | (Wreg).AND.(f)→(dest) | Wregとf レジスタとの論理AND演算 |
(3) | CLRF f | 1→Z | 00H→(f) | f レジスタをゼロクリアする |
(4) | CLRW | 1→Z | 00H→(Wreg) | Wreg をゼロクリアする |
(5) | COMF f,d | Z | complement(f)→(dest) | fレジスタの補数の演算(全部反転=NOT)) |
(6) | DECF f,d | Z | (f)−1→(dest) | fレジスタのカウントダウン |
(7) | DECFSZ f,d | 無し | (f)−1→(dest); skip if result=0 | fレジスタの減算をし結果が0ならスキップ |
(8) | INCF f,d | Z | (f)+1→(dest) | fレジスタのカウントアップ |
(9) | INCFSZ f,d | 無し | (f)+1→(dest); skip if result=0 | fレジスタの加算をし結果が0ならスキップ |
(10) | IORWF f,d | invert Z | (Wreg).OR.(f)→(dest) | Wregとf レジスタとの論理和演算 |
(11) | MOVF f,d | Z | (f)→(dest) | fレジスタの移動 |
(12) | MOVWF f | 無し | (Wreg)→(f) | Wregをfレジスタに移動 |
(13) | NOP | 無し | 無し | 何もしないで次へ進む |
(14) | RLF f,d | C | f→d(nは0から6) f<7>→C,C→d<0> | fレジスタの内容をキャリを含めて左回転 |
(15) | RRF f,d | C | f→d(nは0から6) f<0>→C,C→d<7> | fレジスタの内容をキャリを含めて右回転 |
(16) | SUBWF f,d | C,DC,Z | (f)-(Wreg)→(dest) | Wregとfレジスタとの減算 |
(17) | SWAPF f,d | 無し | (f<3:0>)→(f<7:4>) (f<7:4>)→(F<3:0>) | fレジスタの上位下位入れ替え |
(18) | XORWF f,d | Z | (Wreg).XOR.(f)→(dest) | Wregとfレジスタとの排他論理和演算 |
【ビット処理命令詳細】 |
No | 書式 | 影響フラグ | 実行内容 | 実行説明 |
(19) | BCF f,b | 無し | 0→f(b) | fレジスタの指定ビットを0にする |
(20) | BSF f,b | 無し | 1→f(b) | fレジスタの指定ビットを1にする |
(21) | BTFSC f,b | 無し | skip if(f(b))=0 | fレジスタの第bビット目が0だったらスキップ、
スキップ時はNOPが入るため2サイクル命令 |
(22) | BTFSS f,b | 無し | skip if(f(b))=1 | fレジスタの第bビット目が1だったらスキップ、
スキップ時はNOPが入るため2サイクル命令 |
【リテラル処理命令詳細】 |
No | 書式 | 影響フラグ | 実行内容 | 実行説明 |
(23) | ADDLW k | C,DC,Z | (Wreg)+k→(Wreg) | Wregにリテラルデータを加算する |
(24) | ANDLW k | Z | (Wreg).AND.(k)→(Wreg) | WregとリテラルデータのANDを取る |
(25) | IORLW k | Z | (Wreg).OR.(k)→(Wreg) | WregとリテラルデータのORを取る |
(26) | MOVLW k | 無し | (k)→(Wreg) | リテラルデータをWregに取り出す |
(27) | SUBLW k | C,DC,Z | (k)-(Wreg)→(Wreg) | リテラルデータからWregを引き算する |
(28) | XORLW k | Z | (Wreg).XOR.(k)→(Wreg) | WregとリテラルデータのXORを取る |
【コントロール命令詳細】 |
No | 書式 | 影響フラグ | 実行内容 | 実行説明 |
(29) | CLRWDT | TO,PD | 0→(WDT prescaler)
1→TO,1→PD | ウォッチドッグタイマをリセットする |
(30) | SLEEP | TO,PD | 0→WDT 0→WDT prescaler 1→TO,0→PD
| プロセッサをスリープモードにする |
【ジャンプ命令詳細】 |
No | 書式 | 影響フラグ | 実行内容 | 実行説明 |
(31) | CALL k | 無し |
(PC)+1→スタック k→PC<10:0> (PCLATH<4:3>)→PC<12:11> |
サブルーチンにジャンプする 2サイクル命令 |
(32) | GOTO k | 無し |
k→PC<10:0> (PCLATH<4:3>)→PC<12:11> |
指定番地にジャンプする 2サイクル命令 |
(33) | RETURN | 無し | スタック→PC |
サブルーチンから無条件復帰する 2サイクル命令 |
(34) | RETFIE | 無し | スタック→PC 1→GIE |
割り込みから復帰する 2サイクル命令 |
(35) | RETLW k | 無し | k→Wreg スタック→PC |
リテラルデータをWregにセットして復帰する 2サイクル命令 |
A.2 全命令プログラム例
全命令のプログラム(シミュレータで確認用)を掲載する。MPLABに
コピペしてその振る舞いを確かめられたい。
ただし、最後のsleepには気をつけられたい。
; file name = all.asm all instructions
list p=16f84
#include "p16f84.inc"
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
RADIX DEC
TEMP EQU 20H ;20H番地に、TEMPというラベルをつける
ORG 00H ;00H番地からプログラムをはじめる。
; instruction behaivior Flag Result
MOVLW 7 ;(26) 7→(W) 無し W=7
; byte processing
CLRF TEMP ; (3) 00H→(TEMP) 1→Z W=7, TEMP=0
ADDWF TEMP,1 ; (1) (W)+(TEMP)→(TEMP) C,DC,Z W=7, TEMP=7
ANDWF TEMP,1 ; (2) (W).AND.(TEMP)→(TEMP) Z W=7, TEMP=7
CLRW ; (4) 00H→(W) 1→Z W=0, TEMP=7
COMF TEMP,1 ; (5) complement(TEMP)→(TEMP) Z W=0, TEMP=F8
DECF TEMP,1 ; (6) (f)−1→(TEMP) Z W=0, TEMP=F7
DECFSZ TEMP,1 ; (7) (f)−1→(TEMP); skip if result=0 スキップしない
NOP ;(13) 無し 無し W=0, TEMP=F6
INCF TEMP,1 ; (8) (f)+1→(TEMP) Z W=0, TEMP=F7
INCFSZ TEMP,1 ; (9) (f)+1→(TEMP); skip if result=0 スキップしない
NOP ;(13) 無し 無し W=0, TEMP=F8
IORWF TEMP,1 ;(10) (W).OR.(TEMP)→(TEMP) invertZ W=0, TEMP=F8
MOVF TEMP,1 ;(11) (TEMP)→(TEMP) Z W=0, TEMP=F8
MOVWF TEMP ;(12) (W)→(TEMP) 無し W=0, TEMP=0
NOP ;(13) 無し 無し W=0, TEMP=0
COMF TEMP,1 ; (5) complement(TEMP)→(TEMP) Z W=0, TEMP=FF
RLF TEMP,1 ;(14) TEMP→TEMP [Rotate Left] C W=0, TEMP=FE
RLF TEMP,1 ;(14) TEMP→TEMP [Rotate Left] C W=0, TEMP=FD
RRF TEMP,1 ;(15) TEMP→TEMP [Rot. Right] C W=0, TEMP=FE
SUBWF TEMP,1 ;(16) (TEMP)-(W)→(TEMP) C,DC,Z W=0, TEMP=FE
SWAPF TEMP,1 ;(17) 上位4bit,下位4bit入替 無し W=0, TEMP=EF
XORWF TEMP,1 ;(18) (W).XOR.(TEMP)→(TEMP) Z W=0, TEMP=EF
; bit processing
BCF TEMP,0 ;(19) 0→TEMP(0) 無し W=0, TEMP=EE
BSF TEMP,0 ;(20) 1→TEMP(0) 無し W=0, TEMP=EF
BTFSC TEMP,0 ;(21) skip if(TEMP(0))=0 スキップしない
NOP ;(13) 無し 無し W=0, TEMP=EF
BTFSS TEMP,0 ;(22) skip if(TEMP(0))=1 スキップする
NOP ;(13) 無し 無し W=0, TEMP=EF
; literal
ADDLW 1 ;(23) (W)+1→(W) C,DC,Z W=1, TEMP=EF
ANDLW 2 ;(24) (W).AND.2→(W) Z W=0, TEMP=EF
IORLW 3 ;(25) (W).OR.3→(W) Z W=3, TEMP=EF
MOVLW 4 ;(26) 4→(W) 無し W=4, TEMP=EF
SUBLW 5 ;(27) 5-(W)→(W) C,DC,Z W=1, TEMP=EF
XORLW 6 ;(28) (W).XOR.6→(W) Z W=7, TEMP=EF
;jump
CALL SUB ;(31) (PC)+1→スタック,SUB→PC<10:0>,(PCLATH<4:3>)→PC<12:11>
GOTO BREAK1 ;(32) BREAK1→PC<10:0>,(PCLATH<4:3>)→PC<12:11>
SUB RETURN ;(33) スタック→PC
BREAK1 CALL ISUB ;(31) (PC)+1→スタック,ISUB→PC<10:0>,(PCLATH<4:3>)→PC<12:11>
GOTO BREAK2 ;(32) BREAK2→PC<10:0>,(PCLATH<4:3>)→PC<12:11>
ISUB RETFIE ;(34) スタック→PC,1→GIE
BREAK2 CALL ISUBL ;(31) (PC)+1→スタック,ISUBL→PC<10:0>,(PCLATH<4:3>)→PC<12:11>
GOTO BREAK3 ;(32) BREAK3→PC<10:0>,(PCLATH<4:3>)→PC<12:11>
ISUBL RETLW 7 ;(35) 7→W,スタック→PC W=7
BREAK3
; control
CLRWDT ;(29) 0→(WDT prescaler),1→TO,1→PD
; SLEEP ;(30) 0→WDT,0→WDT prescaler,1→TO,0→PD
END