3章:STEP03_TESTソースプログラムの分析

    作成2014.02.27

  1. STEP03_TESTソースプログラム
    STEP03_TESTソースプログラムを以下に示します。
    /*****************************
     STEP03_TEST.c
    *****************************/
    #define _LEGACY_HEADERS
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	
    	// 入出力設定
    	TRISA = 0x21;
    	TRISB = 0x00;
    	
    	// 永久ループ
    	while(1)
    	{
    		// SW1がONの場合
    		if (RA0 == 0)
    		{
    			// LED1点灯
    			RB0 = 0;
    		}
    		// その他の場合(SW1がOFFの場合)
    		else
    		{
    			// LED1消灯
    			RB0 = 1;
    		}
    	}
    }
    
    *非常にシンプルで簡潔に纏まったソースプログラムです。


  2. #define _LEGACY_HEADERS
     このコードはソースプログラムがMPLAB IDEの古いタイプの記述をしていることを明示するためのコードです。  「MPLAB IDE v8.30」では特に必要は無いと思います。


  3. #include <pic.h>
    (1)このコードは非常に重要な意味を持ちます。
    (2)「HI-TECH ANSI C Compiler」を使用していますので、「C:\Program Files (x86)\HI-TECH Software\PICC\PRO\9.60\include\pic.h」が自動的にソースプログラムに加わります。
    (3)プロジェクトにはDeviceに「PIC16F627A」が設定されており変数「_16F627A」が設定されます。この変数をもとに#include #include が実行され、pic16f62xa.hとhtc.hが加わります。


  4. __CONFIG ( 値 );
    (1)pic.hに以下のように定義されています。
    #define __CONFIG(x) asm("\tpsect config,class=CONFIG,delta=2");\
                   asm("\tdw "___mkstr(x))
    (2)この関数はCONFIGのアドレスに設定値を書き込むようです。


  5. UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO
    (1)UNPROTECT と LVPDIS と BOREN と MCLREN と PWRTEN と WDTDIS と INTIOのビットアンドを意味します。
    (2)pic16f62xa.hに以下のように定義されます。
    #define CONFIG_ADDR0x2007

    // Configuration Mask Definitions
    #define CONFIG_ADDR 0x2007
    // Protection of flash memory
    #define PROTECT 0x1FFF
    #define UNPROTECT 0x3FFF//***これを選択//プログラムをプロテクトしない
    // Protection of EEPROM data memory
    #define CPD0 x3EFF
    #define UNPROTECT 0x3FFF//***これを選択//プログラムをプロテクトしない
    // Low voltage programming enable
    #define LVPEN 0x3FFF
    #define LVPDIS0 x3F7F//***これを選択//低電圧プログラム書き込みをしない。
    // Brown out detection enable
    #define BOREN 0x3FFF//***これを選択//電圧低下リセットをする。
    #define BORDIS 0x3FBF
    // Master clear reset pin function
    #define MCLREN 0x3FFF//***これを選択//MCLRピンを使用したリセットをする。
    #define MCLRDIS 0x3FDF
    // Power up timer enable
    #define PWRTEN 0x3FF7//***これを選択//パワーアップタイマを使用する。
    #define PWRTDIS 0x3FFF
    // Watchdog timer enable
    #define WDTEN 0x3FFF
    #define WDTDIS 0x3FFB//***これを選択//ウォッチドタイマを使用しない
    // Oscillator configurations
    #define RCCLK 0x3FFF
    #define RCIO 0x3FFE
    #define INTCLK 0x3FFD
    #define INTIO 0x3FFC//***これを選択//内臓クロックで15番16番ピンを入出力に使う。
    #define EC 0x3FEF
    #define HS 0x3FEE
    #define XT 0x3FED
    #define LP 0x3FEC
    (3)CONFIGのアドレスは0x2007です。
    (4)変数名毎に値がきまっており、各項目のビットアンドをとるとアドレス0x2007番地の設定値が決定します。


  6. CMCON = 0x07; // 1,2,17,18端子を入出力端子に設定
    (1)pic16f62xa.hに以下のように定義されます。
    volatile unsigned charCMCON@ 0x1F;
    **CMCONは番地0x1Fにvolatile unsigned char型として定義されます。
    /* Definitions for CMCON register */
    bit CM0 @((unsigned)&CMCON*8)+0;
    bit CM1 @((unsigned)&CMCON*8)+1;
    bit CM2 @((unsigned)&CMCON*8)+2;
    bit CIS @((unsigned)&CMCON*8)+3;
    bit C1INV @((unsigned)&CMCON*8)+4;
    bit C2INV @((unsigned)&CMCON*8)+5;
    volatile bit C1OUT @((unsigned)&CMCON*8)+6;
    volatile bit C2OUT @((unsigned)&CMCON*8)+7;
    **上記は各ビットの定義となります。
    **CM2:CM0 = 111はComparators Off// 1,2,17,18端子はデジタルに設定を選択


  7. PORTA = 0xFF; PORTB = 0xFF; // 電圧レベルの初期設定
    volatile unsigned char PORTA@ 0x05;
    volatile unsigned char PORTB@ 0x06;
    **PORTAは 0x05番地、PORTB番地にvolatile unsigned char型として定義されます。
    **PORTA = 0xFF; PORTB = 0xFF;で全ビットに1が設定されます。


  8. TRISA = 0x21;// 入出力設定
    volatile unsigned charTRISA@ 0x85;
    **TRISA0x85;番地にvolatile unsigned char型として定義されます。
    /* Definitions for TRISA register */
    volatile bit TRISA0 @((unsigned)&TRISA*8)+0;
    volatile bit TRISA1 @((unsigned)&TRISA*8)+1;
    volatile bit TRISA2 @((unsigned)&TRISA*8)+2;
    volatile bit TRISA3 @((unsigned)&TRISA*8)+3;
    volatile bit TRISA4 @((unsigned)&TRISA*8)+4;
    volatile bit TRISA5 @((unsigned)&TRISA*8)+5;
    volatile bit TRISA6 @((unsigned)&TRISA*8)+6;
    volatile bit TRISA7 @((unsigned)&TRISA*8)+7;
    **上記は各ビットの定義となります。
    **はRA0とRA5が入力、その他は出力に設定(RA5を入力にした意味不明?)


  9. TRISB = 0x00;// 入出力設定
    **ポートBは全て出力に設定


  10. 入出力制御
    (1)RA0 == 0// SW1がONの場合
    (2)RB0 = 0;// LED1点灯
    (3)RB0 = 1;// LED1消灯


  11. TRISB = 0x00;// 分析結果の検討
    (1)#define _LEGACY_HEADERSはMPLAB IDEver8.66(HI-TECH C ver9.81)からパラメータが変更になっため、古いコードで記載されていることを明示するためのものです。
    (2)MPLAB IDE v8.92ではHI-TECH Cが標準インストールから除外されているようです。
    (3)MPLAB X IDE v2.00でもHI-TECH Cが標準インストールから除外されています。
    (4)今後も開発環境は日々変化するのでは?しかし、その変化に追従するのは大変そうです。
    (5)学習環境としては種々組合せが考えられるのですが、頻繁に変更すると混乱しそうです。
    (6)当面MPLAB IDE v8.30+HI-TECH Cで学習したいと思います。











4章:LED点灯に行く。

トップページに戻る。