Top > R8C >小物プログラム

割り込み関連

全割り込みの許可・禁止および、割り込みレベルの設定マクロです。 ルネサスのマニュアルによると、場合によっては割り込み許可命令の前の命令が 実行される前に割り込みが許可されることがあるらしいので、 EI()の前にウエイトを挿入するなどの対策をとったほうが良いかもしれません。 ところで、このあたりのマクロは標準では用意されているような?

割込み設定
//割り込み許可
#define EI() \
	asm("FSET I")
 
//割り込み禁止
#define DI() \
	asm("FCLR I")
 
//割り込みレベル変更
#define IPL(lv) \
	asm("LDIPL %0" : : "i" (lv))
 
DI();    //割り込み禁止 
IPL(5);  //割り込みレベル変更
EI();    //割り込み許可
//対策済み?割り込み設定マクロ
#define EI() \
	asm("NOP\n\t"\
	    "NOP\n\t"\
	    "FSET I");

ディレイ関数

計算したサイクル数は間違っているかもしれませんが、おおよそ、 呼び出してから25 + (count - 1) * 10サイクルのウエイトが挿入されるはずです。

ディレイ関数
//待ちぼうけ
void wait(unsigned short count)
{
	asm("nop\n\t"
	    "nop\n\t"
	    "nop\n\t"
	    "nop\n\t"
	    "nop\n\t"
	    "nop\n\t"
	    "sbjnz.w #1,r1,_wait");
}
/*
cyc		inst		arg
---------------------------------
2		mov.w		#40, r1
8		jsr.a		_wait
	_wait:
1		nop
1		nop
1		nop
1		nop
1		nop
1		nop
4/3		sbjnz.w		#1, r1, _wait
6		rts
---------------------------------
25 + (count - 1) * 10
*/

システムクロックの変更(R8C/2x)

リセット後、R8CのCPUクロックには低速オンチップオシレータの8分周が選択されています。 水晶発振子などの外部クロックで動作させるためには、 プログラムでCPUクロックを変更してやる必要があります。 以下に高速クロックモードに遷移させるコードを示します。

システムクロックの変更
//---------- オシレータの初期化 ----------
prc0 = 1;    //レジスタのプロテクトを解除
cm06 = 1;    //クロック8分周
cm13 = 1;    //XIN-XOUT端子有効
cm05 = 0;    //XINクロック発振
wait(100);    //発振が安定するまで待ちます
ocd2 = 0;    //システムクロックXIN
cm14 = 1;    //低速オンチップオシレータ停止
cm06 = 0;    //クロック分周なし
prc0 = 0;    //プロテクトを戻す