コンフィギュレーションの指定方法


【コンフィギュレーションの内容】

PIC18シリーズのコンフィギュレーションビットの内容は下図のようになっています。
図のようにPIC18シリーズのコンフィギュレーションビットは3つの種類があります。
この中で、「Configuration Bits」がPICの動作モードを指定するもので必ず設定
する必要があり、メモリアドレスが0x300000番地というとんでもない高位アドレス
となっています。
あとのID Location と Device ID は設定してもしなくとも動作には影響ありません。
ID Locationには何を書き込んでも良く、プログラムIDとか製品IDとかを書き込んで
おくことも出来ます。





【コンフィギュレーションビットの詳細】

上図の中のConfiguration Bitsの詳細はそれぞれ下図のようになっています。


















【コンフィギュレーションの指定方法】

MPLAB-C18では直接コンフィギュレーションをプログラム中で記述する手段が
用意されていません。従ってコンフィギュレーションを記述する方法としては、
直接メモリに書き込むしかありませんが、下記の3通りの方法があります。

(1) コンフィギュレーションメモリに直接定数データを確保する。

(2) 定数データ定義ファイルを別に作成してラベルデータで定数を定義する。
  (アセンブラのインクルードファイルから作成する)

(3) アセンブラ命令のプログラムでコンフィギュレーションを指定する関数
  を用意しそれをリンクする。(__CONFIG擬似命令命令を使う)


【定数定義による方法1】

コンフィギュレーションメモリに直接、定数を定義する方法は下記のようにします。
まず、擬似命令の #pragma を使ってメモリアドレスを指定します。
その後に、配列定数データとして定義します。

《例》 実際の指定方法例
  #pragma romdata config=0x300000
 unsigned char rom configBits[8] = {0xff,0xe2,0x06,0x00,0x00,0x01,0x03,0x00};

 #pragma romdata idlocs=0x200000
 unsigned char rom idlocData[8] = "01234567";

 #pragma romdata devid=0x3ffffe
 unsigned char rom devidID[2] = {0x02,0x02};


  上記例では下記の設定となります。
    // コード・プロテクト=OFF,  
    //システム・クロック切り替え=OFF,  HS発振モード
    //ウォッチドッグ・タイマ=OFF,   ポストスケーラ1:128
    //4.2Vのブラウンアウト・リセット,  パワーアップ・タイマ=ON
    //CCP2入出力はRC1ピンに割り当て
    //スタック・オーバーフロー/アンダーフロー・リセット=ON

    //ID=01234567 (8バイト分のエリアが定義されている)

    //デバイスID=01,  レビジョン=02

 【注意】 この定義のときに、MPLAB-C18に標準で用意されているLINKファイルに
       不備があって、0x200000番地のIDフィールドが未定義となっていますので
       リンクファイルに下記1行を追加します。

     CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED

      リンクファイルは、MPLAB-C18をインストールしたディレクトリの d:\mcc18\lkr
      の下にあります。(18c452.lkr などのファイル)

【定数定義による方法2】

定数ラベルを定義してアセンブラでの__CONFIG命令による定義と同じ扱いにする方法
です。このために定数ラベルを定義するファイルを作成します。
このファイルを config.h というファイル名で用意しました。
この定義ファイルはMPLABにあるインクルードファイルを利用して作成します。
作成した定義ファイルは下記の表のようなラベルとなっていてMPLABのものと全く同じ
となっています。実用的にはこちらの方が便利だと思います。

CONFIG パラメータ区別 意味内容
CONFIG1L _CP_ON_0
_CP_OFF_0
Code Protect enable
       disable
CONFIG1H _OSCS_ON_1
_OSCS_OFF_1
Oscillator Switch enable
          disable
_LP_OSC_1
_XT_OSC_1
_HS_OSC_1
_RC_OSC_1
_EC_OSC_1
_ECIO_OSC_1
_HSPLL_OSC_1
_RCIO_OSC_1
Oscillator type



External Clock w/OSC2 output divide by 4
w/OSC2 as an IO pin (RA6)
HS PLL
RC w/OSC2 as an IO pin (RA6)
CONFIG2L _BOR_ON_2
_BOR_OFF_2
Brown-Out Reset enable
         disable
