PICの概要

2005 年 2 月 28 日
三浦克介 ([email protected])
電子情報工学創成実験
「マイコンプログラミング設計」補助資料
PIC の概要
概要
この文書は、
「マイコンプログラミング設計」実験課題を効率的に行う為の補助資料である。PIC
の特徴、一般的な計算機と PIC の違い、サンプルプログラムで使用されている命令、アセンブラで
ループや条件判定等を行う定石の処理、プログラム実行時間の計算方法、等について、極めて簡略に
説明している。詳細については、文献 [1, 2] を参照のこと。
目次
1 PIC の特徴、一般的な計算機との違い
1
2 ファイルレジスタ
2.1 特殊レジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 汎用レジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2
2
3 サンプルプログラムで使われている命令
3
4 アセンブラの定石処理
4.1 ループ . . . . . . . . .
4.2 条件判定 (ビット検査)
4.3 条件判定 (大小比較) . .
4.4 サブルーチン呼び出し
4.5 ビット演算 . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 プログラム実行時間の計算方法
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
4
6
6
6
PIC の特徴、一般的な計算機との違い
PIC の特徴、一般的な計算機と PIC で大きく違う点について説明する。一般的な計算機の構成を図 1
に、PIC の構成を図 2 に示す。
• 一般的な CPU では主記憶装置 ( メインメモリ) にプログラム、データ、スタックが置かれるが、PIC
では、それぞれに専用のプログラムメモリ、データメモリ、スタックがある。
• PIC のデータメモリは、フラッシュメモリ (不揮発性メモリ) を用いて実装されており、書き込み
速度が遅く、書き換え回数にも上限がある。計算時の一時的な記憶用途には向かず、長期的なデー
タの保存に適している。
• PIC の制御装置には汎用レジスタが無い。
• 主記憶装置と汎用レジスタの中間的な記憶装置として、PIC にはファイルレジスタと呼ばれるメモ
リがある。
• プログラムメモリは Read Only。
• スタックは Call/Return 専用。
–1–
C P U
図 1: 一般的な計算機の構成
P IC
図 2: PIC の構成
2 ファイルレジスタ
PIC のファイルレジスタについて説明する。詳細は、[1] p.19 参照。
• 8 ビット = 1 ワード。
• アドレス (番地) とバンクで、どのレジスタに対して読み書きするかを決定する。
• 1 つのバンクに 80 (50H1 ) ワード のレジスタがあり、これが 2 バンクある。
• 2 つのバンクは完全に独立では無い。一部のアドレスのレジスタは、ど ちらのバンクに対してアク
セスしても、同じレジスタへのアクセスになる。
2.1
特殊レジスタ
バンク 0, 1 のアドレス 0∼0BH は、PIC を制御する為の特殊レジスタになっている。このうち、良く
使うものを表 1 にまとめる。
2.2
汎用レジスタ
バンク 0, 1 のアドレス 0CH∼4FH は、プログラマが自由な用途で使用して良い汎用レジスタである。バ
ンク 0, 1 のどちらにアクセスしても同じレジスタにアクセスされる (即ち、レジスタの個数は 68 (44H) 個)。
1
数字の後に “H” が付くと、16 進数を意味する。先頭が英字の場合は、その前に “0” (ゼロ) を付ける。例:0A3H
–2–
表 1: よく使われる特殊レジスタ
バンク
アドレス
ビット
機能
0, 1 共通
3 (STATUS)
5 (RP0)
0
5 (PORTA)
0∼4
0
6 (PORTB)
0∼7
1
5 (TRISA)
0∼4
1
5 (TRISB)
0∼7
今後アクセスするバンクの切り変え (0:バン
ク 0 、1:バンク 1)
ポート RA が入力の場合:ポート RA に入力
されたデータの読み出し
ポート RA が出力の場合:ポート RA に出力
するデータの書き込み
ポート RB が入力の場合:ポート RB に入力
されたデータの読み出し
ポート RB が出力の場合:ポート RB に出力
するデータの書き込み
ポート RA を入力として使うか、出力として
使うかを決定 (ビット毎に指定でき、0:出力、
1:入力)
ポート RB を入力として使うか、出力として
使うかを決定 (ビット毎に指定でき、0:出力、
1:入力)
3 サンプルプログラムで使われている命令
サンプルプログラム timer.asm 、PAtoPB.asm で使われている命令について説明する。
label EQU value :(EQUal) C 言語の#define と同様な定数定義。以降、label が出てくると、value に置き
換えられる。label は 32 文字以下の英数字かアンダーバー (先頭は英字かアンダーバー)。
BSF 3, 5 :(Bit Set File-register) ファイルレジスタの内、現在選択されているバンクのアドレス 3 、ビッ
ト 5 を 1 にセットする。
あらかじめ、STATUS EQU 3 および RP0 EQU 5 と定数定義されていれば 、BSF STATUS, RP0
と書くことができ、より可読性を高めることができる。P16F84.INC の中でこれらの定義がなされ
ており、このファイルをインクルード すれば 、新ためて定義する必要は無い。
BCF address, bit :(Bit Clear File-register) BSF の逆で、0 にクリアする。
CLRF address :(CLeaR File-register) ファイルレジスタのアドレス address の全ビットを 0 にクリア。
MOVLW value :(MOVe Literal to Working-register) 定数 value をワーキングレジスタ W に転送。
MOVFW address :(MOVe File-register to Working-register) ファイルレジスタのアドレス address の内容
をワーキングレジスタ W に転送。
MOVWF address :(MOVe Working-register to File-register) ワーキングレジスタ W の内容をファイルレ
ジスタのアドレス address に転送。
MOVF address, F :(MOVe File-register to File-register) ファイルレジスタのアドレス address の内容を、
ファイルレジスタのアドレス address に転送。一見、無意味な命令のようだが、転送の際にフラグ
(後述) が変化するので、値のチェック等に用いられる。
MOVF address, W :MOVFW address と同じ 。
–3–
4 アセンブラの定石処理
ループ、条件判定、サブルーチン呼び出し 、ビット演算等の、アセンブラでプログラムを作成する際
の定石的な処理について説明する。
4.1 ループ
ループ処理で良く使われる命令を以下で説明し 、ループ処理のプログラム例および処理の流れを図 3
に示す。
GOTO label :(GO TO) label の付けられた命令にジャンプする。
DECFSZ address, F :(DECrement File-register & Skip if Zero) ファイルレジスタ address の内容を −1
し 、結果が 0 なら次の命令を実行しない (非 0 なら実行する)。
DECFSZ address, W :(DECrement File-register & Skip if Zero) ファイルレジスタ address の内容を −1
したものを W に転送し (ファイルレジスタの内容は変化しない) 、結果が 0 なら次の命令を実行し
ない (非 0 なら実行する)。
4.2
条件判定 (ビット 検査)
条件判定 (ビット検査) でよく使われる命令を以下で説明し 、条件判定 (ビット検査) のプログラム例お
よび処理の流れの様子を図 4 に示す。
BTFSC address, bit :(Bit Test File-register & Skip if Cleared) ファイルレジスタ address の第 bit ビット
を調べ、0 なら次の命令をスキップする (1 なら実行)。
BTFSS address, bit :(Bit Test File-register & Skip if Set) ファイルレジスタ address の第 bit ビットを調
べ、1 なら次の命令をスキップする (0 なら実行)。
4.3
条件判定 (大小比較)
大小関係の比較を行うには、ゼロフラグ Z 、キャリーフラグ C を用いる。これらのフラグは、演算を
行った結果や、転送した値に応じて、以下のように自動的に変化する。フラグが変化しない命令もある。
どの命令を実行した時に、どのフラグが変化するかの詳細は、[1] pp. 34–38 、[2] pp. 90–111 を参照。
• 演算結果や転送した値が 0 → Z := 1
L A B E L 1
M O V L W
M O V W F
lo o p _ c o u n t
a d d re ss
lo o p _ c o u n t
D E C F S Z a d d re ss, F
G O T O L A B E L 1
図 3: ループ処理のブログラム例と処理の流れ
–4–
• 演算結果や転送した値が非 0 → Z := 0
• 足し算時に桁溢れ有り → C := 1
• 足し算時に桁溢れ無し → C := 0
• 引き算時に桁借り有り → C := 0
• 引き算時に桁借り無し → C := 1
これらのフラグを用いて条件判定 (大小比較) を行う際によく用いる命令を以下で説明し 、条件判定 (大
小比較) のプログラム例および処理の流れの様子を図 5 に示す。
BZ label :(Branch if Zero) Z = 1 なら label へジャンプ。
BNZ label :(Branch if Not Zero) Z = 0 なら label へジャンプ。
BC label :(Branch if Carry) C = 1 なら label へジャンプ。
BNC label :(Branch if Not Carry) C = 0 なら label へジャンプ。
SKPZ label :(SKiP if Zero) Z = 1 なら次の命令をスキップ。
SKPNZ, SKPC, SKPNC :同様。
B T F S S P O R T A , 4
G O T O L A B E L 1
if ( P O R T A
G O T O
} e ls e {
L A B E L 2
L A B E L 1
}
L A B E L 2
図 4: 条件判定 (ビットテスト ) のプログラム例と処理の流れ
M O V F W A
S U B W F B
B C L A B E L 1
G O T O
if ( A > B ) {
} e ls e {
L A B E L 2
L A B E L 1
}
L A B E L 2
図 5: 条件判定 (大小比較) のプログラム例と処理の流れ
–5–
4
1 ) {
4.4 サブルーチン呼び出し
サブルーチン呼び出しでよく使われる命令を以下で説明し 、サブルーチン呼び出しのプログラム例お
よび処理の流れの様子を図 6 に示す。
CALL label :(CALL) 現在のプログラム実行アドレスをスタックに記憶した上で、label の付けられた命
令にジャンプする。
RETURN :(RETURN) スタックに記憶されている、前のプログラム実行アドレスに戻って、CALL の
次の命令から実行。
• ループや条件分岐には GOTO を使う。サブルーチンは CALL で呼び出し 、RETURN で戻る。
• スタックの深さは 8 段あり、8 回まで入れ子状に CALL する (サブルーチンの中で他のサブルーチ
ンを呼びだす) ことが可能。再帰呼び出しも可能。
• CALL で呼び出して、GOTO で戻ってはいけない。GOTO で呼び出して、RETURN で戻ってもい
けない。
4.5 ビット 演算
1 ワード のうち、一部のビットのみを取り出したい、あるいは一部のビットのみに書き込みたいといっ
た場合がある。このような場合には、以下のビット演算命令が役に立つ。
ANDLW value :(AND Literal and Working-register) 各ビット毎に定数 value とワーキングレジスタ W の
論理積を求め、ワーキングレジスタに代入する。
例えば 、W = 0AAH の時に ANDLW 0FH を実行すると、W = 0AH となる。
ANDWF, COMF, IORLW, IORWF, NEGF, XORLW, XORWF, RLF, RRF, SWAPF :[1] pp. 34–38 、[2] pp. 90–
111 を参照。
5 プログラム実行時間の計算方法
アセンブラでは、以下の式によりプログラム実行時間を計算することができる。
プログラム実行時間 = クロック周期 × クロックサイクル数
L A B E L 1
C A L L
L A B E L 2
G O T O
L A B E L 1
L A B E L 2
R E T U R N
図 6: サブルーチン呼び出しのプログラム例と処理の流れ
–6–
クロック周期はセラロック発振子の発振周波数で決まり、実験で用いるセラロック発振子では約 10MHz
である。各命令のクロックサイクル数は、[2] pp. 90–111 に記載されている。大半の命令が 1 クロックサ
イクルで実行されるが 、分岐命令などの一部の命令は 2 クロックサイクル必要である。
参考文献
[1] トランジスタ技術編集部 編, 「 ECB No.4 特集 PIC マイコンを使おう」, CQ 出版, 2000.
[2] 後閑哲也, 「電子工作の為の PIC 活用ガ イド 」, 技術評論社, 2000.
–7–