閲覧総計:20486  (本日:1  昨日:2)

【目次】(項目をクリックすると、そこへ飛べます)


インターバルタイマ(TMR0割込み利用)

割り込み機能とTimer0の操作法の確認の為、基本機能だけのプログラムを作成し、稼働を
確認した。
また、HI-TECH C PRO(Lite mode)の割り込み機能のプログラミングの仕方を確認する為
プログラムを作成し、動作を確認した。  08/08/15

P1010641.JPG16F886.JPG

MikroCのプログラム

/**
* 割り込み機能、Timer0の操作法の確認
* インターバルタイマ(TMR0割込み利用) 発光ダイオード(LED)を1秒間隔で点滅
*
* RC2: LED
* PIC16F668 内臓発振器4MHz
*
* Device Flags:
* _INTRC_OSC_NOCLKOUT _WDT_OFF _PWRTE_ON _MCLRE_OFF
* _CP_OFF _CPD_OFF _BOR_OFF _IESO_ON _FCMEN_ON 
* _LVP_OFF _DEBUG_ON _BOR21V _WRT_OFF
*
* MikroC v8.1.0
* file name:timer0.c  08/08/15
*/

//グローバル変数の定義
unsigned int cnt; //200回カウンタ

void
main(void)
{
    //PICの初期化
    TRISC = 0b00000000; //PORTC 8個全て0:出力に設定
    OSCCON = 0b01100000; //内蔵発振器 4MHz使用に設定
    // A/D利用PORTの設定 // ANALOG=1, DIGITAL=0 //
    ANSEL = 0b00000000; //AN4-0ピンはデジタルで使用
    ANSELH = 0b00000000; //AN13-8ピンはデジタルで使用
    PORTC = 0b00000000; //PORTCの中身をきれいにする
    //PICの初期化終わり

    OPTION_REG = 0b0100; //プリスケーラ値設定0b0100(=32回)
    TMR0 = -160; //TMR0カウント値設定 160回(アップカウンタ)
    INTCON.T0IE = 1; //タイマ割込み許可
    INTCON.GIE = 1; //全体割込み許可

    cnt = 0; //200回カウンタ値クリア

    while (1)
    {
        //点滅間隔1秒(=5msec * 200回)
        if (cnt == 200)
        {
            PORTC.F2 = ~PORTC.F2; //LED(RC2)点灯⇔消灯反転
            cnt = 0; //200回カウンタ値クリア
        }
    }
}

void
interrupt() //割込み関数
{
    //5msecインターバルタイマ
    if (INTCON.T0IF) //割込み種がTimer0割込みの場合
    {
        INTCON.T0IF = 0; //割込みフラグクリア
        TMR0 = -160; //TMR0カウント値再設定 160回(アップカウンタ)

        cnt++; //200回カウンタ カウントアップ
    }
}

★この情報は役に立ちましたか?

選択肢 投票
はい 13  
普通 7  
いいえ 10  

HI-TECH C PRO(Lite mode)のプログラム

/**
* 割り込み機能、Timer0の操作法の確認
* インターバルタイマ(TMR0割込み利用) 発光ダイオード(LED)を1秒間隔で点滅
*
* RC2: LED
* PIC16F668 内臓発振器4MHz
*
* HI-TECH C PRO PIC10/12/16 MCU Family(Lite mode) v9.60
* MPLAB v8.14
* file name:timer0.c  08/08/10
*/
#include <htc.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT 
& DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS & DEBUGEN);
__CONFIG(BORV21);

//グローバル変数の定義
unsigned int cnt; //200回カウンタ

void
main(void)
{
    //PICの初期化
    TRISC = 0b00000000; //PORTC 8個全て0:出力に設定
    OSCCON = 0b01100000; //内蔵発振器 4MHz使用に設定
    // A/D利用PORTの設定 // ANALOG=1, DIGITAL=0 //
    ANSEL = 0b00000000; //AN4-0ピンはデジタルで使用
    ANSELH = 0b00000000; //AN13-8ピンはデジタルで使用
    PORTC = 0b00000000; //PORTCの中身をきれいにする
    //PICの初期化終わり
        
    OPTION = 0b0100; //プリスケーラ値設定0b0100(=32回)
    TMR0 = -160; //TMR0カウント値設定 160回(アップカウンタ)
    T0IE = 1; //タイマ割込み許可
    GIE = 1; //全体割込み許可
    
    cnt = 0; //200回カウンタ値クリア
    
    while (1)
    {
        //点滅間隔1秒(=5msec * 200回)
        if (cnt == 200)
        {
            PORTC = (~PORTC & 0b00000100); //LED(RC2)点灯⇔消灯反転
            cnt = 0; //200回カウンタ値クリア
        }
    }
}

void interrupt
timer0_isr(void) //割込み関数
{
    //5msecインターバルタイマ
    if (T0IF) //割込み種がTimer0割込みの場合
    {
        T0IF = 0; //割込みフラグクリア
        TMR0 = -160; //TMR0カウント値再設定 160回(アップカウンタ)

        cnt++; //200回カウンタ カウントアップ
    }
}

★この情報は役に立ちましたか?

選択肢 投票
はい 15  
普通 3  
いいえ 2  

添付ファイル: fileP1010641.JPG 1987件 [詳細] file16F886.JPG 2182件 [詳細]