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–
© Copyright 2026 Paperzz