Sim's blog

電子工作はじめてみました

タイマー割り込みでLED点滅

2007-04-09 02:51:49 | V850
V850のユーザーズマニュアルを見ながらタイマー割り込みを使ったLEDチカチカを作ってみました。関係するのは10章 時計タイマー機能と19章 割り込み/例外処理機能です。

0.25秒毎に割り込みがはいるはずですが、メインクロックの分周なので微妙にずれています。fBRG = 5MHz / 19 / 8 = 32894.736842105263157894736842105Hzなので32768Hzと較べると0.3%くらいずれています。WTM = 0x83にすると0.5秒毎に割り込みがはいります。

SETPLL=1;のところをPLLON=0;にするとPLLがoffになるのでCPUは5MHzで動作します。
ただし点滅速度はかわりません。

__nop();を__halt();に変えてもLEDは点滅します。

WTM7 = 0にする(WTM = 0x07にする)と、サブクロックをを使用するはずですが、なぜかうまくいきません。何か初期設定とかいるのかな?
ATラボさんのキットはKDS4Lという水晶発振子でしたが、手元にあったKDS7Aをつけたのがいけなかったかもしれません

#pragma ioreg

void main( void )
{
	// CPU初期化
	VSWC = 1;
	WDTM2 = 0;

	__asm("mov 0x00, r11");
	__asm("st.b r11, PRCMD");
	__asm("st.b r11, PCC");

	while(LOCK) ;
	SELPLL = 1;		// PLL on  → 20MHz

	// LEDポート 初期化
	PMCT.6 = 0;		// 0で点灯, 1で消灯

	// タイマー設定
	PRSCM0 = 19;		// プリスケーラでfBRG = 32894Hzにする
	PRSM0 = 0x12;

	// {WTM7,WTM3,WTM2} = 101 ... fBRG使用 0.25s毎に割り込み
	WTM = 0x87;

	// 割り込み許可
	WTIC = 0;
	__EI();

	// 点滅
	while(1) __nop();
}


#pragma interrupt INTWT handler

__interrupt void handler(void)
{
	PCT.6 ^= 1;
}