山本ワールド
PIC18F46K22でtimer1による割り込みを使用したLEDの0.5秒間隔の点滅サンプル(C言語)
概要
PIC18F46K22 のTimer1で25ms置きに割り込みを発生させ割り込みが20回発生したらLEDを点滅させる。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
Timer1の設定方法は、PIC18 TIMER1計算を参照されたい。
プログラムの説明
メインプログラムでタイマー設定(OpenTimer1,WriteTimer1)を行い、無限ループとする。 25m秒後に割り込みによりisr関数が起動される。 周期的に割り込ませるためにisr関数の中で再度タイマー値の初期値の設定(WriteTimer1)を行う。
プリスケーラ 1:8
初期時及びオーバーフロー割り込み(タイマー値が65535から0になった時発生)時に下記の値を設定すると
TMR1=65536-(16000000/8)*0.025=15536
15536から65535までカウントされオーバーフローごとに割り込みが発生する。すなわち65536-15536=50000周期となる。
TMR1を設定しない場合は、0~65535までカウントされるので、1/(16000000/8)*65536=0.032768秒ごとの割り込みとなる。
タイマー設定値
FOSC/4=16MHzプリスケーラ 1:8
初期時及びオーバーフロー割り込み(タイマー値が65535から0になった時発生)時に下記の値を設定すると
TMR1=65536-(16000000/8)*0.025=15536
15536から65535までカウントされオーバーフローごとに割り込みが発生する。すなわち65536-15536=50000周期となる。
TMR1を設定しない場合は、0~65535までカウントされるので、1/(16000000/8)*65536=0.032768秒ごとの割り込みとなる。
ソースファイル
以下のファイルで構成されているtimer1c1c.c ・・・ メインプログラムと割り込み処理プログラム
ソースファイルのダウンロード timer1c1c.zip
/*
* timer1による割り込みを使用したLEDの0.5秒間隔の点滅サンプル Version 1.00
* File: timer1c1.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
#define TMR1SET 15536 // 25ms
void interrupt isr(void); // 25ms置きの割り込み処理ルーチン
void main(void) {
ANSELBbits.ANSB5=0;
TRISBbits.RB5=0;
OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_FOSC_4 & T1_PS_1_8 & T1_OSC1EN_OFF,TIMER_GATE_OFF & TIMER_GATE_INT_OFF );
WriteTimer1(TMR1SET);
PIE1bits.TMR1IE=1;
INTCONbits.PEIE=1; // 拡張周辺割り込み有効化
INTCONbits.GIE=1;
for(;;);
}
// 25ms置きの割り込み処理ルーチン
void interrupt isr(void){
static unsigned char n=0;
PIR1bits.TMR1IF=0;
WriteTimer1(TMR1SET);
if(20<n){ // 25ms*20=500ms
n=0;
LED0 = ~LED0;
}else
++n;
}
Copyright (C) 2012 山本ワールド All Rights Reserved.