TOPMPLAB C18編(PIC18F1320)> LEDを点滅させる(TMR0割り込み)> ソース

LEDを点滅させる(ソース)

−TMR0割り込み−(C18)
(PIC18F1320)

更新日2009.3.28

以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。

// ========================== ここから ==============================
//ファイル名	led_onoff_T0.c
//作成日	2009.3.1
//作成者	mit.ueno
//バージョン	1.0
//コンパイラ	MPLAB C18
//PIC	PIC18F1320
//クロック	INTIO2(8MHz)
//概要
//	RB0,1のLEDを0.5秒間隔で点滅させる
//使用ポート
//	RB0:LED
//	RB1:LED
//TMR0
//	IPEN = 0   (priority disabled)
//	T08BIT = 1 (8bit mode)
//	presc = 64
//	TMR0L = 256
//	割込み : (1/8MHz)*4*256*64 = 8.192mS
//


#include <p18f1320.h>

#pragma config OSC = INTIO2
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config MCLRE = OFF

void timer_isr (void);
static unsigned char Cnt500mS;
static struct {
	unsigned flag500mS:1;
	unsigned :7;
} flag;

#pragma code low_vector=0x8
void low_interrupt (void) {
	_asm
		GOTO timer_isr
	_endasm
}
#pragma code

#pragma interruptlow timer_isr
void timer_isr (void) {
	INTCONbits.TMR0IF = 0;
	if (!(Cnt500mS--)) {
		Cnt500mS = 61;	// 8.192mS * 61 = 499.7mS
		flag.flag500mS = 1;
	}
}

void main (void) {
	OSCCON = 0x72;	// INTOSC,8MHz
	TRISB = 0xFC;	// RB0,1 output
	ADCON1 = 0x7F;	// AD未使用
	PORTB = 0;
	T0CON = 0xC5;	// TMR0有効,8ビット内部クロック,プリスケーラ64
	TMR0L = 0;
	Cnt500mS = 61;	// 8.192mS * 61 = 499.7mS
	flag.flag500mS = 0;

	INTCONbits.TMR0IE = 1;	// TMR0割込み許可
	INTCONbits.GIE = 1;	// 全割込み許可

	PORTBbits.RB1 = 1;

	while (1) {
		if (flag.flag500mS) {
			flag.flag500mS = 0;

			if (PORTBbits.RB0) {
				LATBbits.LATB0 = 0;
				LATBbits.LATB1 = 1;
			} else {
				LATBbits.LATB0 = 1;
				LATBbits.LATB1 = 0;
			}
		}
	}
}
// ========================== ここまで ==============================