12章:外部割り込み

    作成2014.03.05

  1. STEP14_Polling
    (1)STEP14_Polling
    STEP14_Pollingソースプログラムを以下に示します。
    /*****************************
     STEP14_Polling.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)
    	{
    		// LED2状態反転
    		RB1 = ~RB1;
    		
    		// 待ち時間関数の呼び出し
    		WaitTime(30000);
    		
    		// SW1がONの場合
    		if(RA0 == 0)
    		{
    			// 待ち時間関数の呼び出し(チャタリング対策)
    			WaitTime(500);
    			
    			// SW1がONの間ループ
    			while(RA0 == 0)
    				;
    			
    			// 待ち時間関数の呼び出し(チャタリング対策)
    			WaitTime(500);
    			
    			// LED1状態反転
    			RB0 = ~RB0;
    		}
    	}
    }
    
    // 待ち時間関数
    void WaitTime(int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    
     
    (2)STEP14_Pollingソースプログラムの実行
    *初期状態でLED2が点滅します。
    * SW1を押すとLED2の点滅が中断します。
    *SW1を離すとLED1が点灯しLED2が点滅します。
    *再度 SW1を押すとLED1が点灯し、LED2の点滅が中断します。
    *SW1を離すとLED1が消灯しLED2が点滅します。

    (3)ポーリングとは?
    *定期的に状態を判断し、処理を行う方法をポーリングといいます。
    *かつてはイベントループと読んでいた記憶があります。
    *監視する周期が長くなってしまった場合、応答性が低くなる問題があります。
    *STEP14_Pollingでは、WaitTime(30000);が応答性を低くします。


  2. STEP15_ExternalInterrupt
    (1)STEP15_ExternalInterruptソースプログラム
    STEP15_ExternalInterruptソースプログラムを以下に示します。
    /*****************************
     STEP15_ExternalInterrupt.c
    *****************************/
    
    #define _LEGACY_HEADERS
    
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    
    // プロトタイプ宣言
    void InitInterExt (void);
    void WaitTime (int cnt);
    
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	
    	// 入出力設定
    	TRISA = 0x21;
    	TRISB = 0x00;
    	
    	// 外部割込み設定関数の呼び出し
    	InitInterExt();
    	
    	// 割込み全体の許可
    	GIE = 1;
    	
    	// 永久ループ
    	while(1)
    	{
    		// LED2状態反転
    		RB2 = ~RB2;
    		
    		// 待ち時間関数の呼び出し
    		WaitTime(30000);
    	}
    }
    
    // 割り込みサービスルーチン
    static void interrupt isr(void)
    {
    	// LED1状態反転
    	RB1 = ~RB1;
    	
    	// 外部割込みフラグをクリア
    	INTF = 0;
    }
    
    // 外部割込み設定関数
    void InitInterExt (void)
    {
    	// RB0端子を入力端子に設定
    	TRISB0 = 1;
    	
    	// 割込み条件を立上りエッジに設定
    	INTEDG = 1;
    	
    	// 外部割込みフラグをクリア
    	INTF = 0;
    	
    	// 外部割込みの許可
    	INTE = 1;
    }
    
    // 待ち時間関数
    void WaitTime(int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    


  3. OPTIONレジスタ
    pic16f62xa.h
    unsigned char OPTION @ 0x81;
    bit INTEDG @((unsigned)&OPTION*8)+6;
    INTEDG = 1;// 割込み条件を立上りエッジに設定
    INTEDG = 0;// 割込み条件を立下がりエッジに設定


  4. INTCONレジスタ
    pic16f62xa.h
    volatile unsigned char INTCON @ 0x0B;
    volatile bit INTF @((unsigned)&INTCON*8)+1;
    INTF = 0;// 外部割込みフラグをクリア(割り込み要因が発生時1に変化)
    INTF = 1;// 外部割込みフラグをセット(0→1に変化時割り込みが発生)

    bit INTE @((unsigned)&INTCON*8)+4;
    INTE = 1;// 外部割込みの許可
    INTE = 0;// 外部割込みの禁止

    volatile bit GIE @((unsigned)&INTCON*8)+7;
    GIE = 1;// 割込み全体の許可
    GIE = 01;// 割込み全体の禁止


  5. TRISBレジスタ
    pic16f62xa.h
    volatile bit TRISB0 @((unsigned)&TRISB*8)+0;
    TRISB0 = 1;// RB0端子を入力端子に設定


  6. 割り込み処理ルーチン
    static void interrupt isr(void){}


  7. STEP15_ExternalInterruptソースプログラムの実行
    *初期状態でLED3が点滅します。
    * SW1を押してもLED3の点滅が中断しません。
    *SW1を離すとLED2が点灯しLED2が点滅します。
    *再度 SW1を押すとLED2の点灯とLED3点滅が変化しません。
    *SW1を離すとLED2が消灯しLED3が点滅します。
    * 割り込みサービスルーチンstatic void interrupt isr(void)にディレイをいれてチャタリング防止が必要です。
    *LED3の点滅のためのディレイが割り込み処理のタイミングに影響しません。
    *監視する周期に影響されないため、応答性が良くなります。









13章:音の出力に行く。

トップページに戻る。