6章:関数化とレベルスタック

    作成2014.03.02

  1. STEP08_Function
    (1)STEP08_Functionソースプログラム
    STEP08_Functionソースプログラムを以下に示します。
    /*****************************
     STEP08_Function.c
    *****************************/
    #define _LEGACY_HEADERS
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    
    // プロトタイプ宣言
    void WaitTime (int cnt);
    
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	
    	// 入出力設定
    	TRISA = 0x20;
    	TRISB = 0x00;
    	
    	// 永久ループ
    	while(1)
    	{
    		// LED1点灯
    		RB0 = 0;
    		
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		
    		// LED1消灯
    		RB0 = 1;
    		
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    	}
    }
    
    // 待ち時間関数
    void WaitTime(int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    
    *待ち時間関数を定義すると以下のメリットがあります。
    *ミスの可能性が減る。
    *ソースが見やすくなる。
    *変更と修正が容易となる。


  2. STEP08_StackOve
    (1)STEP08_StackOveソースプログラム
    STEP08_StackOveソースプログラムを以下に示します。
    /*****************************
     STEP08_StackOver.c
    *****************************/
    #define _LEGACY_HEADERS
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    // プロトタイプ宣言
    void Func0 (void);
    void Func1 (void);
    void Func2 (void);
    void Func3 (void);
    void Func4 (void);
    void Func5 (void);
    void Func6 (void);
    void Func7 (void);
    void Func8 (void);
    void Func9 (void);
    // メイン関数
    void main (void)
    {
    	// Func0関数の呼び出し
    	Func0();
    	
    	// 永久ループ
    	while(1)
    		;
    }
    
    // Func0関数
    void Func0 (void)
    {
    	// Func1関数の呼び出し
    	Func1();
    }
    
    // Func1関数
    void Func1 (void)
    {
    	// Func2関数の呼び出し
    	Func2();
    }
    
    // Func2関数
    void Func2 (void)
    {
    	// Func3関数の呼び出し
    	Func3();
    }
    
    // Func3関数
    void Func3 (void)
    {
    	// Func4関数の呼び出し
    	Func4();
    }
    
    // Func4関数
    void Func4 (void)
    {
    	// Func5関数の呼び出し
    	Func5();
    }
    
    // Func5関数
    void Func5 (void)
    {
    	// Func6関数の呼び出し
    	Func6();
    }
    
    // Func6関数
    void Func6 (void)
    {
    	// Func7関数の呼び出し
    	Func7();
    }
    
    // Func7関数
    void Func7 (void)
    {
    	// Func8関数の呼び出し
    	Func8();
    }
    
    // Func8関数
    void Func8 (void)
    {
    	// Func9関数の呼び出し
    	Func9();
    }
    
    // Func9関数
    void Func9 (void)
    {
    	;
    }
    
    *関数化は大変便利な機能です。
    *関数を呼び出して関数に纏めるとより複雑な機能を持つ関数ができます。
    *さらに複雑な関数を呼び出すとさらに複雑な機能を持つ関数ができます。
    *これを関数のネストと呼び最大のネスト回数はPICマイコンの種類によって制限されます。
    *PIC16F627Aの最大ネスト回数は8回(8 Level Stack)です。
    *PIC18F4553の最大ネスト回数は31回(31 Level Stack)です。
    *STEP08_StackOverソースプログラムはPIC16F627Aの最大ネスト回数は8回を越えており、正常に動作しないことになります。
    **STEP08_StackOverソースプログラムでなぜか?コンパイルエラーは表示されません。


  3. PICkit3とPIC16F627Aの相性
    (1)PICkit3はPIC18F4553の最大ネスト回数は31回のような高機能PICマイコンのプログラミングに適しますが、PIC16F627Aに適するかあやしい?
    (2)プログラミングでは、コンパイル、デバッグ、書き込みが必要ですが「MPLAB IDE v8.30」では、コンパイル、書き込みは正常に動作するのですが、デバッグ機能が正常に動作しません。
    (3)「MPLAB IDE v8.30」でデバッグを実施すると「Target Device ID (0x1040) does not match expected Device ID (0x1120).」エラーが発生します。
    (4)「MPLAB X IDE v2.00」ではコンパイルは正常に動作するのですが、デバッグ、書き込みが正常に動作しません。
    (5)「MPLAB X IDE v2.00」で表示されるエラーは同様に「Target Device ID (0x1040) does not match expected Device ID (0x1120).」エラーです。
    (6)「MPLAB IPE」でのhexファイル書き込みは正常に動作します。
    (7)以上の現象は「MPLAB IDE v8.30」と「MPLAB X IDE v2.00」で同じエラー表示であり、デバッグ機能におけるPICkit3とPIC16F627Aの相性起因の問題と思われます。
    (8)Device ID 0x1040PIC16F627A 、 Device ID 0x1120=PIC18F2510を意味するようです。なぜ?Device ID 0x1120=PIC18F2510を期待するのか?全く理由がわかりません。

    (9)幸いサンプルソースプログラムはデバッグ無しで完全動作します。
    (10)学習環境としては、PICkit3でも大きな問題は無いと考えています。










7章:LEDシフト表示(1)に行く。

トップページに戻る。