全割り込みの許可・禁止および、割り込みレベルの設定マクロです。 ルネサスのマニュアルによると、場合によっては割り込み許可命令の前の命令が 実行される前に割り込みが許可されることがあるらしいので、 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の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; //プロテクトを戻す