閲覧総計:13445  (本日:1  昨日:0)

インターバルタイマ(Timer1割込み利用 16F1827 XC8)

16bitタイマーのTimer1の「割り込み」機能の使い方を確認する目的で、
Timer1割り込み機能でLEDを1秒間隔で点滅させるプログラムを作成した。
【ポイント】
1.Timer1は16bitなので細かくかつ長時間の時間制御が可能
Timer1は16bitなので、最大で65535回のカウント設定ができるので細かい時間
制御が可能。また、Time0より8倍の長時間制御が可能。
2.タイマーカウント数の設定法(1回〜65535回)
例:62500回カウントしたい場合は
  TMR1H = (-62500 >> 8);
  TMR1L = (-62500 & 0x00ff);
と-62500(マイナス表記)で記述する。
理由:Timer1は「アップカウンタ」の為、62500回カウントさせたい時は
65536(FFFF)-62500=3036で、3036を設定する事になる。
しかし-62500と記述しても同意である為、視認性の良い-62500と記述する事
とする。
【ハマりポイント】
・Timer1の場合はTimer0と異なり、
  INTCONbits.PEIE = 1; //周辺装置割り込みを許可
  INTCONbits.GIE = 1; //全体割込み許可
の2つの設定を行わなければ割り込み機能が稼働しなかった。 2014/1/4

1827led点灯画像.jpg16F1827ピン配置.JPG
/* 割り込み機能、Timer1(16bit)の操作法の確認
 * インターバルタイマー(TMR1割込み利用) 発光ダイオード(LED)を1秒間隔で点滅
 * PIC16F1827
 * XC8 v1.20
 * LED:RA1,RA2
 */
#include <xc.h>

#pragma config FOSC = INTOSC, WDTE = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#pragma config PLLEN = OFF, STVREN = OFF, LVP = OFF

//グローバル変数の定義
unsigned char cnt; //1秒作成の4回カウンタ

int main(void) {
    //PICの初期設定
    PORTA = 0b00000000; //PORTAの中身をきれいにする
    TRISA = 0b00000000; //PORTA全てを0:出力に設定
    ANSELA = 0b00000000; //AN0-AN4は全て0:デジタルI/Oとする
    OSCCON = 0b01110000; //PLL:OFF, 内部クロック8MHzで駆動

    //TMR1割り込みの初期設定
    //250ms=0.125us(8MHz)*4*プリスケーラー8*62500カウント
    T1CON = 0b00110001; //クロック ソースFosc/4, プリスケーラー8, TMR1ON
    //TMR1カウント値設定 62500回(アップカウンター)Maxは65535回
    TMR1H = (-62500 >> 8);
    TMR1L = (-62500 & 0x00ff);
    PIE1bits.TMR1IE = 1; //Timer1割り込み許可
    INTCONbits.PEIE = 1; //周辺装置割り込みを許可(Timer1の場合必要)
    INTCONbits.GIE = 1; //全体割込み許可

    //メイン処理
    LATAbits.LATA2 = 1; //RA2:パワーオンを示すLED点灯
    cnt = 0; //4回カウンター値クリア
    while(1) {
        //点滅間隔1秒(1000msec = 250msec * 4回)
        if (cnt == 4) {
            LATAbits.LATA1 = ~LATAbits.LATA1; //LED(RA1)点灯⇔消灯反転
            cnt = 0; //4回カウンター値クリア
        }
    }
}

static void interrupt isr(void) { //割り込み関数
    if(PIR1bits.TMR1IF == 1) {  //割込み種がTimer1割込みの場合
        PIR1bits.TMR1IF = 0; //Timer1割り込みフラグクリアー
        //TMR1カウント値設定 62500回(アップカウンター)Maxは1/65536回
        TMR1H = (-62500 >> 8);
        TMR1L = (-62500 & 0x00ff);

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

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

選択肢 投票
はい 9  
普通 1  
いいえ 0  
わからない 0