PIC18F46K22でtimer2による割り込みを使用したLEDの0.5秒間隔の点滅サンプル(C言語)
概要
プログラムの説明
メインプログラムでタイマー設定(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;
}