舞鶴技術研究会ホームページへ
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種類に分類される。
【バイト処理命令】
【ビット処理命令】
【リテラル処理命令】
【コントロール命令】
【ジャンプ命令】

以下に命令の一覧を示す。ただしオペランドの記号の意味は以下のとおりである。  
【バイト処理命令詳細】
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))=0fレジスタの第bビット目が0だったらスキップ、
スキップ時はNOPが入るため2サイクル命令
(22)BTFSS f,b無し skip if(f(b))=1fレジスタの第bビット目が1だったらスキップ、
スキップ時はNOPが入るため2サイクル命令
【リテラル処理命令詳細】
No 書式影響フラグ実行内容実行説明
(23)ADDLW kC,DC,Z(Wreg)+k→(Wreg) Wregにリテラルデータを加算する
(24)ANDLW kZ (Wreg).AND.(k)→(Wreg)WregとリテラルデータのANDを取る
(25)IORLW kZ (Wreg).OR.(k)→(Wreg) WregとリテラルデータのORを取る
(26)MOVLW k無し (k)→(Wreg)リテラルデータをWregに取り出す
(27)SUBLW kC,DC,Z(k)-(Wreg)→(Wreg)リテラルデータからWregを引き算する
(28)XORLW kZ (Wreg).XOR.(k)→(Wreg)WregとリテラルデータのXORを取る
【コントロール命令詳細】
No 書式影響フラグ実行内容実行説明
(29)CLRWDTTO,PD0→(WDT prescaler)
1→TO,1→PD
ウォッチドッグタイマをリセットする
(30)SLEEP TO,PD0→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