Timerより作ったDelay関数が動かない

Hi、武です。

今RL78マイコンを勉強しています。RL78/G12で規定された時間にLEDを点灯したい。ですので時間のDelay関数が必要かなと思います。

使用環境CS+ for CA/CXです。タイマのチャンネル2を使い、インターバル時間は1msを設定しています。

r_cg_timer_user.cのコード:

uint16_t counter_timer2 = 0;

__interrupt static void r_tau0_channel2_interrupt(void)
{
counter_timer2 ++;
}

中断ファイルc_cg_intc_user.cのコード:

extern uint16_t counter_timer2;

void delay_ms_1(uint16_t dlms)
{
counter_timer2 = 0;
R_TAU0_Channel2_Start();
while(counter_timer2 < dlms);
R_TAU0_Channel2_Stop();
}

ただし、動かないです。理由はタイマが起動されでも、void delay_ms_1のWhileのcounter_timer2 が変わらない。0のままです。Loopから抜かれないです。

どう修正すれば正しいDelayができるか教えていただきたいと思います。

  • チョコです。

    実は、紹介したサンプルコードは、多重割り込みを使用しないで、同じようなことを実現しようとしています。下に示すINTP0割り込み処理の中で、タイマ割り込みをHALTモードの解除に利用して、タイマ割り込みでの実処理部を普通の関数にしてあるので、その関数を呼び出すことで、INTP0割り込み処理の中で、タイマ割り込み処理を実現しています。

    個人的には、このようなやり方(長い期間割り込み処理の中に留まる)は好きではない(と言うよりやってはいけない)のですが、このようなことを行えば(サンプルコードを参考にすれば)、武さんのやりたいことはそれほど難しくなく実現はできますよ。

    それよりは、多重割り込みを使いこなす方が常道です。

    以上