15章:タイマCCP割り込み

    作成2014.03.08

  1. STEP18_CompareMode
    (1)STEP18_CompareModeソースプログラム
    STEP18_CompareModeソースプログラムを以下に示します。
    /*****************************
     STEP18_CompareMode.c
    *****************************/
    
    #define _LEGACY_HEADERS
    
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    
    // プロトタイプ宣言
    void InitInterCCP (void);
    void InitTimer1 (void);
    void WaitTime (int cnt);
    
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	
    	// 入出力設定
    	TRISA = 0x20;
    	TRISB = 0x00;
    	
    	// CCP割込み設定関数の呼び出し
    	InitInterCCP();
    	
    	// タイマ1設定関数の呼び出し
    	InitTimer1();
    	
    	// 周辺機能割込みの許可
    	PEIE = 1;
    	
    	// 全体の割込み許可
    	GIE = 1;
    	
    	// 永久ループ
    	while(1)
    	{
    		// LED1状態反転
    		RB1 = ~RB1;
    		
    		// 待ち時間関数の呼び出し
    		WaitTime(30000);
    	}
    }
    
    // 割込みサービスルーチン
    static void interrupt isr(void)
    {
    	// スピーカに入力する電圧レベルを反転
    	RB0 = ~RB0;
    	
    	// CCP割込みフラグをクリア
    	CCP1IF = 0;
    }
    
    // CCP割込み設定関数
    void InitInterCCP (void)
    {
    	// CCPのモードをコンペアモード(CCP割込み + TMR1クリア)に設定
    	CCP1CON = 0b00001011;
    	
    	// CCPRレジスタの設定(周期1911μ秒)
    	CCPR1H = 0b00000111;
    	CCPR1L = 0b01110111;
    	
    	// CCP割込みフラグをクリア
    	CCP1IF = 0;
    	
    	// CCP割込みの許可
    	CCP1IE = 1;
    }
    
    // タイマ0設定関数
    void InitTimer1 (void)
    {
    	// クロック源を内部クロックに設定
    	TMR1CS = 0;
    	
    	// プリスケーラ値を1に設定
    	T1CKPS1 = 0;
    	T1CKPS0 = 0;
    	
    	// TMRレジスタをクリア
    	TMR1H = 0;
    	TMR1L = 0;
    	
    	// タイマ1起動
    	TMR1ON = 1;
    }
    
    // 待ち時間関数の呼び出し
    void WaitTime(int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    


  2. CCP1CONレジスタ
    CCP1CON = 0b00001011;// CCPのモードをコンペアモード(CCP割込み + TMR1クリア)に設定
    pic16f62xa.h
    volatile unsigned char CCP1CON @ 0x17;
    bit CCP1M0 @((unsigned)&CCP1CON*8)+0;
    bit CCP1M1 @((unsigned)&CCP1CON*8)+1;
    bit CCP1M2 @((unsigned)&CCP1CON*8)+2;
    bit CCP1M3 @((unsigned)&CCP1CON*8)+3;
    CCP1M3:CCP1M0: CCPx Mode Select bits
    0000 = Capture/Compare/PWM off (resets CCP1 module)
    0100 = Capture mode, every falling edge
    0101 = Capture mode, every rising edge
    0110 = Capture mode, every 4th rising edge
    0111 = Capture mode, every 16th rising edge
    1000 = Compare mode, set output on match (CCP1IF bit is set)
    1001 = Compare mode, clear output on match (CCP1IF bit is set)
    1010 = Compare mode, generate software interrupt on match (CCP1IF bit is set, CCP1 pin isunaffected)
    1011 = Compare mode, trigger special event (CCP1IF bit is set; CCP1 resets TMR1)
    11xx = PWM mode

    volatile bit CCP1Y @((unsigned)&CCP1CON*8)+4;
    volatile bit CCP1X @((unsigned)&CCP1CON*8)+5;
    CCP1X:CCP1Y: PWM Least Significant bits(PWMモードの時有効)
    Capture Mode: Unused
    Compare Mode: Unused
    PWM Mode: These bits are the two LSbs of the PWM duty cycle. The eight MSbs are found in CCPRxL.


  3. CCPRレジスタの設定(周期1911μ秒)
    *10進の1911は2進の00000111 01110111です。
    CCPRレジスタの設定(周期1911μ秒)は
    CCPR1H = 0b00000111;
    CCPR1L = 0b01110111;
    となります。
    pic16f62xa.h
    volatile unsigned char CCPR1L @ 0x15;
    volatile unsigned char CCPR1H @ 0x16;
    音程ファ
    周波数(Hz)261.6293.6329.6349.2392440493.8523.3
    1/2周期(μs)1911170215161432127611361013955
    16進値077706A605EC059704FB047003F403BB


  4. T1CONレジスタ
    pic16f62xa.h
    volatile unsigned char T1CON @ 0x10;

    TMR1ON = 1;// タイマ1起動
    bit TMR1ON @((unsigned)&T1CON*8)+0;
    TMR1ON: Timer1 On bit
    1 = Disables Timer1
    0 = Stops Timer1

    TMR1CS = 0;// クロック源を内部クロックに設定
    bit TMR1CS @((unsigned)&T1CON*8)+1;
    TMR1CS: Timer1 Clock Source Select bit
    1 = External clock from pin RB6/T1OSO/T1CKI (on the rising edge)
    0 = Internal clock (FOSC/4)

    // プリスケーラ値を1に設定
    T1CKPS1 = 0;
    T1CKPS0 = 0;
    bit T1CKPS0 @((unsigned)&T1CON*8)+4;
    bit T1CKPS1 @((unsigned)&T1CON*8)+5;
    T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
    11 = 1:8 Prescale value
    10 = 1:4 Prescale value
    01 = 1:2 Prescale value
    00 = 1:1 Prescale value

    bit T1SYNC @((unsigned)&T1CON*8)+2;
    bit T1OSCEN @((unsigned)&T1CON*8)+3;

    *クロック周波数=基本周波数(4MHz)/(4×プリスケーラ値)=1MHzとなります。


  5. TMR1レジスタ
    *TMR1HレジスタとTMR1Lレジスタを組み合わせた仮想レジスタです。
    pic16f62xa.h
    volatile unsigned char TMR1L @ 0x0E;
    volatile unsigned char TMR1H @ 0x0F;
    // TMRレジスタをクリア
    TMR1H = 0;
    TMR1L = 0;


    // 周辺機能割込みの許可
    PEIE = 1;
    // 全体の割込み許可
    GIE = 1;
    // CCP割込みフラグをクリア
    CCP1IF = 0;


    // CCP割込みフラグをクリア
    CCP1IF = 0;

    // CCP割込みの許可
    CCP1IE = 1;


  6. PIR1レジスタ
    CCP1IF = 0;// CCP割込みフラグをクリア
    pic16f62xa.h
    volatile unsigned char PIR1 @ 0x0C;
    volatile bit CCP1IF @((unsigned)&PIR1*8)+2;
    CCP1IF: CCP1 Interrupt Flag bit
    Capture Mode
    1 = A TMR1 register capture occurred (must be cleared in software)
    0 = No TMR1 register capture occurred
    Compare Mode
    1 = A TMR1 register compare match occurred (must be cleared in software)
    0 = No TMR1 register compare match occurred
    PWM Mode
    Unused in this mode

    7.PIE1レジスタ
    CCP1IE = 1;// CCP割込みの許可
    pic16f62xa.h
    unsigned char PIE1 @ 0x8C;
    bit CCP1IE @((unsigned)&PIE1*8)+2;
    CCP1IE: CCP1 Interrupt Enable bit
    1 = Enables the CCP1 interrupt
    0 = Disables the CCP1 interrupt


  7. PIE1レジスタ
    CCP1IE = 1;// CCP割込みの許可
    pic16f62xa.h
    unsigned char PIE1 @ 0x8C;
    bit CCP1IE @((unsigned)&PIE1*8)+2;
    CCP1IE: CCP1 Interrupt Enable bit
    1 = Enables the CCP1 interrupt
    0 = Disables the CCP1 interrupt


  8. INTCONレジスタ
    PEIE = 1;// 周辺機能割込みの許可
    pic16f62xa.h
    volatile unsigned char INTCON @ 0x0B;
    bit PEIE @((unsigned)&INTCON*8)+6;
    PEIE: Peripheral Interrupt Enable bit
    1 = Enables all unmasked peripheral interrupts
    0 = Disables all peripheral interrupts


  9. 割込み全体の許可
    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


  10. STEP17_Timer0Interruptソースプログラムの実行
    *RB0に接続したスピーカが鳴り、RB1に接続したLEDが点滅します。
    *STEP18_CompareModeソースプログラムでは正確な音程設定が可能です。









16章:LEDの明るさ調節(PWM制御)に行く。

トップページに戻る。