PIC18F46K22でtimer2による割り込みを使用したLEDの0.5秒間隔の点滅サンプル(C言語)

icon 項目のみ表示/展開表示の切り替え

概要

PIC18F46K22 のTimer2で4ms置きに割り込みを発生させ割り込みが125回発生したらLEDを点滅させる。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
Timer1の設定方法は、PIC18 TIMER2計算を参照されたい。

プログラムの説明

メインプログラムでタイマー設定(OpenTimer2)を行いPRレジスタに周期を設定し、無限ループとする。 4m秒後にPRレジスタとタイマー値が一致し割り込みによりisr関数が起動される。 周期的に割り込ませるためにisr関数の中で再度タイマー値の設定は必要ない。

タイマー設定値

FOSC/4=16MHz
プリスケーラ 1:16
ポストスケーラ 1:16
PR2=(16000000/16/16)*0.004=250
0から250までカウントされPRレジスタとカウント値が一致した場合割り込みが発生する。
PR2レジスタを設定せず他のタイマーと同様にTMR2レジスタで初期設定もできる。

ソースファイル

以下のファイルで構成されている
timer2c1c.c ・・・ メインプログラムと割り込み処理プログラム

ソースファイルのダウンロード timer2c1c.zip


/*
 * timer2による割り込みを使用したLEDの0.5秒間隔の点滅サンプル Version 1.00
 * File:        timer2c1.c
 * Target:      PIC18F46K22 64MHz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2014/02/08 08:40
 *
 * 接続
 *   RB5 lowを出力すると点灯
 */

#include <p18f46k22.h>
#include <plib\timers.h>

#pragma config  FOSC = HSHP,PRICLKEN=ON,PLLCFG=ON,WDTEN=OFF,LVP=OFF

#define LED0 PORTBbits.RB5

void  interrupt isr(void);  //  4ms置きの割り込み処理ルーチン

void main(void) {
    ANSELBbits.ANSB5=0;
    TRISBbits.RB5=0;

    OpenTimer2(TIMER_INT_ON  & T2_PS_1_16 & T2_POST_1_16);

    PR2=250;    //  4ms
    PIE1bits.TMR2IE=1;
    INTCONbits.PEIE=1;  //  拡張周辺割り込み有効化
    INTCONbits.GIE=1;

    for(;;);
}

//  10ms置きの割り込み処理ルーチン

void  interrupt isr(void){
    static unsigned char n=0;
    PIR1bits.TMR2IF=0;
    if(125<n){   //  4ms*125=500ms
        n=0;
        LED0 = ~LED0;
    }else
        ++n;
}