[PIC]HI-TECH Cでコンフィギュレーションビットを指定する

PICのプログラムをアセンブリ(MPASM)で作成する場合は、CONFIG命令でコンフィギュレーションビットを指定するのですが、HI-TECH Cではこの設定は、__CONFIG()マクロで行います。

下記のプログラムは、__CONFIG()マクロの使用を使用したサンプルです。

#include <stdio.h>
#include <htc.h>
 
void main( void )
{
    __CONFIG( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF );
}




コンフィギュレーションビットとして指定可能な値はPICの型番によって異なります。
自分が使用しているチップで何の設定が可能かは、HI-TECH Cのincludeフォルダにあるヘッダをチェックすれば確認できます。コンパイラをデフォルトのフォルダにインストールした場合、includeファイルは”C:\Program Files\HI-TECH Software\PICC\9.83\include”辺りに置いてあります。

例えば、pic16f84a.hでは以下の定義になっています。

// Oscillator Selection bits
// RC oscillator
#define FOSC_EXTRC           0xFFFF
// HS oscillator
#define FOSC_HS              0xFFFE
// XT oscillator
#define FOSC_XT              0xFFFD
// LP oscillator
#define FOSC_LP              0xFFFC
// Watchdog Timer
// WDT enabled
#define WDTE_ON              0xFFFF
// WDT disabled
#define WDTE_OFF             0xFFFB
// Power-up Timer Enable bit
// Power-up Timer is disabled
#define PWRTE_OFF            0xFFFF
// Power-up Timer is enabled
#define PWRTE_ON             0xFFF7
// Code Protection bit
// Code protection disabled
#define CP_OFF               0xFFFF
// All program memory is code protected
#define CP_ON                0xC00F




C言語で、ファイル操作系の関数(fopen等)に慣れている場合、各設定値を論理和(“|”記号)でつなぎたくなるところですが、HI-TECH Cの__CONFIG()マクロは、論理積(“&”記号)でつなげるのが正しいです。

この理由は、実際の各設定値がどんな値にdefineされているかを見れば分かりやすいです。設定したい項目だけビットが0になるという、ビットを反転した形で定義されているからです。

また、ここで指定するdefine値はMPASMのCONFIG命令と一部表記が異なっているので注意が必要です。



…と書くと、自分のプログラムからpic16f84a.hを直接includeしたくなるところですが、そうではなく、htc.hをincludeしてください。
このことは、各チップのヘッダの先頭に以下の警告がある事からも分かります。

#warning Header file pic16f84a.h included directly. Use #include <htc.h> instead.





htc.hさえインクルードしておけば、自動で開発しているチップに応じたヘッダが読み込まれるのですが、この仕組みは以下のようになっています。

htc.hを見ると、Liteバージョンのコンパイラを使っている場合はpic.hをincludeしています。

/* HI-TECH PICC / PICC-Lite compiler */
#if defined(__PICC__) || defined(__PICCLITE__)
#include <pic.h>
#endif



pic.hの中では、ターゲットとなるチップに応じたヘッダをincludeする為のファイルであるchip_select.hを読み込んでいます。

#include <chip_select.h>



chip_select.hで、チップの型番に応じたヘッダが読み込まれています。
下記の定義はpic16f84a用のものを抜粋しましたが、これたチップの型番の数だけ羅列されています。

#ifdef _16F84A
#ifdef _LEGACY_HEADERS
#include <legacy/pic1684.h>
#else
#include <pic16f84a.h>
#endif
#endif





ちなみにCONFIGマクロは、pic.hで以下のように定義されており、これはプリプロセッサによってインラインアセンブラに展開されます。

#define __CONFIG(x) asm("\tpsect config,class=CONFIG,delta=2");\
            asm("\tdw "___mkstr(x))


関連記事

コメントを残す

メールアドレスが公開されることはありません。