_PWRT_OFF_2
_PWRT_ON_2
Power-Up Timer enable
        disable
_BORV_25_2
_BORV_27_2
_BORV_42_2
_BORV_45_2
BOR Voltage - 2.5v
        2.7v
        4.2v
        4.5v
CONFIG2H _WDT_ON_3
_WDT_OFF_3'
Watch Dog Timer enable
         disable
_WDTPS_128_3
_WDTPS_64_3
_WDTPS_32_3
_WDTPS_16_3
_WDTPS_8_3
_WDTPS_4_3
_WDTPS_2_3
_WDTPS_1_3'
WDT PostScaler count 1:128
            1:64
            1:32
            1:16
            1:8
            1:4
            1:2
            1:1
CONFIG3H _CCP2MX_ON_5
_CCP2MX_OFF_5
CCP2 pin Mux enable
       disable
CONFIG4L _STVR_ON_6
_STVR_OFF_6
Stack over/underflow Reset enable
               disable


この定義ファイルをインクルードすれば、下記のような指定方法でコンフィギュレーション
を定義することが出来ます。この方がCのファイルで直接コンフィギュレーション内容を
記述できるので、一見して理解できると思います。


#include <config.h>

#pragma romdata config=0x300000
unsigned char rom _CONFIG0 = _CP_ON_0;
unsigned char rom _CONFIG1 = _OSCS_OFF_1 & _HSPLL_OSC_1;
unsigned char rom _CONFIG2 = _BOR_ON_2 & _BORV_25_2 & _PWRT_ON_2;
unsigned char rom _CONFIG3 = _WDT_ON_3 & _WDTPS_64_3;
unsigned char rom _CONFIG5 = _CCP2MX_OFF_5;
unsigned char rom _CONFIG6 = _STVR_ON_6;

#pragma romdata idlocs=0x200000
unsigned char rom idlocData[8] = "01234567";

#pragma romdata devid=0x3ffffe
unsigned char rom devidID[2] = {0x02,0x02};



このコンフィギュレーション用のヘッダーファイル「config.h」は下記に用意しましたので
ダウンロードしてお使い下さい。

 ★ コンフィギュレーション用ヘッダファイル(config.h)


【アセンブラ関数をリンクする方法】

アセンブラには__CONFIGというコンフィギュレーションを記述する擬似命令が用意
されていますので、これを使ってアセンブラでコンフィギュレーションを記述した
関数を別に用意し、これをLINKERでリンクしてコンフィギュレーションをする方法です。

実際には下記の例ようなアセンブラ記述のコンフィギュレーション用の関数を用意
します。(例ではconfig.asmというファイル名にしています)
そしてこれを目的のプログラムのMPLABのプロジェクトに追加します。
つまりMPLABの「Edit Project」でProject Fileに「Add Node」で下記ファイルを追加
しておきます。

《例》 実際のconfig.asmの例です。
    include <p18c452.inc>
 ;***Configuration Bits Define
    __CONFIG H'300000', _CP_OFF_0
    __CONFIG H'300001', _OSCS_OFF_1 & _RCIO_OSC_1
    __CONFIG H'300002', _BOR_ON_2 & _BORV_25_2 & _PWRT_OFF_2
    __CONFIG H'300003', _WDT_ON_3 & _WDTPS_128_3
    __CONFIG H'300005', _CCP2MX_ON_5
    __CONFIG H'300006', _STVR_ON_6
 ;***ID Location Define
    __IDLOCS H'200000', 'T'
    __IDLOCS H'200001', 'E'
    __IDLOCS H'200002', 'S'
    __IDLOCS H'200003', 'T'
    __IDLOCS H'200004', '1'
    END


このconfig.asmを下記のようにProjectのリンクファイルに追加します。この状態で
Make Projectを実行すればこのconfig.asmが自動的にアセンブルされてリンクされ
ます。
























 ここのProject Filesに
 Add Nodeボタンで追加
 する。


   目次ページへ