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ができるか教えていただきたいと思います。
割り込みハンドラは呼び出されていますね?
最適化が有効の場合、ファイルをまたいでの最適化でcounter_timer2が考慮されず、counter_timer2が0なのでwile文はwhile(0<dlms)として展開されていると考えられます。もしくは割り込みハンドラのインクリメントが参照がないので消されているかも。volatile宣言を追加すると解決するかもしれません。uint16_t counter_timer2 = 0;
↓volatile uint16_t counter_timer2 = 0;
Yamamotoさん、ご回答ありがとうございます。
1)割り込みハンドラを呼び出しています。
void main(void){ R_MAIN_UserInit(); /* Start user code. Do not edit comment generated here */ R_KEY_Start(); while (1U) { ; } /* End user code. Do not edit comment generated here */}
中断ファイル:
__interrupt static void r_key_interrupt(void){ /* Start user code. Do not edit comment generated here */ LED1 = 1; delay_ms_1(1000); LED1 = 0; KRIF = 0U; /* End user code. Do not edit comment generated here */}
2) volatile宣言も試しました。効果がなかった。