PICキット スタートマニュアル3
コンフィギュレーションレジスタ・コアレジスタ編
コンフィギュレーション レジスタ
英文マニュアルP48 4-2参照
PIC16F1705に限らずPICにはプログラマで書き込み時に設定する特殊なレジスタがあります。
これはプロフラムで書き換えはできず、1つのレジスタは1ワード(14bit)です。
よって、コンフィギュレーションワードと言い、PIC16F1705には2ワードあります。
これを指定しないと、PICはウンともスンとも言いません・・・・
内容は以下の通りで、プログラムの最初の方に記載します。(サンプル プログラム等参照)
(1)CONFIG1:コンフィギュレーションワード1
bit13 FCMEN:Fail Safe Clock Monitor(日本語マニュアルP67 5-5 フェイルセーフ クロックモニタ を参照)
1=有効
0=無効(通常はこっちでOK)
bit12 IESO:内部・外部オシレータ切替設定ビット
1=有効
0=無効(通常はこっちでOK)
bit11 /CLKOUTEN:クロックアウトイネーブルビット
1=無効 RA4I/O使用可
0=有効 FoscがCLKOUTピンに出力される
bit10-9 BOREN:ブラウンアウトリセット設定ビット(日本語マニュアルP78 7-2 BOR参照)
11=有効
10=スリープ時以外有効
01=BORCONレジスタで制御
00=無効(通常はこっちでOK)
bit8 /CPD:データメモリプロテクション
1=無効(通常はこれでOK)
0=有効
bit7 /CP:プログラムメモリプロテクション
1=無効(通常はこれでOK)
0=有効
bit6 /MCLRE:/MCLRE/Vppピン(RA3)機能選択ビット(日本語マニュアルP73 7-1 /MCLRE 参照)
LVPビット=1の場合、このビットは無視される
LVPビット=0の場合、
1=/MCLRE/Vppピンは/MCLRとして(外部リセット入力ピンとして)機能する
0=/MCLRE/Vppピンは/MCLR無効、RA3はデジタルインプットとして機能する
bit5 PWRTE:パワーアップタイマ
1=無効
0=有効(通常はこれでOK)
bit4-3 WDTE:ウオッチドッグタイマ イネーブルビット
11=有効
10=ランニング中に有効、スリープ中は無効
01=レジスタによるコントロール
00=無効(通常はこれでOK)
bit2-0 FOSC:発振器選択ビット
111=ECH 外部クロック入力(4-32MHZ)、RA4 I/O可
110=ECM 外部クロック入力(0.5-4MHZ)、RA4 I/O(0.5-4MHZ)、RA4 I/O可
101=ECL :外部クロック入力(0-0.5MHZ)RA4 I/O可
100=INTOSC 内部発振、RA4-RA5 I/O可
011=EXTRC 外部RC発振、RA4 I/O可、RA5 I/O不可
010=HS 外部発振子、RA4-RA5 I/O不可
001=XT 〃
000=LP 〃
;
(2)CONFIG2:コンフィギュレーションワード2
bit13 LPV:低電圧プログラミング設定
1=有効
0=無効、高電圧必要(通常はこっちでOK)
bit12 DEBUG:インサーキット・デバッガ モード設定
1=無効(通常はこっちでOK)
0=有効、RA0-1をデバッガに使用
bit11 Unimplemented(注1)
bit10 BORV:ブラウンアウト・リセット電圧選択ビット(日本語マニュアルP361 VBOR参照)
1=低電圧で動作(1.9V±0.1V)
0=高電圧で動作(2.7V±0.15V)
bit9 STVREN:スタック・オーバーフロー・リセット設定
1=有効
0=無効
bit8 PLLEN:PLL設定(注2)
1=4xPLL有効
0=4xPLL無効
bit7 ZCDDIS:ZCDディセーブルビット(注3)
1=ZCDを無効にする、ZCDCONで有効可(通常はこれでOK)
0=ZCDを常に有効にする
bit6-3 Unimplemented(注1)
bit2 PPS1WAY:PPSLOCKビット単方向セット・イネーブルビット
1=ロック解除シーケンスを実行後に1度だけ解除できる
0=ロック解除シーケンスを実行すると何度でも解除できる
bit1-0 WRT:フラッシュメモリ プロテクション設定
11=無効(通常はこれでOK)
10=000H-1FFH有効、200H-1FFFHはEECONで制御可
01=000H-3FFH有効、400H-1FFFHはEECONで制御可
00=000H-7FFH有効、EECONで制御不可
注1)
このビットは1を書き込む事、そうしないと書込み時ベリファイエラーが発生
実際は何を書き込んでも読み出し時は1となる
;
注2)PLLEN
1=有効にした場合、「OSCCON」レジスタ「SPLLEN」ビットは無視される
よって、通常は0=無効にしておいた方が使い勝手は良い
注3)ZCDDIS
ZCDを有効にした場合、ZCD I/Oピンの内部弱プルアップを無効にする必要がある
(3)記述(設定)方法
1)アッセンブラの場合
「_ _CONFIG」 疑似命令を使用します
①CONFIG疑似命令に続き、INCファイル(p16f1705.inc)に事前登録されているマクロを使用
_ _CONFIG _CONFIG1, _FCMEN_OFF & _IESO_OFF & ・・・・
_ _CONGIG _CONFIG2. _LPV_OFF & _DEBUG_OFF & ・・・・
②CONFIG疑似命令に続き、数値(2進、10進、16進等)で指定
この例では2進16bitで指定してますが、上位2bitは無視される
当局は好んでこちら方法で指定しています。
_ _CONFIG _CONFIG1, B’0000100110000100’
_ _CONFIG _CONFIG2, B’0001000011111011’
2)XC8の場合
① 「_ _CONFIG」命令を使用します
_ _CONFIG(FCMEN_OFF & IESO_OFF & ・・・・ );
②MPLABXIDEの自動生成機能を使用
a)ツールバーの「Window」をクリック
b)「PIC Memory View」のConfiguration Bits」をクリック
c)ウィンドウ上部バーの「Option」の各列の設定項目を指定
d)ウインドウ下部の「Generate Source Code to Output」ボタンをクリック
e)生成したコードをソースファイルにコピペ
英文マニュアルP48 4-2参照
PIC16F1705に限らずPICにはプログラマで書き込み時に設定する特殊なレジスタがあります。
これはプロフラムで書き換えはできず、1つのレジスタは1ワード(14bit)です。
よって、コンフィギュレーションワードと言い、PIC16F1705には2ワードあります。
これを指定しないと、PICはウンともスンとも言いません・・・・
内容は以下の通りで、プログラムの最初の方に記載します。(サンプル プログラム等参照)
(1)CONFIG1:コンフィギュレーションワード1
bit13 FCMEN:Fail Safe Clock Monitor(日本語マニュアルP67 5-5 フェイルセーフ クロックモニタ を参照)
1=有効
0=無効(通常はこっちでOK)
bit12 IESO:内部・外部オシレータ切替設定ビット
1=有効
0=無効(通常はこっちでOK)
bit11 /CLKOUTEN:クロックアウトイネーブルビット
1=無効 RA4I/O使用可
0=有効 FoscがCLKOUTピンに出力される
bit10-9 BOREN:ブラウンアウトリセット設定ビット(日本語マニュアルP78 7-2 BOR参照)
11=有効
10=スリープ時以外有効
01=BORCONレジスタで制御
00=無効(通常はこっちでOK)
bit8 /CPD:データメモリプロテクション
1=無効(通常はこれでOK)
0=有効
bit7 /CP:プログラムメモリプロテクション
1=無効(通常はこれでOK)
0=有効
bit6 /MCLRE:/MCLRE/Vppピン(RA3)機能選択ビット(日本語マニュアルP73 7-1 /MCLRE 参照)
LVPビット=1の場合、このビットは無視される
LVPビット=0の場合、
1=/MCLRE/Vppピンは/MCLRとして(外部リセット入力ピンとして)機能する
0=/MCLRE/Vppピンは/MCLR無効、RA3はデジタルインプットとして機能する
bit5 PWRTE:パワーアップタイマ
1=無効
0=有効(通常はこれでOK)
bit4-3 WDTE:ウオッチドッグタイマ イネーブルビット
11=有効
10=ランニング中に有効、スリープ中は無効
01=レジスタによるコントロール
00=無効(通常はこれでOK)
bit2-0 FOSC:発振器選択ビット
111=ECH 外部クロック入力(4-32MHZ)、RA4 I/O可
110=ECM 外部クロック入力(0.5-4MHZ)、RA4 I/O(0.5-4MHZ)、RA4 I/O可
101=ECL :外部クロック入力(0-0.5MHZ)RA4 I/O可
100=INTOSC 内部発振、RA4-RA5 I/O可
011=EXTRC 外部RC発振、RA4 I/O可、RA5 I/O不可
010=HS 外部発振子、RA4-RA5 I/O不可
001=XT 〃
000=LP 〃
;
(2)CONFIG2:コンフィギュレーションワード2
bit13 LPV:低電圧プログラミング設定
1=有効
0=無効、高電圧必要(通常はこっちでOK)
bit12 DEBUG:インサーキット・デバッガ モード設定
1=無効(通常はこっちでOK)
0=有効、RA0-1をデバッガに使用
bit11 Unimplemented(注1)
bit10 BORV:ブラウンアウト・リセット電圧選択ビット(日本語マニュアルP361 VBOR参照)
1=低電圧で動作(1.9V±0.1V)
0=高電圧で動作(2.7V±0.15V)
bit9 STVREN:スタック・オーバーフロー・リセット設定
1=有効
0=無効
bit8 PLLEN:PLL設定(注2)
1=4xPLL有効
0=4xPLL無効
bit7 ZCDDIS:ZCDディセーブルビット(注3)
1=ZCDを無効にする、ZCDCONで有効可(通常はこれでOK)
0=ZCDを常に有効にする
bit6-3 Unimplemented(注1)
bit2 PPS1WAY:PPSLOCKビット単方向セット・イネーブルビット
1=ロック解除シーケンスを実行後に1度だけ解除できる
0=ロック解除シーケンスを実行すると何度でも解除できる
bit1-0 WRT:フラッシュメモリ プロテクション設定
11=無効(通常はこれでOK)
10=000H-1FFH有効、200H-1FFFHはEECONで制御可
01=000H-3FFH有効、400H-1FFFHはEECONで制御可
00=000H-7FFH有効、EECONで制御不可
注1)
このビットは1を書き込む事、そうしないと書込み時ベリファイエラーが発生
実際は何を書き込んでも読み出し時は1となる
;
注2)PLLEN
1=有効にした場合、「OSCCON」レジスタ「SPLLEN」ビットは無視される
よって、通常は0=無効にしておいた方が使い勝手は良い
注3)ZCDDIS
ZCDを有効にした場合、ZCD I/Oピンの内部弱プルアップを無効にする必要がある
(3)記述(設定)方法
1)アッセンブラの場合
「_ _CONFIG」 疑似命令を使用します
①CONFIG疑似命令に続き、INCファイル(p16f1705.inc)に事前登録されているマクロを使用
_ _CONFIG _CONFIG1, _FCMEN_OFF & _IESO_OFF & ・・・・
_ _CONGIG _CONFIG2. _LPV_OFF & _DEBUG_OFF & ・・・・
②CONFIG疑似命令に続き、数値(2進、10進、16進等)で指定
この例では2進16bitで指定してますが、上位2bitは無視される
当局は好んでこちら方法で指定しています。
_ _CONFIG _CONFIG1, B’0000100110000100’
_ _CONFIG _CONFIG2, B’0001000011111011’
2)XC8の場合
① 「_ _CONFIG」命令を使用します
_ _CONFIG(FCMEN_OFF & IESO_OFF & ・・・・ );
②MPLABXIDEの自動生成機能を使用
a)ツールバーの「Window」をクリック
b)「PIC Memory View」のConfiguration Bits」をクリック
c)ウィンドウ上部バーの「Option」の各列の設定項目を指定
d)ウインドウ下部の「Generate Source Code to Output」ボタンをクリック
e)生成したコードをソースファイルにコピペ
コアレジスタ 日本語マニュアル P23 3-2-1 コアレジスタ
理解必須のコアレジスタはデータメモリのすべてのバンクの最初の12バイト、12種類存在します。
よって、バンクやアドレスを意識する事無くアクセス可能です。
その中でもWレジスタおよびSTATUSレジスタのフラグビット、これを理解しないとプログラムは作成できません、と言う位重要です。
(1)WREG Wレジスタ
CPU直属のメモリと言った感じで、ソースリストの数行に一度は出没する?と言われる程、使用頻度の最も高いレジスタです。
特に演算やデータ移動等ではWregを中心に行います。
例1)
MOVLW 0CH Wレジスタに0CHが入る
ANDLW 030H 定数論理積 Wレジスタの内容 AND 30H → Wレジスタに演算結果の0が入る
例2)
MOVLW 030H Wレジスタに30Hが入る
MOVWF WRK0 変数「WRK0」に30Hが入る
MOVLW 0CH WレジスタにCHが入る
ADDWF WRK0,F W+WRK0 の加算が行われ、その結果が「WRK0}に入り、WRK0=3CHとなる
例3)
-
CALL TABLE
CALL PUTW ;Wレジスタ内のアスキーコードをLCDに表示
-
-
TABLE
BRW PC(プログラムカウンタ)=PC+Wレジスタの数値
RETLW ’A’ ;W=0の時、W=41Hとなりリターンする
RETLW ’B’ ;W=1の時、W=42Hとなりリターンする
RETLW 043H ;W=3の時、W=43H
RETLW 044H ;W=4の時、W=44H
RETLW ’ア’ ;W=5の時、W=B1H
(2)STATUS ステータスレジスタ 日本語マニュアル P24参照
重要なレジスタのですが、理解必須なのは、その内の下位3ビットですので、大丈夫です。
bit2 Z ゼロビットフラグ 演算はWレジスタとRAMレジスタ、Wレジスタと直接数値等が対象となります。
演算とは、加算(ADD)・減算(SUB)・論理演算(AND等)がありますが、MOVF等の移動命令でも発動します。
演算の結果がゼロの場合[1]となり、演算の結果がゼロで無いなら、[0]となります。
bit1 DC デジット・キャリーフラグ マニュアル参照・・・ (定義が良く解らないので、超なげやり) (^_^;)
加算の結果、下位4bitの数値が桁上がりした場合、DC=1(Dキャリー発生)となります
具体的には、09H+06H=0FHでは、Z=0、DC=0、C=0
09H+07H=10Hでは、Z=0、DC=1、C=0 (Dキャリー発生)
09H+F6H=FFHでは、Z=0、DC=0、C=0
09H+F7H=100Hでは、Z=1、DC=1、C=1 (Dキャリー発生)
09H+F8H=101Hでは、Z=0、DC=1、C=1 (Dキャリー発生)
05H+F8H=FDHでは、Z=0、DC=0、C=0
39H+19H=52Hでは、Z=0、DC=1、C=0 (Dキャリー発生)
39H+F1H=2AHでは、Z=0、DC=0、C=1
減算の結果、下位4bitの数値が桁下がりした場合、DC=0(Dボロー発生)となります。
具体的には、12H-01H=11Hでは、Z=0、DC=1、C=1
12H-03H=0FHでは、Z=0、DC=0、C=1 (Dボロー発生)
12H-0FH=03Hでは、Z=0、DC=0、C=1 (Dボロー発生)
12H-10H=02Hでは、Z=0、DC=1、C=1
12H-11H=01Hでは、Z=0、DC=1、C=1
12H-12H=00Hでは、Z=1、DC=1、C=1
12H-13H=FFHでは、Z=0、DC=0、C=0 (Dボロー発生)
12H-45H=CDHでは、Z=0、DC=0、C=0 (Dボロー発生)
12H-D0H=42Hでは、Z=0、DC=1、C=0
38H-1AH=1EHでは、Z=0、DC=0、C=1 (Dボロー発生)
38H-41H=F7Hでは、Z=0、DC=1、C=0
この演算によるDCフラグの挙動を見ていると、上位4bitは見ていないと思われますが・・・
(シミュレータによるADDWFおよびSUBWF演算とその時のSTATUSレジスタ確認)
bit0 C キャリーフラグ ちょっと面倒なフラグで、他の命令とも絡みます。
演算(加算・減算)の場合
8ビット単位の加算の結果、桁上がり(キャリー)が発生すると、C=1 桁上がりが発生しないと、C=0
8ビット単位の減算の結果、桁下がり(ボロー)が発生すると、C=0 桁下がりが発生しないと、C=1
ロジカル・シフト命令の場合(日本語マニュアル P335)
LSLF命令の結果、操作RAMレジスタのbit7の内容がCフラグの内容となる 旧Cフラグの内容は破棄される
LSRF命令の結果、操作RAMレジスタのbit0の内容がCフラグの内容となる 旧Cフラグの内容は破棄される
ローテート命令の場合(日本語マニュアル P338、P339)
RLF命令の結果、操作RAMレジスタのbit7の内容がCフラグへ、
旧Cフラグの内容はレジスタのbit0の内容となる
RRF命令の結果、操作RAMレジスタのbit0の内容がCフラグへ、
旧Cフラグの内容はレジスタのbit7の内容となる
その他Cフラグが影響する命令
ASRF、ADDWFC、SUBWFB
演算詳細はここでは割愛します。
これは当局も犯した経験がありますが、INCFあるいはDECF命令等の場合、
Zフラグは反応しますがDCフラグおよびCフラグは反応しません
(3)BSR BSRレジスタ
レジスタRAMエリア(データRAMエリア)は128バイトのアドレスを持つ領域です。
そして、アドレス先頭順に、下記の様に配列しています。
000H~00BH コアレジスタ領域
00CH~01FH SFR(特殊機能レジスタ)領域
020H~06FH GPR(汎用データRAM)領域
070H~07FH 共通RAM領域
そして上記のレジスタRAM領域は、同様の構造の領域が32バンク存在します。
レジスタRAM領域へのPICアクセス命令のアドレス指定部分はbit0~bit6の7bit幅しかありません。
つまり、1命令コードでは00H~7FHまでのアクセスになります。
そのため、BSRレジスタでbit7よりbit11までの上部5bitを補完します。
すなわち、レジスタRAM領域のバンク切り替えを行うレジスタがBSRレジスタと言う事になります。
これにより、レジスタRAM領域は、000H~FFFHまでのアドレスをアクセス可能となっています。
BSRレジスタへのアクセス方法(例としてバンク2にする)
①
MOVLW 02H Wレジスタに02Hを書き込む
MOVWF BSR BSRレジスタに転送
②
MOVLB 02H BSRレジスタに02Hを転送
(4)PCLとPCLATH 日本語マニュアル P42 3-3
詳細はマニュアルの解説を読んでください
ここでは最低限の使用方法を記します
1)CALL命令とGOTO命令
PIC命令コードのジャンプ系、CALLとGOTOですが、命令コード内のジャンプ先アドレス指定bit幅は11bitの2Kワードです。
すなわち、0000H~07FFHのアドレス指定となります。
PC(プログラムカウンタ)は15bit幅で32Kワード、0000H~7FFFHまでのアドレスを認識します。
(PIC16F1705は000H~1FFFHまでの4ページ8Kワード)
そのため、PCLATHレジスタから不足分の4bitを補完して15bit幅にします。
PCは下位8bitのPCLと、上位7bitのPCHで構成され、PCLは直接アクセス可能です。
PCHはPCL書き込み時にPCLATHレジスタ(bit0-bit7)のbit3-bit6から4bit分を間接的にロードされます。
この4bit分はプログラムメモリのバンク指定と言う事になります。
よって、0800H以降のアドレスに存在するサブルーチンを呼び出すには、
PCLATHを使用して、バンクを指定してから、CALLすると言う事になります。
RETURN命令でCALLしたアドレスには自力で戻ってきますが、CALL時に切り替えたバンクは切り替わったままとなっています。
よって、CALL命令の直後にPCLATHを元に戻す必要があります。
例1) ページ2のアドレスに存在するサブルーチン「SUB01」をページ0のメインルーチンから呼び出す
MOVLP 010H ;ページ2→ 2×(2×2×2) ←カッコ内は左へ3ビットシフトするため
CALL SUB01
CLRF PCLATH ;ページ0
例2) 例1と同じ事をアッセンブラ疑似命令を使用して行う
MOVLW HIGH SUB01 ;これだとサブルーチンの存在ページを計算しないので楽
MOVWF PCLATH
CALL SUB01
CLRF PCLATH
以上より、ページ0にはメインルーチン、割込みルーチン、サブルーチンを配置
ページ1以降は基本的に固定データ、やむを得ない場合にサブルーチンも配置
と言った使い方になると思います。
2)BRA命令とプログラムカウンタ 日本語マニュアル P332
PICの命令コードの分岐系ですが、割と使いやすい命令です。
BRA命令コードの相対ジャンプ指定bit幅は符号付の9bitです。
BRA命令コードの存在アドレスは基本的に制限がない
3)BRW命令とプログラムカウンタ 日本語マニュアル P332
PICの命令コードの分岐系ですが、使いやすい命令です。
BRW命令コードの相対ジャンプ指定bit幅は符号無の8bitで、前進あるのみです。
BRW命令コードの存在アドレスは基本的に制限がない
この命令はPC(プログラムカウンタ)にWレジスタの内容が加算されます。
これはプログラムエリアに於いて、256バイトまでの小データテーブルを構成するのに最適な命令です
この命令コードの後にRETLW命令を並べるだけです。
(日本語マニュアル P22 3-1-1-1 RETLW命令 参照)
当局もこの方法は良く使用します。
(5)FSRとINDF 日本語マニュアル P23 間接アドレッシング
8KWのPIC16F1705のプログラムエリアに、広いデータテーブルを構成するのに有効な命令です。
FSRは16bitのレジスタで64Kバイトのアドレッシングが可能です。 (日本語マニュアル P46 図3-8参照)
FSRは2個あり、FSR0とFSR1となり、それぞれFSR0LとFSR0H、FSR1LとFSR1Hとに分かれます。
FSRnLレジスタとFSRnHレジスタにアクセスしたいアドレスを書き込みます。
そして、アクセスウインドウであるINDFnレジスタを通して間接的に8bitデータを読み書きします。
ただし、プログラムエリアは読込のみとなります。
1)プログラムエリアへのアクセス
プログラムエリア、0000H~7FFFHはFSRでは8000H~FFFFHとしてアドレッシングします。
プログラムエリアは1アドレス14bitですが、読込は下位8bitのみ可能で、データとして扱います。
プログラムエリアへの書き込みは、アッセンブラのDTあるいはDW疑似命令等、
8bitデータを14bitで書き込める命令を使います。
例1)
MOVLW HIGH TBL01 ラベルの上位8bitアドレス
MOVWF FSR1H
MOVLW LOW TBL01 ラベルの下位8bitアドレス
MOVWF FSR1L
MOVIW FSR0++ (INDF0)→Wreg、FSR0ポストインクリメント
CALL PUTW LCDにWregのデータを表示
・
・
TBL01 データテーブルのラベル(アドレス)
DT ”JA0QON”
DW 00H
(6)INTCONレジスタ 日本語マニュアル P93 8-5-1 INTCONレジスタ
割込み制御の重要なレジスタで、全体的な割込みON/OFFをします。
割込み源個別制御やフラグはそれぞれの対応レジスタで行います。
ここでは代表的なタイマ0(TIMER0)の基本的な扱い方を記載します。
INTCONレジスタ
bit7 GIE:グローバル割込みイネーブルビット
1=すべてのアクティブな割込みを有効にする
0=すべての割込みを無効にする
bit6 PEIE:周辺モジュール割込みイネーブルビット
1=すべてのアクティブな周辺モジュール割込みを有効にする
0=すべての周辺モジュール割込みを無効にする
bit5 TMR0IE:Timer0オーバーフロー割込みイネーブルビット
1=Timer0割込み有効
0=Timer0割込み無効
bit4 INTE:外部割込みイネーブルビット
1=すべてのアクティブな外部割込みを有効にする
0=すべての外部割込みを無効にする
bit3 IOCIE:状態変化割込みイネーブルビット
1=すべてのアクティブな状態変化割込みを有効にする
0=すべての状態変化割込みを無効にする
bit2 TMR0IF:Timer0オーバーフロー割込みフラグ
1=TMR0レジスタがオーバーフローした
0=TMR0レジスタがオーバーフローしていない
bit1 INTF:外部割込みフラグ
1=INT外部割込みが発生した
0=INT外部割込みが発生していない
bit0 IOCIF:状態変化割込みフラグ
1=状態変化割込みピンの少なくとも1つの状態が変化した
0=状態変化割込みピンの状態は変化していない
1)タイマ0(TIMER0)モジュール 日本語マニュアル P175
まず、日本語マニュアルP175 図20-1 Timer0ブロック図を参照してください。
タイマ0のその本体はTMR0と言う8bitのレジスタで、指定のクロック源でアップカウントしていきます。
TMR0がオーバーフローすると、フラグ(TMR0IF)をセットして、また0からカウント始めます
クロック源はインストラクションクロック(FOSC/4)やT0CKIピン、他から入力するパルスをカウントします。
これに8bitのプリスケーラを接続する事が出来ます。
OPTIONレジスタ
bit7 /WPUEN:弱プルアップイネーブルビット
1=すべての弱プルアップ無効
0=それぞれのポート設定に応じて弱プルアップ有効
bit6 INTEDG:割込みエッジ選択ビット
1=INTピン立ち上がりエッジで割込み
0=INTピン立ち下がりエッジで割込み
bit5 TMR0CS:Timer0クロック源選択ビット
1=T0CKIピンの遷移
0=インストラクションクロック(FOSC/4)
bit4 TMR0SE:Timer0ソースエッジ選択ビット
1=T0CKIピンのHighからLowへの遷移時にインクリメント
0=T0CKIピンのLowからHighへの遷移時にインクリメント
bit3 PSA:プリスケーラ割り当てビット
1=プリスケーラをTimer0モジュールに割り当てない
0=プリスケーラをTimer0モジュールに割り当てる
bit2-0 プリスケーラ比選択ビット
000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256
a)インタバル・タイマとして使う
①Timer0初期設定(OPTIONレジスタ)
TMR0CS=0:クロック源をインストラクションクロックにする
PSA=0:プリスケーラをタイマ0に割り当てる(必ずしも必要では無い)
プリスケーラ比設定
②割込み許可(INTCONレジスタ)
TMR0IE=1:Timer0オーバーフロー割込み許可
GIE=0:全体割込み許可
③メインプログラム(メインループ)
必要な処理を何かし続ける
④割込み処理ルーチン
LEDを変調する等、必要な処理をする(時間短く)
Timer0リスタート処理
INTCON、TMR0IFフラグクリア
RETFIE(割込み処理終了)
理解必須のコアレジスタはデータメモリのすべてのバンクの最初の12バイト、12種類存在します。
よって、バンクやアドレスを意識する事無くアクセス可能です。
その中でもWレジスタおよびSTATUSレジスタのフラグビット、これを理解しないとプログラムは作成できません、と言う位重要です。
(1)WREG Wレジスタ
CPU直属のメモリと言った感じで、ソースリストの数行に一度は出没する?と言われる程、使用頻度の最も高いレジスタです。
特に演算やデータ移動等ではWregを中心に行います。
例1)
MOVLW 0CH Wレジスタに0CHが入る
ANDLW 030H 定数論理積 Wレジスタの内容 AND 30H → Wレジスタに演算結果の0が入る
例2)
MOVLW 030H Wレジスタに30Hが入る
MOVWF WRK0 変数「WRK0」に30Hが入る
MOVLW 0CH WレジスタにCHが入る
ADDWF WRK0,F W+WRK0 の加算が行われ、その結果が「WRK0}に入り、WRK0=3CHとなる
例3)
-
CALL TABLE
CALL PUTW ;Wレジスタ内のアスキーコードをLCDに表示
-
-
TABLE
BRW PC(プログラムカウンタ)=PC+Wレジスタの数値
RETLW ’A’ ;W=0の時、W=41Hとなりリターンする
RETLW ’B’ ;W=1の時、W=42Hとなりリターンする
RETLW 043H ;W=3の時、W=43H
RETLW 044H ;W=4の時、W=44H
RETLW ’ア’ ;W=5の時、W=B1H
(2)STATUS ステータスレジスタ 日本語マニュアル P24参照
重要なレジスタのですが、理解必須なのは、その内の下位3ビットですので、大丈夫です。
bit2 Z ゼロビットフラグ 演算はWレジスタとRAMレジスタ、Wレジスタと直接数値等が対象となります。
演算とは、加算(ADD)・減算(SUB)・論理演算(AND等)がありますが、MOVF等の移動命令でも発動します。
演算の結果がゼロの場合[1]となり、演算の結果がゼロで無いなら、[0]となります。
bit1 DC デジット・キャリーフラグ マニュアル参照・・・ (定義が良く解らないので、超なげやり) (^_^;)
加算の結果、下位4bitの数値が桁上がりした場合、DC=1(Dキャリー発生)となります
具体的には、09H+06H=0FHでは、Z=0、DC=0、C=0
09H+07H=10Hでは、Z=0、DC=1、C=0 (Dキャリー発生)
09H+F6H=FFHでは、Z=0、DC=0、C=0
09H+F7H=100Hでは、Z=1、DC=1、C=1 (Dキャリー発生)
09H+F8H=101Hでは、Z=0、DC=1、C=1 (Dキャリー発生)
05H+F8H=FDHでは、Z=0、DC=0、C=0
39H+19H=52Hでは、Z=0、DC=1、C=0 (Dキャリー発生)
39H+F1H=2AHでは、Z=0、DC=0、C=1
減算の結果、下位4bitの数値が桁下がりした場合、DC=0(Dボロー発生)となります。
具体的には、12H-01H=11Hでは、Z=0、DC=1、C=1
12H-03H=0FHでは、Z=0、DC=0、C=1 (Dボロー発生)
12H-0FH=03Hでは、Z=0、DC=0、C=1 (Dボロー発生)
12H-10H=02Hでは、Z=0、DC=1、C=1
12H-11H=01Hでは、Z=0、DC=1、C=1
12H-12H=00Hでは、Z=1、DC=1、C=1
12H-13H=FFHでは、Z=0、DC=0、C=0 (Dボロー発生)
12H-45H=CDHでは、Z=0、DC=0、C=0 (Dボロー発生)
12H-D0H=42Hでは、Z=0、DC=1、C=0
38H-1AH=1EHでは、Z=0、DC=0、C=1 (Dボロー発生)
38H-41H=F7Hでは、Z=0、DC=1、C=0
この演算によるDCフラグの挙動を見ていると、上位4bitは見ていないと思われますが・・・
(シミュレータによるADDWFおよびSUBWF演算とその時のSTATUSレジスタ確認)
bit0 C キャリーフラグ ちょっと面倒なフラグで、他の命令とも絡みます。
演算(加算・減算)の場合
8ビット単位の加算の結果、桁上がり(キャリー)が発生すると、C=1 桁上がりが発生しないと、C=0
8ビット単位の減算の結果、桁下がり(ボロー)が発生すると、C=0 桁下がりが発生しないと、C=1
ロジカル・シフト命令の場合(日本語マニュアル P335)
LSLF命令の結果、操作RAMレジスタのbit7の内容がCフラグの内容となる 旧Cフラグの内容は破棄される
LSRF命令の結果、操作RAMレジスタのbit0の内容がCフラグの内容となる 旧Cフラグの内容は破棄される
ローテート命令の場合(日本語マニュアル P338、P339)
RLF命令の結果、操作RAMレジスタのbit7の内容がCフラグへ、
旧Cフラグの内容はレジスタのbit0の内容となる
RRF命令の結果、操作RAMレジスタのbit0の内容がCフラグへ、
旧Cフラグの内容はレジスタのbit7の内容となる
その他Cフラグが影響する命令
ASRF、ADDWFC、SUBWFB
演算詳細はここでは割愛します。
これは当局も犯した経験がありますが、INCFあるいはDECF命令等の場合、
Zフラグは反応しますがDCフラグおよびCフラグは反応しません
(3)BSR BSRレジスタ
レジスタRAMエリア(データRAMエリア)は128バイトのアドレスを持つ領域です。
そして、アドレス先頭順に、下記の様に配列しています。
000H~00BH コアレジスタ領域
00CH~01FH SFR(特殊機能レジスタ)領域
020H~06FH GPR(汎用データRAM)領域
070H~07FH 共通RAM領域
そして上記のレジスタRAM領域は、同様の構造の領域が32バンク存在します。
レジスタRAM領域へのPICアクセス命令のアドレス指定部分はbit0~bit6の7bit幅しかありません。
つまり、1命令コードでは00H~7FHまでのアクセスになります。
そのため、BSRレジスタでbit7よりbit11までの上部5bitを補完します。
すなわち、レジスタRAM領域のバンク切り替えを行うレジスタがBSRレジスタと言う事になります。
これにより、レジスタRAM領域は、000H~FFFHまでのアドレスをアクセス可能となっています。
BSRレジスタへのアクセス方法(例としてバンク2にする)
①
MOVLW 02H Wレジスタに02Hを書き込む
MOVWF BSR BSRレジスタに転送
②
MOVLB 02H BSRレジスタに02Hを転送
(4)PCLとPCLATH 日本語マニュアル P42 3-3
詳細はマニュアルの解説を読んでください
ここでは最低限の使用方法を記します
1)CALL命令とGOTO命令
PIC命令コードのジャンプ系、CALLとGOTOですが、命令コード内のジャンプ先アドレス指定bit幅は11bitの2Kワードです。
すなわち、0000H~07FFHのアドレス指定となります。
PC(プログラムカウンタ)は15bit幅で32Kワード、0000H~7FFFHまでのアドレスを認識します。
(PIC16F1705は000H~1FFFHまでの4ページ8Kワード)
そのため、PCLATHレジスタから不足分の4bitを補完して15bit幅にします。
PCは下位8bitのPCLと、上位7bitのPCHで構成され、PCLは直接アクセス可能です。
PCHはPCL書き込み時にPCLATHレジスタ(bit0-bit7)のbit3-bit6から4bit分を間接的にロードされます。
この4bit分はプログラムメモリのバンク指定と言う事になります。
よって、0800H以降のアドレスに存在するサブルーチンを呼び出すには、
PCLATHを使用して、バンクを指定してから、CALLすると言う事になります。
RETURN命令でCALLしたアドレスには自力で戻ってきますが、CALL時に切り替えたバンクは切り替わったままとなっています。
よって、CALL命令の直後にPCLATHを元に戻す必要があります。
例1) ページ2のアドレスに存在するサブルーチン「SUB01」をページ0のメインルーチンから呼び出す
MOVLP 010H ;ページ2→ 2×(2×2×2) ←カッコ内は左へ3ビットシフトするため
CALL SUB01
CLRF PCLATH ;ページ0
例2) 例1と同じ事をアッセンブラ疑似命令を使用して行う
MOVLW HIGH SUB01 ;これだとサブルーチンの存在ページを計算しないので楽
MOVWF PCLATH
CALL SUB01
CLRF PCLATH
以上より、ページ0にはメインルーチン、割込みルーチン、サブルーチンを配置
ページ1以降は基本的に固定データ、やむを得ない場合にサブルーチンも配置
と言った使い方になると思います。
2)BRA命令とプログラムカウンタ 日本語マニュアル P332
PICの命令コードの分岐系ですが、割と使いやすい命令です。
BRA命令コードの相対ジャンプ指定bit幅は符号付の9bitです。
BRA命令コードの存在アドレスは基本的に制限がない
3)BRW命令とプログラムカウンタ 日本語マニュアル P332
PICの命令コードの分岐系ですが、使いやすい命令です。
BRW命令コードの相対ジャンプ指定bit幅は符号無の8bitで、前進あるのみです。
BRW命令コードの存在アドレスは基本的に制限がない
この命令はPC(プログラムカウンタ)にWレジスタの内容が加算されます。
これはプログラムエリアに於いて、256バイトまでの小データテーブルを構成するのに最適な命令です
この命令コードの後にRETLW命令を並べるだけです。
(日本語マニュアル P22 3-1-1-1 RETLW命令 参照)
当局もこの方法は良く使用します。
(5)FSRとINDF 日本語マニュアル P23 間接アドレッシング
8KWのPIC16F1705のプログラムエリアに、広いデータテーブルを構成するのに有効な命令です。
FSRは16bitのレジスタで64Kバイトのアドレッシングが可能です。 (日本語マニュアル P46 図3-8参照)
FSRは2個あり、FSR0とFSR1となり、それぞれFSR0LとFSR0H、FSR1LとFSR1Hとに分かれます。
FSRnLレジスタとFSRnHレジスタにアクセスしたいアドレスを書き込みます。
そして、アクセスウインドウであるINDFnレジスタを通して間接的に8bitデータを読み書きします。
ただし、プログラムエリアは読込のみとなります。
1)プログラムエリアへのアクセス
プログラムエリア、0000H~7FFFHはFSRでは8000H~FFFFHとしてアドレッシングします。
プログラムエリアは1アドレス14bitですが、読込は下位8bitのみ可能で、データとして扱います。
プログラムエリアへの書き込みは、アッセンブラのDTあるいはDW疑似命令等、
8bitデータを14bitで書き込める命令を使います。
例1)
MOVLW HIGH TBL01 ラベルの上位8bitアドレス
MOVWF FSR1H
MOVLW LOW TBL01 ラベルの下位8bitアドレス
MOVWF FSR1L
MOVIW FSR0++ (INDF0)→Wreg、FSR0ポストインクリメント
CALL PUTW LCDにWregのデータを表示
・
・
TBL01 データテーブルのラベル(アドレス)
DT ”JA0QON”
DW 00H
(6)INTCONレジスタ 日本語マニュアル P93 8-5-1 INTCONレジスタ
割込み制御の重要なレジスタで、全体的な割込みON/OFFをします。
割込み源個別制御やフラグはそれぞれの対応レジスタで行います。
ここでは代表的なタイマ0(TIMER0)の基本的な扱い方を記載します。
INTCONレジスタ
bit7 GIE:グローバル割込みイネーブルビット
1=すべてのアクティブな割込みを有効にする
0=すべての割込みを無効にする
bit6 PEIE:周辺モジュール割込みイネーブルビット
1=すべてのアクティブな周辺モジュール割込みを有効にする
0=すべての周辺モジュール割込みを無効にする
bit5 TMR0IE:Timer0オーバーフロー割込みイネーブルビット
1=Timer0割込み有効
0=Timer0割込み無効
bit4 INTE:外部割込みイネーブルビット
1=すべてのアクティブな外部割込みを有効にする
0=すべての外部割込みを無効にする
bit3 IOCIE:状態変化割込みイネーブルビット
1=すべてのアクティブな状態変化割込みを有効にする
0=すべての状態変化割込みを無効にする
bit2 TMR0IF:Timer0オーバーフロー割込みフラグ
1=TMR0レジスタがオーバーフローした
0=TMR0レジスタがオーバーフローしていない
bit1 INTF:外部割込みフラグ
1=INT外部割込みが発生した
0=INT外部割込みが発生していない
bit0 IOCIF:状態変化割込みフラグ
1=状態変化割込みピンの少なくとも1つの状態が変化した
0=状態変化割込みピンの状態は変化していない
1)タイマ0(TIMER0)モジュール 日本語マニュアル P175
まず、日本語マニュアルP175 図20-1 Timer0ブロック図を参照してください。
タイマ0のその本体はTMR0と言う8bitのレジスタで、指定のクロック源でアップカウントしていきます。
TMR0がオーバーフローすると、フラグ(TMR0IF)をセットして、また0からカウント始めます
クロック源はインストラクションクロック(FOSC/4)やT0CKIピン、他から入力するパルスをカウントします。
これに8bitのプリスケーラを接続する事が出来ます。
OPTIONレジスタ
bit7 /WPUEN:弱プルアップイネーブルビット
1=すべての弱プルアップ無効
0=それぞれのポート設定に応じて弱プルアップ有効
bit6 INTEDG:割込みエッジ選択ビット
1=INTピン立ち上がりエッジで割込み
0=INTピン立ち下がりエッジで割込み
bit5 TMR0CS:Timer0クロック源選択ビット
1=T0CKIピンの遷移
0=インストラクションクロック(FOSC/4)
bit4 TMR0SE:Timer0ソースエッジ選択ビット
1=T0CKIピンのHighからLowへの遷移時にインクリメント
0=T0CKIピンのLowからHighへの遷移時にインクリメント
bit3 PSA:プリスケーラ割り当てビット
1=プリスケーラをTimer0モジュールに割り当てない
0=プリスケーラをTimer0モジュールに割り当てる
bit2-0 プリスケーラ比選択ビット
000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256
a)インタバル・タイマとして使う
①Timer0初期設定(OPTIONレジスタ)
TMR0CS=0:クロック源をインストラクションクロックにする
PSA=0:プリスケーラをタイマ0に割り当てる(必ずしも必要では無い)
プリスケーラ比設定
②割込み許可(INTCONレジスタ)
TMR0IE=1:Timer0オーバーフロー割込み許可
GIE=0:全体割込み許可
③メインプログラム(メインループ)
必要な処理を何かし続ける
④割込み処理ルーチン
LEDを変調する等、必要な処理をする(時間短く)
Timer0リスタート処理
INTCON、TMR0IFフラグクリア
RETFIE(割込み処理終了)