5章:my_BinaryCounter

    作成2014.03.12

     PIC18F4553マイコンでのLED8個を使用したプログラムを検討します。

  1. 評価回路
     my_BinaryCounterの評価回路を図5-1に示します。
     図5-1においてPIC18F4553マイコンを組み込んだAE-USBPIC44基板にはスイッチSW1とSW2およびLEDが組み込まれています。
     SW1にはRE0ポート、SW2にはRE1ポート。LEDにはRE2ポートが割り当てられています。
     また、プログラム書き込み用としてVPPにRE3ポート、PGCにRB6ポート、PGDのRB7ポートが割り当てられています。
     そして、UBS接続用として、D-にRC3ポート、D+niRC4ポートが割り当てられています。
     コネクタ接続はしていませんが、RS232C通信用としては、SSにRA5ポート、TXにRC6ポート、RXにRC7ポートの接続が推奨のようです。

     AE-USBPIC44基板をベースにRBポートに8個のLEDを接続します。図5-1の接続条件において、RB6とRB7がPGCとPGDと干渉します。
     プログラムデバッグ、プログラム書き込み時は、RB6とRB7に接続したLEDをはずす必要があります。
     RB6とRB7は動作確認時にLEDを接続します。

     

  2. プログラム開発環境
     「MPLAB X IDE v2.00」と「xc8-v1.30-win」と「PICkit3」の組合せとします。PIC18F4553マイコンプログラム開発用としては、ベストマッチであり全ての機能が正常に動作します。(ビルド、デバッグ、書き込みにおいて)
     使い勝手も良く、動作も安定しておりトラブルが少ないのですが、一つだけ問題があります。「MPLAB X IDE v2.00」と「xc8-v1.30-win」と「PICkit3」と「PIC18F4553マイコン」の組合せで動作するサンプルプログラム例が非常に少ない点です。
     3章:秋月電子通商サンプルプログラム「MPLABを使った使用例2」の実行はUSBのサンプルプログラムですが「MPLAB X IDE v2.00」と「xc8-v1.30-win」と「PICkit3」と「PIC18F4553マイコン」の組合せ条件を満足しません。秋月電子通商サンプルプログラム「MPLABを使った使用例2」を「MPLAB X IDE v2.00」と「xc8-v1.30-win」と「PICkit3」の組合せ条件に変換できれば良いのですが、簡単には変換できません。

     これから学ぶべき開発環境は 「MPLAB X IDE v2.00」と「xc8-v1.30-win」と「PICkit3」の組合せであることは明らかです。


  3. サンプルプログラムの実行方法
     2章:秋月電子通商サンプルプログラム「MPLABを使った使用例1」の実行を参照ねがいます。複雑な構成を伴わないサンプルプログラムは全て上記の方法で実行できます。
     デバッグの使用方法は明記しませんが、デバッグは正常に動作します。ヘルプを参照していろいろ操作しているうちに使い方もなれてくると思います。


  4. my_BinaryCounter
    (1)my_BinaryCounterソースプログラム
    my_BinaryCounterソースプログラムを以下に示します。
    #include <xc.h>
    #include <p18f4553.h>
    
    #pragma config PLLDIV   = 5	// (20MHz crystal)
    #pragma config CPUDIV   = OSC1_PLL2	//「 主 発振 器 そのまま」「システム96MHzPLLソースを2 分 の 一 」
    #pragma config USBDIV   = 2	// Clock source from 96MHz PLL/2
    #pragma config FOSC     = HSPLL_HS	//外付け振動子利用の高速クロック発振で、PLLを 使 う
    #pragma config FCMEN    = OFF	//フェイルセーフクロックモニターを 無効
    #pragma config IESO     = OFF	//発振 器 の 内部 外部 切 り 替 えを 無効
    #pragma config PWRT     = OFF	//電源オン時タイマーを使わない	
    #pragma config BOR      = ON	//ハードだけでブラウンアウトリセット 機能 を使う
    #pragma config BORV     = 3	//最小電圧設定
    #pragma config VREGEN   = ON	//USB Voltage Regulator = ON
    #pragma config WDT      = OFF	//ウオッチドッグタイマを 無効
    #pragma config WDTPS    = 32768	//ウォッチドッグタイマーのプリスケーラが1:32,768
    #pragma config MCLRE    = ON	//MCLRを 有効 にしてRE3入力端子は 無効
    #pragma config LPT1OSC  = OFF	//タイマー1 発振 器 を 高電力 モードにする
    #pragma config PBADEN   = OFF	//リセット 時 にPORTB0〜4をデジタル 入出力 に 選択 する
    #pragma config CCP2MX   = OFF	//CCP2の入出力をRB3にマルチプレックスしない
    #pragma config STVREN   = ON	//スタック満杯あるいはアンダーフロー時にリセットする
    #pragma config LVP      = OFF	//ICSPモードでの単一書き込み電源は 使 わない
    #pragma config ICPRT    = OFF	// Dedicated In-Circuit Debug/Programming = OFF
    #pragma config XINST    = OFF	// Extended Instruction Set = OFF
    #pragma config CP0      = OFF	//ブロック0(000800−001FFFh)のコードを保護しない
    #pragma config CP1      = OFF
    #pragma config CP2      = OFF
    #pragma config CP3      = OFF
    #pragma config CPB      = OFF
    #pragma config CPD      = OFF
    #pragma config WRT0     = OFF	//ブロック0 (000800-001FFFh) の書込み保護しない
    #pragma config WRT1     = OFF
    #pragma config WRT2     = OFF
    #pragma config WRT3     = OFF
    #pragma config WRTB     = OFF	// Boot block (000000-0007FFh)の書込み保護しない
    #pragma config WRTC     = OFF	//Configuration registers (300000-3000FFh) の書込み保護しない
    #pragma config WRTD     = OFF	//Data EEPROM の書込み保護しない
    #pragma config EBTR0    = OFF	//Block 0 (000800-001FFFh) を他のブロック実行時のテーブル読み取りから保護しない
    #pragma config EBTR1    = OFF
    #pragma config EBTR2    = OFF
    #pragma config EBTR3    = OFF
    #pragma config EBTRB    = OFF	//Boot block (000000-0007FFh)を他のブロック実行時のテーブル読み取りから保護しない
    
    // プロトタイプ宣言
    void WaitTime (long cnt);
    
    // メイン関数
    void main (void)
    {
    	 short PC=0;
    	 short MC=0;
    
    
    
    	// 入出力設定
    	ADCON1  =	0b00001111;	//全チャンネルがデジタルに設定され、VDDとVSSが選択
    	TRISA   =	0b00000000;
        	TRISB   =	0b00000000;
        	TRISC   =	0b00110000;	//D-,D+(USB用)RC4とRC5を入力に設定
        	TRISD   =	0b00000000;
        	TRISE   =   0b00000011;         //SW1,2=INPUT LED=OUTPUT
        	LATA    =	0b00000000;
        	LATB    =	0b00000000;
        	LATC    =	0b00000000;
        	LATD    =	0b00000000;
        	LATE    =	0b00000000;
    
    
    	// 永久ループ
    	while(1)
    	{
    		if(PORTEbits.RE0 == 0)// SW1がONの場合
    		{
    			WaitTime (255);// 待ち時間関数の呼び出し
    			while( PORTEbits.RE0 == 0 );// SW1がONの間ループ
    			WaitTime (255);// 待ち時間関数の呼び出し
    
    			if(PC <= 1)
    			{
    				PC=16;
    			}
    			else
    			{
    				PC=PC/2;
    			}
    			PORTB = 0xFF;
    			MC=0;
    		}
    		if(PORTEbits.RE1 == 0)// SW2がONの場合
    		{
    			WaitTime (255);// 待ち時間関数の呼び出し
    			while(PORTEbits.RE1 == 0 );// SW2がONの間ループ
    			WaitTime (255);// 待ち時間関数の呼び出し
    
    			if(MC <= 1)
    			{
    				MC=16;
    			}
    			else
    			{
    				MC=MC/2;
    			}
    			PORTB = 0x00;
    			PC=0;
    		}
    		if(PC > 1)
    		{
    
    			WaitTime (2000*PC);
    			PORTB = PORTB - 1;
    		}
    		if(MC > 1)
    		{
    
    			WaitTime (2000*MC);
    			PORTB = PORTB + 1;
    		}
                    if(MC< 2 && PC < 2)
                    {
                        PORTB = 0xFF;
                    }
    
    	}
    }
    
    // 待ち時間関数
    void WaitTime ( long cnt )
    {
        short   i;
        for(i=0;i<8000;i++)
        {
    	while (cnt > 0)
    		cnt--;
        }
    }
    
     my_BinaryCounter.cの内容は以下を開いてコピーします。
    「my_BinaryCounter.cの内容」にいく。


  5. 動作確認
     動作確認の状況を以下に示します。

    (1)SW1を1回押して離すと8個のLEDがカウントアップを開始します。
    (2)SW1さらに押して離すとカウントアップが早くなります。(4回ほどで元に戻ります)
    (3)SW2を1回押して離すと8個のLEDがカウントダウンを開始します。
    (4)SW3さらに押して離すとカウントダウンが早くなります。(4回ほどで元に戻ります)

    **LEDの点滅のプログラムは容易です。
    **8個のLEDで0〜225までの数値を表示できます。











6章:外部割り込みに行く。

トップページに戻る。