11章:スイッチ(2)

    作成2014.03.04

  1. STEP13_BinaryCounter
    (1)STEP13_BinaryCounter
    STEP13_BinaryCounterソースプログラムを以下に示します。
    /*****************************
     STEP13_BinaryCounter.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 = 0b00101111;
    	TRISB = 0x00;
    	
    	// 永久ループ
    	while(1)
    	{
    		// SW1がONの場合
    		if(RA0 == 0)
    		{
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// SW1がONの間ループ
    			while( RA0 == 0 )
    				;
    			
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// PORTレジスタの値が0ではない場合
    			if(PORTB != 0b00000000)
    			{
    				// PORTBレジスタを1マイナスする
    				PORTB = PORTB - 1;
    			}
    		}
    		// SW2がONの間
    		else if(RA1 == 0)
    		{
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// SW2がONの間ループ
    			while(RA1 == 0)
    				;
    			
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// 
    			if(PORTB != 0b11111111)
    			{
    				// PORTBレジスタを1プラスする
    				PORTB = PORTB + 1;
    			}
    		}
    		
    		// SW3がONの間
    		else if(RA2 == 0)
    		{
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// SW3がONの間ループ
    			while(RA2 == 0)
    				;
    			
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// PORBレジスタをクリア
    			PORTB = 0b00000000;
    		}
    		// SW4がONの間
    		else if(RA3 == 0)
    		{
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// SW4がONの間ループ
    			while(RA3 == 0)
    				;
    			
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// PORTBレジスタに255を代入
    			PORTB = 0b11111111;
    		}
    	}
    }
    
    // 待ち時間関数
    void WaitTime ( int cnt )
    {
    	while (cnt > 0)
    		cnt--;
    }
    
     
    (2)STEP13_BinaryCounterソースプログラムの実行
    * SW1を1回押すとLEDの2進表示値が1だけ増加します。
    *SW2を1回押すとLEDの2進表示値が1だけ減少します。
    *SW3を押すとLEDの2進表示値が0b11111111となります。
    *SW4を押すとLEDの2進表示値が0b00000000となります。


  2. STEP13_RisingEdgeFailed
    (1)STEP13_RisingEdgeFailedソースプログラム
    STEP13_RisingEdgeFailedソースプログラムを以下に示します。
    /*****************************
     STEP13_RisingEdgeFailed.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 = 0b00101111;
    	TRISB = 0x00;
    	
    	// 永久ループ
    	while(1)
    	{
    		// SW1がONの場合
    		if( RA0 == 0 )
    		{
    			// SW1がONの間ループ
    			while( RA0 == 0 )
    				;
    			
    			// LED1状態反転
    			RB0 = ~RB0;
    		}
    	}
    }
    
     
    (2)STEP13_RisingEdgeFailedソースプログラムの実行
    *SW1入力信号のRA0の電圧変化とLED1出力信号のRB0の電圧変化を測定した結果を図11-1に示します。

     図11-1からSW1のチャタリングによりLED1の出力が誤動作することが確認できます。

  3. STEP13_RisingEdgeSuccessful
    (1)STEP13_RisingEdgeSuccessfulソースプログラム
    STEP13_RisingEdgeSuccessfulソースプログラムを以下に示します。
    /*****************************
     STEP13_RisingEdgeSuccessful.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 = 0b00100011;
    	TRISB = 0x00;
    	
    	// 永久ループ
    	while(1)
    	{
    		// SW1がONの場合
    		if(RA0 == 0)
    		{
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// SW1がONの間ループ
    			while (RA0 == 0)
    				;
    			
    			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
    			WaitTime (500);
    			
    			// 
    			RB0 = ~RB0;
    		}
    	}
    }
    
    // 待ち時間関数
    void WaitTime ( int cnt )
    {
    	while (cnt > 0)
    		cnt--;
    }
    
     
    (2)STEP13_RisingEdgeSuccessfulソースプログラムの実行
    *SW1入力信号のRA0の電圧変化とLED1出力信号のRB0の電圧変化を測定した結果を図11-2に示します。

     図11-2からSW1のチャタリングによるLED1出力の誤動作を約10msのディレイで防止することが確認できます。









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

トップページに戻る。