14章:タイマ0割り込み

    作成2014.03.07

  1. STEP17_Timer0Interrupt
    (1)STEP17_Timer0Interrupt
    STEP17_Timer0Interruptソースプログラムを以下に示します。
    /*****************************
     STEP17_Timer0Interrupt.c
    *****************************/
    
    #define _LEGACY_HEADERS
    
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    
    // プロトタイプ宣言
    void InitInterTimer0 (void);
    void WaitTime (int cnt);
    
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	
    	// 入出力設定
    	TRISA = 0x20;
    	TRISB = 0x00;
    	
    	// タイマ0割込み設定関数の呼び出し
    	InitInterTimer0();
    	
    	// 割込み全体の許可
    	GIE = 1;
    	
    	// 永久ループ
    	while(1)
    	{
    		// LED1状態反転
    		RB1 = ~RB1;
    		
    		// 待ち時間関数の呼び出し
    		WaitTime(30000);
    	}
    }
    
    // 割込みサービスルーチン
    static void interrupt isr()
    {
    	// スピーカに入力する電圧レベルを反転
    	RB0 = ~RB0;
    	
    	// タイマ0割込みフラグをクリア
    	T0IF = 0;
    }
    
    // タイマ0割込み設定関数
    void InitInterTimer0 (void)
    {
    	// クロック源を内部クロックに設定
    	T0CS = 0;
    	
    	// プリスケーラをタイマ0に割り当て
    	PSA = 0;
    	
    	// プリスケーラ値を2に設定
    	PS2 = 0;
    	PS1 = 0;
    	PS0 = 0;
    	
    	// TMR0レジスタをクリア
    	TMR0 = 0x00;
    	
    	// タイマ0割込みフラグをクリア
    	T0IF = 0;
    	
    	// タイマ0割込みの許可
    	T0IE = 1;
    }
    
    // 待ち時間関数の呼び出し
    void WaitTime (int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    


  2. TMR0レジスタ
    pic16f62xa.h
    volatile unsigned char TMR0 @ 0x01;
    *タイマ0の場合、TMR0レジスタにクロックが与えられる。
    *クロックが与えられるとレジスタは1がプラスされる。
    *TMR0レジスタが255のとき、さらにクロックが与えられるとオーバーフローが発生する。
    *オーバーフローが発生すると割り込みが発生する。


  3. タイマークロック源の設定
    T0CS = 0;// クロック源を内部クロックに設定
    pic16f62xa.h
    unsigned char OPTION @ 0x81;
    bit T0CS @((unsigned)&OPTION*8)+5;
    T0CS: TMR0 Clock Source Select bit
    1 = Transition on RA4/T0CKI pin
    0 = Internal instruction cycle clock (CLKOUT)


  4. タイマーの選択
    PSA = 0;// プリスケーラをタイマ0に割り当て
    pic16f62xa.h
    unsigned char OPTION @ 0x81;
    bit PSA @((unsigned)&OPTION*8)+3;
    PSA: Prescaler Assignment bit
    1 = Prescaler is assigned to the WDT
    0 = Prescaler is assigned to the Timer0 module


  5. クロック周期の設定
    PS2 = 0;PS1 = 0;PS0 = 0;// プリスケーラ値を2に設定
    pic16f62xa.h
    unsigned char OPTION @ 0x81;
    bit PS0 @((unsigned)&OPTION*8)+0;
    bit PS1 @((unsigned)&OPTION*8)+1;
    bit PS2 @((unsigned)&OPTION*8)+2;
    PS2:PS0: Prescaler Rate Select bits
    Bit ValueTMR0 RateWDT Rate
    01 : 21 : 1
    11 : 41 : 2
    101 : 81 : 4
    111 : 161 : 8
    1001 : 321 : 16
    1011 : 641 : 32
    1101 : 1281 : 64
    1111 : 2561 : 128
    *クロック周波数=基本周波数(4MHz)/(4×プリスケーラ値)=500kHzとなります。


  6. TMR0レジスタをクリア
    TMR0 = 0x00;// TMR0レジスタをクリア
    pic16f62xa.h
    volatile unsigned char TMR0 @ 0x01;


  7. 割込み全体の許可
    GIE = 1;// 割込み全体の許可
    pic16f62xa.h
    volatile unsigned char INTCON @ 0x0B;
    volatile bit GIE @((unsigned)&INTCON*8)+7;
    GIE: Global Interrupt Enable bit
    1 = Enables all unmasked interrupts
    0 = Disables all interrupts


  8. タイマ0割込みの許可
    T0IE = 1;// タイマ0割込みの許可
    pic16f62xa.h
    volatile unsigned char INTCON @ 0x0B;
    bit T0IE @((unsigned)&INTCON*8)+5;
    T0IE: TMR0 Overflow Interrupt Enable bit
    1 = Enables the TMR0 interrupt
    0 = Disables the TMR0 interrupt


  9. タイマ0割込みフラグをクリア
    T0IF = 0;// タイマ0割込みフラグをクリア
    pic16f62xa.h
    volatile unsigned char INTCON @ 0x0B;
    volatile bit T0IF @((unsigned)&INTCON*8)+2;
    T0IF: TMR0 Overflow Interrupt Flag bit
    1 = TMR0 register has overflowed (must be cleared in software)
    0 = TMR0 register did not overflow


  10. STEP17_Timer0Interruptソースプログラムの実行
    *RB0に接続したスピーカが鳴り、RB1に接続したLEDが点滅します。









15章:タイマCCP割り込みに行く。

トップページに戻る。