1. PIC とは PIC とはその 挙 動 をプログラムできる IC のことである Peripheral Interface Controller の 略 でコン ピュータの 周 辺 機 器 の 接 続 部 分 をコントロールするために 開 発 されたマイクロコントローラである 開 発 元 は Microchip Tecnology Inc. 社 で PIC とは 同 社 の PICmicro(R)マイクロコントローラを 指 す PIC は 内 部 的 には 小 規 模 なコンピュータで IC のパッケージ 内 に 演 算 装 置 やデータメモリ プログ ラムメモリ 等 が 内 蔵 されている 本 実 験 では PIC16F84A という PIC を 用 いる PIC16F84A 外 観 1
2. アーキテクチャ 概 要 PIC16F8x ファミリは 命 令 語 長 14bit の RISC[1]で 命 令 は35 種 類 である 1 命 令 は4クロックで 実 行 されるが 実 際 にはパイプライン 処 理 [2]されている ノイマン 型 コンピュータ[3]と 違 いプログラムとデータは 別 々の 記 憶 装 置 に 格 納 される (これをハー バードアーキテクチャという ) PIC16F84A のプログラムメモリはフラッシュメモリで 1K ワード データメモリは SRAM で 0x0C 番 地 からの 68 バイトを 汎 用 レジスタとして 使 用 することが 出 来 る データメモリの 0~0x0B 番 地 まで 0x80~0x9B 番 地 までの 24 個 のレジスタは 特 殊 機 能 レジスタと 呼 ばれプログラムカウンタやフラグ レジスタなどとして 予 約 されている アドレッシングは 基 本 的 に 即 値 であるが 間 接 アドレッシングも 可 能 である ALU は 加 算 減 算 ビットごとの 包 括 的 排 他 的 論 理 和 論 理 積 左 右 ローテート 等 が 可 能 である 演 算 はワーキングレジスタ(アキュムレータ)と 汎 用 レジスタとの 間 で 行 われ 結 果 の 格 納 はそのど ちらかを 指 定 する ワーキングレジスタはアドレッシング 出 来 ない スタックとして 13bit 8 段 のハードウェアスタックが 搭 載 されているが サブルーチンコールや 割 り 込 み 時 の 戻 り 番 地 を 格 納 することのみに 使 用 される スタックはアドレッシング 出 来 ない I/O ポートは 5bit の PORTA と 8bit の PORTB の 二 つがあり ビット(ピン)ごとに 入 力 出 力 モード を 設 定 可 能 である 両 ポートはレジスタであり 特 殊 機 能 レジスタに 配 置 されている 割 り 込 み 機 能 があり 割 り 込 み 要 因 として 外 部 ポート B 変 化 タイマーオーバーフロー EEPROM 書 き 込 み 終 了 の4 種 類 がある 割 り 込 みベクタ[4]はどの 割 り 込 みでも 0x04 番 地 で 固 定 である 2
PIC16F8x ブロック 図 3
3. メモリ 構 成 3.1 データメモリ 構 成 以 下 に PIC16F84A のデータメモリ 構 成 を 示 す PIC16F84A のデータメモリ 構 成 PIC16F84A のデータメモリは 128 バイトのバンク0とバンク1に 分 割 されている これは PIC16F84A のデータメモリアドレスバスが 8 ビットであるためである バンクを 切 り 替 えるとことで 0x7F 番 地 より 大 きなメモリにアクセスすることが 出 来 る バンクの 切 り 替 えは 特 殊 機 能 レジスタによって 行 う 1つのバンクは 128 バイトだが 図 1.3.1 を 見 て 解 る 通 り 各 バンクの 0x50 番 地 以 降 は 実 装 されてい ない また バンク1の 0x0C 番 地 以 降 はバンク0の 0x0C 番 地 にマッピングされており バンク0と 同 じ 値 がリードされる 4
3.2 特 殊 機 能 レジスタ データメモリの 各 バンクの 最 初 の12 個 のレジスタは 特 殊 機 能 レジスタである このうち 重 要 なレジ スタを 次 に 解 説 する 3.2.1 STATUS レジスタ bank0 0x03 番 地 演 算 のフラグレジスタとバンク 選 択 bit7 bit0 IRP RP1 RP0 TO PD Z DC C 名 称 bit7 IRP バンク 選 択 ビット bit6 RP1 バンク 選 択 ビット bit5 RP0 バンク 選 択 ビット 0 = バンク0 1 = バンク1 bit4 TO タイムアウトビッ ト bit3 PD パワーダウンビッ ト 不 使 用 クリアされているものとする 説 明 1 = 電 源 ON 後 CLRWT 命 令 または SLEEP 命 令 の 実 行 後 0 = WDT タイムアウト 発 生 1 = 電 源 ON 後 または CLRWDT 命 令 による 0 = SLEEP 命 令 の 実 行 による bit2 Z ゼロビット 1 = 計 算 またはロジック 演 算 の 結 果 がゼロ 0 = 計 算 またはロジック 演 算 の 結 果 がゼロでない bit1 DC デジットキャリー ビット 1 = 結 果 により 下 位 4 ビット 目 からキャリーが 発 生 した 0 = 結 果 により 下 位 4 ビット 目 からキャリーが 発 生 しなかった bit0 C キャリービット 1 = 結 果 により 最 上 位 ビットからキャリーが 発 生 した 0 = 結 果 により 最 上 位 ビットからキャリーが 発 生 しなかった 5
3.2.2 OPTION_REG レジスタ bank1 0x8C 番 地 周 辺 機 能 の 使 用 不 使 用 およびユーティリティ bit7 bit0 RBPU INTEDG T0CS T0SE PSA PB2 PS1 PS0 名 称 bit7 RBPU PORT B プル アップイネーブ ルビット bit6 INTEDG 割 り 込 みエッジ 選 択 ビット bit5 T0CS TMR0 クロック ソース 選 択 ビッ ト 説 明 1 = PORTB プルアップを 使 用 しない 0 = PORTB プルアップを 使 用 する 1 = RB0/INT ピンの 立 ち 上 がりエッジにより 割 り 込 み 0 = RB0/INT ピンの 立 ち 下 がりエッジにより 割 り 込 み 1 = RA4/T0CKI ピンの 入 力 0 = 内 部 命 令 サイクルクロック (CLKOUT) bit4 T0SE TMR0 ソースエッ1 = RA4/T0CKI ピンの 入 力 が High から Low でインクリメント ジ 選 択 ビット 0 = RA4/T0CKI ピンの 入 力 が Low から High でインクリメント bit3 PSA プリスケーラ 割 り 当 てビット bit2 bit1 bit0 PB2 PS1 PS0 1 = プリスケーラは WDT へ 割 り 当 て 0 = プリスケーラは TMR0 へ 割 り 当 て プリスケーラレー 000 = 1:2 / 1:1 ト 選 択 ビット 001 = 1:4 / 1:2 010 = 1:8 / 1:4 011 = 1:16 / 1:8 100 = 1:32 / 1:16 101 = 1:64 / 1:32 110 = 1:128 / 1:64 111 = 1:256 / 1:128 (TMR0 レート/WDT レート) 6
3.2.3 INTCON レジスタ bak0 0x0B 番 地 および bank1 0x8B 番 地 割 り 込 み 許 可 不 許 可 および 割 り 込 みフラグ bit7 bit0 GIE EEIE T0IE INTE RBIE T0IF INTF RBIF 名 称 bit7 GIE グローバル 割 り 込 みイネー ブルビット bit6 EEIE EE ライト 完 了 割 り 込 みイネー ブルビット 説 明 1 = すべてのマスクされていない 割 り 込 み 発 生 を 許 可 する 0 = 全 ての 割 り 込 み 発 生 を 禁 止 する 1 = EE ライト 完 了 割 り 込 み 発 生 を 許 可 する 0 = EE ライト 完 了 割 り 込 み 発 生 を 禁 止 する bit5 T0IE TMR0 オーバー 1 = TMR0 割 り 込 み 発 生 を 許 可 する フロー 割 り 込 0 = TMR0 割 り 込 み 発 生 を 禁 止 する みイネーブル ビット bit4 INTE RB0/INT 割 り 込 みイネーブ ルビット bit3 RBIE RB ポート 変 化 割 り 込 みイネー ブルビット 1 = RB0/INT 割 り 込 み 発 生 を 許 可 する 0 = RB0/INT 割 り 込 み 発 生 を 禁 止 する 1 = RB ポート 変 化 割 り 込 み 発 生 を 許 可 する 0 = RB ポート 変 化 割 り 込 み 発 生 を 禁 止 する bit2 T0IF TMR0 オーバー 1 = TMR0 がオーバーフローした(ソフトウェアでクリア 要 ) フロー 割 り 込 0 = TMR0 がオーバーフローしていない みフラグビット bit1 INTF RB0/INT 割 り 込 みフラグビッ ト bit0 RBIF RB ポート 変 化 割 り 込 みフラグ ビット 1 = RB0/INT 割 り 込 みが 発 生 した(ソフトウェアでクリア 要 ) 0 = RB0/INT 割 り 込 みが 発 生 していない 1 = 少 なくとも 1 つ 以 上 の RB7:RB4 ピンの 状 態 が 変 化 した (ソフトウェアでクリア 要 ) 0 = 状 態 が 変 化 した RB7:RB4 ピンはない 7
3.2.4 FSR,INDF レジスタ 間 接 アドレッシングに 使 用 INDF レジスタへのアクセスは FSR レジスタの 値 の 番 地 のレジスタへのアクセスとなる 3.2.4.1 FSR レジスタ bank0 0x04 番 地 および bank1 0x84 番 地 3.2.4.2 INDF レジスタ bank0 0x00 番 地 および bank1 0x80 番 地 尚 物 理 的 には 存 在 しない 8
4. 命 令 セット PIC16Cxx ファミリの 命 令 セットの 命 令 は 35 種 類 で 共 通 である 4.1 命 令 セット サマリ ニーモニック 説 明 命 令 サイクル 影 響 されるステータス バイト 対 応 のファイルレジスタ 命 令 ADDWF f,d Add W and f 1 C,DC,Z ANDWF f,d AND W with f 1 Z CLRF f Clear f 1 Z CLRW - Clear W 1 Z COMF f,d Complement f 1 Z DECF f,d Decrement f 1 Z DECFSZ f,d Decrement f, Skip if zero 1(2) - INCF f,d Increment f 1 Z INCFSZ f,d Increment f, Skip if zero 1(2) - IORWF f,d Inclusive OR W with f 1 Z MOVF f,d Move f 1 Z MOVWF f Move W to f 1 - NOP - No Operation 1 - RLF f,d Rotate Left f through Carry 1 C RRF f,d Rotate Right f throught Carry 1 C SUBWF f,d Subtract W from f 1 C,DC,Z SWAPF f,d Swap nibbles in f 1 - XORWF f,d Exclusive OR W with f 1 Z ビット 対 応 のファイルレジスタ 命 令 BCF f,b Bit Clear f 1 - BSF f,b Bit Set f 1 - BTFSC f,b Bit Test f, Skip if Clear 1(2) - BTFSS f,b Bit Test f, Skip if Set 1-9
ニーモニック 説 明 命 令 サイクル 影 響 されるステータス リテラルおよびコントロール 命 令 ADDLW k Add literal and W 1 C,DC,Z ANDLW k AND literal with W 1 Z CALL k Call subroutine 2 - CLRWDT - Clear Watchdog Timer 1 ~TO,~PD GOTO k Go to address 2 - IORLW k Inclusive OR literal with W 1 Z MOVLW k Move literal to W 1 - RETFIE - Return from interrupt 2 - RETLW k Return with literal in W 2 - RETURN - Return from Subroutine 2 - SLEEP - Go into srandly mode 1 ~TO,~PD SUBLW k Subtract W from literal 1 C,DC,Z XORLW k Exclusive OR literal with W 1 Z 記 号 の 読 み 方 W : ワーキングレジスタ(working registor) f : ファイルレジスタ(file registor)の 即 値 アドレス d : 格 納 先 (distination) 0 = W, 1 = f b : 桁 k : リテラル 10
4.2 命 令 セット 詳 説 ADDLW Add Literal and W 構 文 : [label] ADDLW k オペランド : 0 k 255 操 作 : (W) + k (W) 影 響 フラグ : C, DC, Z 説 明 : W レジスタの 内 容 を 8 ビットのリテラル "k" に 加 え この 結 果 を W レジスタに ライトする ADDWF Add W and f 構 文 : [label] ADDWF f,d d {0,1} 操 作 : (W) + f (distination) 影 響 フラグ : C, DC, Z 説 明 : W レジスタの 内 容 をレジスタ "f" に 加 える この 結 果 を d=0 であれば W ANDLW レジスタに d=1 であればレジスタ"f" にライトする AND Literal with W 構 文 : [label] ANDLW k オペランド : 0 k 255 操 作 : (W) AND k (W) 影 響 フラグ : Z 説 明 : W レジスタの 内 容 と 8 ビットのリテラル "k" の AND を 行 う この 結 果 を d=0 であれば W レジスタに d=1 であればレジスタ "f" にライトする ANDWF AND W with f 構 文 : [label] ANDWF f,d d [0,1] 操 作 : (W) AND f (distination) 影 響 フラグ : Z 説 明 : W レジスタとレジスタ "f" の AND を 行 う この 結 果 を d=0 であれば W レジ スタに d=1 であればレジスタ"f" にライトする 11
BCF Bit Clear f 構 文 : [label] BCF f,b 0 b 7 操 作 : 0 (f<b>) 説 明 : レジスタ "f" のビット "b" をクリアする BSF Bit Set f 構 文 : [label] BSF f,b 0 b 7 操 作 : 1 (f<b>) 説 明 : レジスタ "f" のビット "b" がセットする BTFSC Bit Test, Skip if Clear 構 文 : [label] BTFSC f,b 0 b 7 操 作 : skip if (f<b>) = 0 説 明 : レジスタ "f" のビット "b" が 1 の 場 合 次 の 命 令 を 実 行 する ビット "b" が 0 の 場 合 は 次 の 命 令 を 破 棄 して かわりに NOP を 実 行 する 2 サイクル 命 令 になる (2) BTFSS Bit Test f, Skip if Set 構 文 : [label] BTFSS f,b 0 b 7 操 作 : skip if (f<b>) = 1 説 明 : W レジスタ "f" のビット "b" が 0 の 場 合 次 の 命 令 を 実 行 する "b" が 1 の 場 合 は 次 の 命 令 を 破 棄 して かわりに NOP を 実 行 する 2 サイクル 命 令 になる (2) 12
CALL Call Subroutine 構 文 : [label ] CALL k オペランド : 0 k 2047 操 作 : (PC) + 1 TOS, k PC<10:0>, (PCLATH<4:3>) PC<12:11> 説 明 : サブルーチンをコールする まず リターンアドレス (PC+1) をスタック にプッシュして 11 ビットのリテラルアドレスを PC のビット <10:0> に ロードする PC の 上 位 ビットは PCLATH からロードする CALL は 2 サイクルの 命 令 です 命 令 サイクル : 2 CLRF Clear f 構 文 : [label] CLRF f 操 作 : 00h (f) 1 Z 影 響 フラグ : Z 説 明 : レジスタ "f" の 内 容 をクリアして Z ビットをセットする CLRW Clear W 構 文 : [label] CLRW オペランド : なし 操 作 : 00h (W) 1 Z 影 響 フラグ : Z 説 明 : W レジスタをクリアして Z ビットをセットする 13
CLRWDT Clear Watchdog Timer 構 文 : [label] CLRWDT オペランド : なし 操 作 : 00h WDT 0 WDT prescaler, 1 TO 1 PD 影 響 フラグ : TO, PD 説 明 : CLRWDT 命 令 は WDT をリセットする また WDT のプリスケーラもリ セットする ステータス ビット TO および PD をセットする COMF Complement f 構 文 : [label] COMF f,d d [0,1] 操 作 : (f) (destination) 影 響 フラグ : Z 説 明 : レジスタ "f" の 内 容 の 補 数 をとる この 結 果 を d=0 であれば W レジ スタに d=1 であればレジスタ "f" にライトする DECF Decrement f 構 文 : [label] DECF f,d d [0,1] 操 作 : (f) - 1 (destination) 影 響 フラグ : Z 説 明 : レジスタ "f" をデクリメントする この 結 果 を d=0 であれば W レジスタ に d=1 であればレジスタ "f" にライトする DC に 影 響 しない 点 に 注 意 14
DECFSZ Decrement f, Skip if 0 構 文 : [label] DECFSZ f,d d [0,1] 操 作 : (f) - 1 (destination); skip if result = 0 説 明 : レジスタ "f" をデクリメントする この 結 果 を d=0 であれば W レジスタ (2) GOTO に d=1 であればレジスタ "f" にライトする 結 果 が 1 の 場 合 は 次 の 命 令 を 実 行 する 結 果 が 0 の 場 合 は 次 の 命 令 を 破 棄 かわりに NOP を 実 行 して 2 サイクル 命 令 になる Unconditional Branch 構 文 : [label] GOTO k オペランド : 0 k 2047 操 作 : k PC<10:0> PCLATH<4:3> PC<12:11> 説 明 : GOTO は 無 条 件 の 分 岐 命 令 11 ビットのリテラルアドレスを PC のビット <10:0> にロードする PC の 上 位 ビットへは PCLATH <4:3> をロードする GOTO は 2 サイクルの 命 令 である 命 令 サイクル : 2 INCF Increment f 構 文 : [label] INCF f,d d [0,1] 操 作 : (f) + 1 (destination) 影 響 フラグ : Z 説 明 : レジスタ "f" の 内 容 をインクリメントする この 結 果 を d=0 であれば W レジス タに d=1 であればレジスタ"f" にライトする C に 影 響 しない 点 に 注 意 15
INCFSZ Increment f, Skip if 0 構 文 : [label] INCFSZ f,d d [0,1] 操 作 : (f) + 1 (destination), skip if result = 0 説 明 : レジスタ "f" の 内 容 をインクリメントする この 結 果 を d=0 であれば W レジス タに d=1 であればレジスタ"f" にライトする 結 果 が 1 の 場 合 は 次 の 命 令 を 実 行 する 結 果 が 0 の 場 合 は 次 の 命 令 を 破 棄 かわりに NOP を 実 行 し て 2 サイクル 命 令 になる (2) IORLW Inclusive OR Literal with W 構 文 : [label] IORLW k オペランド : 0 k 255 操 作 : (W).OR. k (W) 影 響 フラグ : Z 説 明 : W レジスタの 内 容 と 8 ビットのリテラル 'k' の OR を 行 う この 結 果 を W レジ スタにライトする IORWF Inclusive OR W with f 構 文 : [label] IORWF f,d d [0,1] 操 作 : (W).OR. (f) (destination) 影 響 フラグ : Z 説 明 : W レジスタとレジスタ "f" の OR を 行 う この 結 果 を d=0 であれば W レジス タに d=1 であればレジスタ"f" にライトする 16
MOVF Move f 構 文 : [label] MOVF f,d d [0,1] 操 作 : (f) (destination) 影 響 フラグ : Z 説 明 : レジスタ "f" の 内 容 を 結 果 格 納 先 "d" に 移 動 する d=0 であれば 結 果 格 納 先 は W レジスタである d=1 であれば 結 果 格 納 先 は 同 じファイルレジスタ"f" である d=1 は ステータスフラグ Z が 影 響 するので ファイル レジスタのテ ストに 便 利 MOVLW Move Literal to W 構 文 : [label] MOVLW k オペランド : 0 k 255 操 作 : k (W) 説 明 : 8 ビットのリテラル 'k' を W レジスタにロードする "xx" は "00" とアセンブル される MOVWF Move W to f 構 文 : [label] MOVWF f 操 作 : (W) (f) 説 明 : W レジスタからレジスタ "f" にデータを 移 動 する NOP No Operation 構 文 : [label] NOP オペランド : なし 操 作 : No operation 説 明 : 何 も 行 いません 17
RETFIE Return from Interrupt 構 文 : [label] RETFIE オペランド : なし 操 作 : TOS PC, 1 GIE 説 明 : 割 り 込 みからの 復 帰 スタックをポップして スタックの 最 上 位 (TOS) を PC にロードする GIE ( グローバル 割 り 込 みイネーブル) ビットをセットして 割 り 込 みをイネーブルにする(lNTCON<7>) 2 サイクル 命 令 命 令 サイクル : 2 RETLW Return with Literal in W 構 文 : [label] RETLW k オペランド : 0 k 255 操 作 : k (W); TOS PC 説 明 : 8 ビットのリテラル 'k' を W レジスタにロードして スタックの 最 上 位 (リターン アドレス) をプログラムカウンタへロードする 2 サイクル 命 令 命 令 サイクル : 2 RETURN Return from Subroutine 構 文 : [label] RETURN オペランド : なし 操 作 : TOS PC 説 明 : サブルーチンからの 復 帰 スタックをポップして 次 にスタックの 最 上 (TOS) をプログラムカウンタにロードする 2 サイクルの 命 令 命 令 サイクル : 2 18
RLF Rotate Left f through Carry 構 文 : [label] RLF f,d d [0,1] 操 作 : See description below 影 響 フラグ : C 説 明 : レジスタ "f" の 内 容 をキャリーフラグを 通 して 1 ビット 左 に 回 転 する この 結 果 を d=0 であれば W レジスタに d=1 であればレジスタ "f" にライトする RRF Rotate Right f through Carry 構 文 : [label] RRF f,d d [0,1] 操 作 : See description below 影 響 フラグ : C 説 明 : レジスタ "f" の 内 容 をキャリーフラグを 通 して 1 ビット 右 に 回 転 する この 結 果 を d=0 であれば W レジスタに d=1 であればレジスタ "f" にライトする SLEEP 構 文 : [label] SLEEP オペランド : なし 操 作 : 00h WDT, 0 WDT prescaler, 1 TO, 0 PD 影 響 フラグ : TO, PD 説 明 : パワーダウンステータスビット(PD)をクリア タイムアウトステータスビット (TO) をセット ウォッチドッグタイマとそのプリスケーラをクリアする プロセッサは SLEEP モードに 入 る オシレータは 停 止 する 詳 細 は 14.8 項 を 参 照 19
SUBLW Subtract W from Literal 構 文 : [label] SUBLW k オペランド : 0 k 255 操 作 : k - (W) (W) 影 響 フラグ : C, DC, Z 説 明 : 8 ビットのリテラル "k" から W レジスタの 内 容 を 引 く (2 の 補 数 法 ) この 結 果 を W レジスタにライトする SUBWF Subtract W from f 構 文 : [label] SUBWF f,d d [0,1] 操 作 : (f) - (W) (destination) 影 響 フラグ : C, DC, Z 説 明 : レジスタ "f" から W レジスタの 内 容 を 引 く (2 の 補 数 法 ) この 結 果 を d=0 であれば W レジスタに d=1 であればレジスタ "f" にライトする SWAPF Swap Nibbles in f 構 文 : [label] SWAPF f,d d [0,1] 操 作 : (f<3:0>) (destination<7:4>), (f<7:4>) (destination<3:0>) 説 明 : レジスタ "f" の 上 位 ニブルと 下 位 ニブルを 入 れ 替 える この 結 果 を d=0 で あれば W レジスタに d=1 であればレジスタ "f" にライトする XORLW Exclusive OR Literal with W 構 文 : [label] XORLW k オペランド : 0 k 255 操 作 : (W).XOR. k (W) 影 響 フラグ : Z 説 明 : W レジスタの 内 容 と 8 ビットのリテラル "k" との XOR をとり その 結 果 を W レジスタにライトする 20
XORWF Exclusive OR W with f 構 文 : [label] XORWF f,d d [0,1] 操 作 : (W).XOR. (f) (destination) 影 響 フラグ : Z 説 明 : W レジスタの 内 容 とレジスタ "f" との XOR をとる この 結 果 を d=0 であれ ば W レジスタに d=1 であればレジスタ "f" にライトする 21
5. I/O ポート PIC16F84A には 5bit の PORTA と 8bit の PORTB の2つの 入 出 力 ポートがある ここではそれぞ れの 特 性 および 使 い 方 について 記 述 する 5.1 PORTA PORTA は 5bit の 入 出 力 ポートである 対 応 するレジスタは bank0 0x05 番 地 の PORTA レジスタ である PORTA レジスタの 上 位 3bit は 0 としてリードされる PORTA は IC の 1 番 2 番 3 番 18 番 17 番 ピンにあたる ピン 名 称 はそれぞれ RA0 RA1 RA2 RA3 RA4 である RA4 はオープンドレイン[5]なので 他 の 4 つのピンのように 出 力 に 使 うことは 出 来 ない 入 力 は 通 常 通 りに 使 用 できる RA4 は TMR0 の 外 部 クロックソース 入 力 として 使 用 できる( 後 述 ) PORTA を 使 う 前 に PORTA の 各 ピンの 入 出 力 設 定 をする 必 要 がある 入 出 力 設 定 は bank1 にあ る TRISA レジスタで 操 作 できる TRISA レジスタのビットが1になると 対 応 する PORTA ピンが 入 力 に 0 になると 出 力 となる アドレス bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0x05 - - - RA4 RA3 RA2 RA1 RA0 0x85 - - - TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 リセット 時 の PORTA レジスタの 値 は 不 定 TRISA レジスタの 値 は'11111'である 故 に PORTA を 出 力 として 使 う 前 には 初 期 化 する 必 要 がある 例 えば 以 下 のようにする bsf STATUS,RP0 ; 操 作 バンクを bank1 に 変 更 movlw B'00001' ; movwf TRISA ;RA0 以 外 を 入 力 に bcf STATUS,RP0 ; 操 作 バンクを 元 に 戻 す clrf PORTA ;PORTA 初 期 化 この 例 では RA0 を 入 力 に それ 以 外 を 出 力 に 設 定 した TRISA レジスタが bank1 にあるためバン ク 選 択 ビット(STATUS<5>)を 操 作 する 必 要 がある 後 は 通 常 のレジスタとしてリード/ライト 可 能 である 22
5.2 PORTB PORTB は 8bit の 入 出 力 ポートである 対 応 するレジスタは bank0 0x06 番 地 の PORTB レジスタで ある PORTA は IC の 6 番 ~13 番 ピンにあたる ピン 名 称 はそれぞれ RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 である RA4~RA7 の 4 つのピンが 入 力 で 値 が 変 化 すると PORTB 変 化 割 り 込 みが 発 生 する PORTA と 同 様 に PORTB を 使 う 前 には PORTB の 各 ピンの 入 出 力 設 定 をする 必 要 がある 入 出 力 設 定 は bank1 にある TRISB レジスタで 操 作 できる TRISA レジスタのビットが1になると 対 応 する PORTA ピンが 入 力 に 0 になると 出 力 となる アドレス bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0x06 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 0x86 TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 リセット 時 の PORTB レジスタの 値 は 不 定 TRISB レジスタの 値 は'11111111'である 故 に PORTB を 出 力 として 使 う 前 には 初 期 化 する 必 要 がある 例 えば 以 下 のようにする bsf STATUS,RP0 ; 操 作 バンクを bank1 に 変 更 movlw B'11110000' ; movwf TRISB ;PORTB 上 位 4ビットを 入 力 に bcf STATUS,RP0 ; 操 作 バンクを 元 に 戻 す clrf PORTB ;PORTB 初 期 化 この 例 では PORTB の 上 位 4 ビットを 入 力 に それ 以 外 を 出 力 に 設 定 した TRISB レジスタが bank1 にあるためバンク 選 択 ビット(STATUS<5>)を 操 作 する 必 要 がある 後 は 通 常 のレジスタとしてリード/ライト 可 能 である 23
6. 割 り 込 み PIC16F84A には 4 つの 割 り 込 み 要 因 がある 外 部 PORTB 変 化 TMR0 オーバーフロー EEPROM 書 き 込 み 終 了 の 4 つがそれである ここではそれぞれの 使 い 方 について 記 述 する 6.1 割 り 込 みとは 割 り 込 みとは 外 部 のイベントが 起 こったときにそれに 対 応 するルーチンを 呼 び 出 す 仕 組 みのこと である 外 部 のイベントとは ここでは RB0/INTE ピンが 変 化 する PORTB の 上 位 4 ビットが 変 化 する TMR0(タイマー)の 値 がオーバーフローする データ EEPROM を 書 き 込 み 終 わる 事 を 指 す 具 体 的 に PIC では 割 り 込 みが 発 生 するとプログラムカウンタ[6]に 0x04 という 値 がロードされる つ まり 割 り 込 みが 発 生 するとプログラムメモリの 0x04 番 地 以 降 の 命 令 が 実 行 される 戻 り 番 地 は 割 り 込 みが 起 こる 瞬 間 に 自 動 的 にスタックに 積 まれる 割 り 込 みの 重 要 な 点 は メインプログラムが 割 り 込 み 発 生 の 前 後 で 何 事 も 無 かったかのように 実 行 されることである これはメインプログラムでは 割 り 込 みの 発 生 を 意 識 する 必 要 が 無 いということであ る 割 り 込 みイベントが 命 令 の 実 行 中 に 起 こっても 実 際 に 割 り 込 みが 起 こるのはその 命 令 が 終 了 し た 後 である 上 図 では n 番 地 の 命 令 が 実 行 中 に 割 り 込 みが 発 生 したとしている この 場 合 n 番 地 の 命 令 が 実 行 されその 次 に 割 り 込 みハンドラが 実 行 され その 後 に n+1 番 地 の 命 令 が 実 行 される 6.2 共 通 何 らかの 割 り 込 みが 発 生 すると プログラムカウンタに 0x04 がロードされる 従 って プログラムメ モリの 0x04 番 地 から 割 り 込 みからのリターン 命 令 (retfie)までの 命 令 が 割 り 込 みハンドラとなる 割 り 込 みは 4 種 類 あるが 割 り 込 みベクタの 位 置 は 0x04 で 固 定 である 割 り 込 みハンドラには 以 下 の 実 行 内 容 が 必 要 である 割 り 込 み 発 生 の 不 許 可 ( 多 重 割 り 込 み 防 止 ) プログラムコンテキストの 退 避 ( 割 り 込 み 要 因 の 特 定 と 実 行 内 容 の 振 り 分 け) 24
割 り 込 みフラグのクリア 割 り 込 みサービス プログラムコンテキストの 復 帰 割 り 込 みからの 復 帰 割 り 込 み 発 生 の 不 許 可 とは それ 以 上 割 り 込 みが 発 生 しないようにすることである この 命 令 は 割 り 込 みハンドラの 最 初 つまり 0x04 番 地 にある 必 要 がある そのためには INTCON レジスタの GIE ビットをクリアする GIE ビットは 割 り 込 みグローバルイネー ブルビットと 呼 ばれ これが 0 なら 割 り 込 み 発 生 が 可 能 になり 1 なら 割 り 込 みが 発 生 しなくなる プログラムコンテキストの 退 避 復 帰 とはワーキングレジスタと STATUS レジスタの 内 容 をどこかに 保 存 することである 割 り 込 みハンドラ 内 でワーキングレジスタや STATUS レジスタを 変 化 させてし まうと メインプログラムの 動 作 に 影 響 が 出 てしまう そのため 割 り 込 みハンドラの 始 めの 方 でこれ らをどこかのレジスタへ 退 避 し 割 り 込 みから 復 帰 するときにこれを 復 帰 させることが 必 要 である 割 り 込 み 要 因 の 特 定 と 実 行 内 容 の 振 り 分 けとは どの 割 り 込 み 要 因 によって 割 り 込 みが 引 き 起 こさ れたか INTCON レジスタの 下 位 3ビット( 割 り 込 みフラグ)をテストして 特 定 し 割 り 込 み 要 因 に 応 じ た 処 理 へ 実 行 を 移 すことである 括 弧 付 きになっているのは プログラムによって 割 り 込 み 要 因 が1つに 特 定 されている 場 合 がある 為 である その 場 合 は 振 り 分 けの 必 要 は 無 い たいていの 場 合 全 ての 割 り 込 み 要 因 を 使 用 する ようなことは 無 い 割 り 込 みフラグのクリアとは INTCON レジスタの 下 位 3ビットの 割 り 込 みが 起 こったことを 示 すフラ グを 0 にしておくことである INTCON レジスタの 下 位 3ビットはそれぞれタイマー 割 り 込 み 発 生 フ ラグ T0IF(INTCON<3>) 外 部 割 込 み 発 生 フラグ INTF(INTOCN<1>) PORTB 変 化 割 り 込 み 発 生 フラグ RBIF(INTCON<0>)となっている これをクリアしておかないと 割 り 込 みから 復 帰 した 直 後 にまた 割 り 込 みハンドラへ 飛 んでしまう 割 り 込 みサービスとは 割 り 込 み 要 因 に 応 じた 処 理 のことである 割 り 込 みからの 復 帰 とは retfie 命 令 を 実 行 することである retfie 命 令 は 割 り 込 み 発 生 を 許 可 して スタックに 積 まれいている 戻 り 番 地 の 命 令 に 戻 ることである 即 ち INTCON レジスタの GIE ビット をセットして プログラムカウンタにスタックの 最 上 位 の 値 (TOS)をロードする 以 上 が 割 り 込 みハンドラの 基 本 的 な 流 れである 25
例 として 外 部 割 込 みが 発 生 するたびに PORTB レジスタをインクリメントするプログラムを 次 に 示 す include P16F84A.INC evac_w equ 0x0c ;ワーキングレジスタ 退 避 用 evac_status equ 0x0d ;STATUS レジスタ 退 避 用 goto start ; 割 り 込 みハンドラを 飛 ばす org 0x04 ; 割 り 込 みハンドラ ここから bcf INTCON,GIE ;GIE クリア movwf evac_w ; movf STATUS,W ;プログラムコンテキスト 退 避 mvowf evac_status ; incf PORTB ;PORTB インクリメント movf evac_status,w ; movwf STATUS ;プログラムコンテキスト 復 帰 movf evac_w,w ; retfie ; 割 り 込 みから 復 帰 start bsf STATUS,RP0 ; clrf TRISB ;PORTB を 出 力 設 定 に bcf STATUS,RP0 ; clrf PORTB ;PORTB 初 期 化 bsf INTCON,INTE ;INTE 割 り 込 み 許 可 bsf INTCON,GIE ;GIE セット lb0 goto lb0 ; 無 限 ループ end 26
6.3 外 部 割 込 み(INTE 割 り 込 み) 外 部 割 込 みは RB0/INTE ピン(6 番 ピン)が 変 化 したときに 発 生 する この 割 り 込 みを 許 可 するには INTCON レジスタの INTE ビット(INTCON<4>)をセットする 立 上 がりエッジ(Low High)で 割 り 込 むか 立 下 りエッジ(Hight Low)で 割 り 込 むかは OPTION_REG レジスタの INTEDG ビット(OPTION_REG<6>)で 設 定 できる INTEDG ビットが 1 なら 立 上 がり 0 なら 立 下 りエッジで 割 り 込 む INTE 割 り 込 みが 発 生 すると INTCON レジスタの INTF ビット(INTCON<1>)がセットされる INTF ビットは 割 り 込 みハンドラ 内 でクリアする 必 要 がある INTE 割 り 込 みは PIC をスリープ 状 態 から 起 動 することが 出 来 る 6.4 PORTB 変 化 割 り 込 み(RBIE 割 り 込 み) PORTB 割 り 込 みは RB7~RB4 のいづれかのピンが 変 化 すると 発 生 する 名 前 に 反 して PORTB の 下 位 4ビットの 変 化 では 発 生 しない 点 に 注 意 この 割 り 込 みを 許 可 するには INTCON レジスタ の RBIE ビット(INTCON<3>)をセットする RBIE 割 り 込 みが 発 生 すると INTCON レジスタの RBIF ビット(INTCON<0>)がセットされる RBIF ビットは 割 り 込 みハンドラ 内 でクリアする 必 要 がある 6.5 TMR0 オーバーフロー 割 り 込 み(T0IE 割 り 込 み) TMR0 オーバーフロー 割 り 込 みは TMR0 レジスタ(0x01 番 地 )がオーバーフローすると 発 生 する この 割 り 込 みを 許 可 するには INTCON レジスタの T0IE ビット(INTCON<5>)をセットする T0IE 割 り 込 みが 発 生 すると INTCON レジスタの T0IF ビット(INTCON<2>)がセットされる T0IF ビットは 割 り 込 みハンドラ 内 でクリアする 必 要 がある タイマー0については 後 述 する 6.6 データ EEPROM 書 き 込 み 完 了 割 り 込 み(EEIE 割 り 込 み) データ EEPROM の 書 き 込 みが 完 了 すると 発 生 する この 割 り 込 みを 許 可 するには INTCON レジ スタの EEIE ビット(INTCON<6>)をセットする この 割 り 込 みには 対 応 する 割 り 込 みフラグは 無 い データ EEPROM の 使 用 法 については 本 書 で は 解 説 しない PIC16F8x のデータシートを 参 照 されたし 7. TMR0 モジュール PIC16F84A には TMR0 モジュールというタイマ/カウンタが 搭 載 されている ここでは TMR0 モジュー ルの 使 い 方 について 記 述 する 7.1 概 要 TMR0 モジュールは 指 定 したクロックソースでカウントアップするタイマである クロックソースは RB4/CLKI のパルス 入 力 か 命 令 サイクルのどちらかを 選 択 できる タイマの 値 は bank0 0x01 番 地 TMR0 レジスタに 格 納 されている TMR0 がオーバーフローすると 割 り 込 みが 発 生 する これによって 一 定 時 間 ごとに 割 り 込 ませるこ とが 出 来 る 27
7.2 TMR0 モジュール 使 用 方 法 TMR0 モジュールのクロックソースはデフォルトで RA4/CLKI パルス 入 力 になっている TMR0 を 命 令 サイクルによってカウントアップしたい 場 合 は OPTION_REG レジスタの T0CS ビット (OPTION_REG<5>)を 0 にする プリスケーラを 使 用 するとクロックソースの 入 力 に 対 するカウントアップの 比 (これをプリスケーラレー トと 呼 ぶ)を 変 更 することが 出 来 る プリスケーラを 使 用 しない 場 合 クロックソースの 入 力 ごとにカウ ントアップする(1:1) プリスケーラの 割 り 当 ては OPTION_REG の~PSA ビット(OPTION_REG<3>)で 行 う ~PSA ビットを クリアすることでプリスケーラは TMR0 モジュールに 割 り 当 てられる ちなみにデフォルトではウォッ チドッグタイマに 割 り 当 てられている プリスケーラレートは OPTION_REG の PS2,PS1,PS0 ビット(OPTION_REG<2~0>)の3ビット 変 更 で きる つまり 8モードある 詳 しくはメモリ 構 成 を 見 よ 例 えばプリスケーラレートが 1:32 である 場 合 32 入 力 ごとに TMR0 レジスタがインクリメントされる この 場 合 32 x 256 = 8192 入 力 ごとに TMR0 オーバーフロー 割 り 込 みが 発 生 する この 場 合 は 以 下 のようにする bsf STATUS,RP0 ; 操 作 バンクを bank1 に 変 更 bcf OPTION_REG,T0CS;クロックソースを 命 令 サイクルに bsf OPTION_REG,PSA ;プリスケーラを 使 用 しない bsf OPTION_REG,PS2 ;モード 100 bcf OPTION_REG,PS1 ;プリスケーラレート 1:32 bcf OPTION_REG,PS0 ; bcf STATUS,RP0 ; 操 作 バンクを 元 に 戻 す bsf INTCON,T0IE ;T0IE 割 り 込 みのみ 許 可 bsf INTCON,GIE ;GIE セット clrf TMR0 ;タイマ 初 期 化 ここからカウント... 28
参 考 [1]RISC RISC(リスク)とは Reduced Instruction Set Computer( 縮 小 命 令 セットコンピュータ)の 略 で マイク ロプロセッサの 内 部 構 造 の 一 つである 制 御 命 令 の 数 を 減 らし 加 減 算 などの 単 純 な 処 理 の 組 み 合 わせによって 回 路 を 単 純 化 し 演 算 速 度 の 向 上 を 図 ろうとする 手 法 である (フリー 百 科 事 典 ウィキペディア (Wikipedia) http://ja.wikipedia.org/wiki/より) [2]パイプライン 処 理 ここで 言 うパイプラインとは 命 令 パイプラインのこと PIC16F84A では 命 令 の 実 行 と 次 の 命 令 の 取 り 出 しを 同 時 に 行 っている [3]ノイマン 型 コンピュータ 大 雑 把 に 言 ってプログラムとデータが 同 じアドレス 空 間 に 存 在 するコンピュータ 殆 どのコンピュー タは ノイマン 型 である [4] 割 り 込 みベクタ 割 り 込 みが 発 生 したときにプログラムカウンタにロードされる 値 同 様 にリセットベクタとは PIC がリ セットされたときにプログラムカウンタにロードされる 値 のこと [5]オープンドレイン この 場 合 FET のドレインが RA4 に 直 結 している ゲートが H の 時 ピンはグランドと 結 線 され ゲートが L の 時 ピンは Low となる [6]プログラムカウンタ PIC に 限 らずコンピュータはプログラムメモリ 上 にロードされている 機 械 語 を 取 り 出 しながら 実 行 し ている メモリには 言 うまでも 無 くアドレスがある プログラムカウンタとは 現 在 実 行 している 命 令 ( 機 械 語 )のアドレスを 格 納 しているレジスタである 命 令 を 一 つ 実 行 すると プログラムカウンタの 値 を 命 令 語 長 分 だけ 増 加 させて 次 の 命 令 のアドレ スとする PIC の 命 令 は 固 定 長 なので プログラムカウンタは1づつインクリメントされる 29