コンフィギュレーション レジスタ

英文マニュアル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   ゼロビットフラグ 演算は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   キャリーフラグ ちょっと面倒なフラグで、他の命令とも絡みます。

        演算(加算・減算)の場合
        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(割込み処理終了)
戻る  実験・製作の記録TOPへ戻る