かふぇルネにも投稿しましたが、RL78のタイマアレイユニット(TAU)、ワンショット動作について私の誤解がありました。
一般的にタイマはタイマスタート(TS)をセットすると動作開始するのですが、RL78のタイマアレイユニットでは動作モードによってスタートフラグセット時の動きが異なります。RL78はタイマイネーブル(TE)との絡みがあるためです。
今回取り上げたワンショット動作(U0 CH2:master/CH3:slave SoftTriger)についてはCubeSuite+のコード生成は
void R_TAU0_Channel2_Start(void) { TOE0 |= _0008_TAU_CH3_OUTPUT_ENABLE; TS0 |= _0004_TAU_CH2_START_TRG_ON | _0008_TAU_CH3_START_TRG_ON; } ~中略~ void R_TAU0_Channel2_Set_SoftwareTriggerOn(void) { TS0 |= _0004_TAU_CH2_START_TRG_ON; }
以上のように出力します。これはマニュアルの
タイマ動作停止(TEmn = 0)の状態で,TSmnビットに1を書き込むことによりスタート・トリガ待ち状態となります。 スタート・トリガ検出後,カウント・クロック発生まで何も動作しません。 最初のカウント・クロックでTDRmnレジスタの値をTCRmnレジスタにロードし,以降のカウント・クロックでダウン・カウント動作を行います。
によるものです。
R_TAU0_Channel2_Start()内で直接タイマイネーブル(TE)を制御したいところですが、このレジスタはReadOnlyのため、そうもいかないようです。
実際にワンショット動作として稼働させるには
- R_TAU0_Channel2_Start()
- R_TAU0_Channel2_Set_SoftwareTriggerOn()
タイマイネーブル(TE)のセット
ワンショットタイマのスタート
の順番で呼び出す必要があります。
中身を見ると同じタイマスタート(TS)レジスタを操作しているわけですが、前述の通り、1回目のタイマスタート(TS)のセットはタイマイネーブル(TE)をセットしタイマを動作可能状態にするだけで実際にはタイマは動いていません。2回目以降のタイマスタート(TS)のセットでワンショット動作が始まります。尚、ワンショット動作はCH2をmasterに、CH3をslaveに設定しているため2回目以降にセットするのはCH2だけです。
仮に2回目以降もR_TAU0_Channel2_Start()をcallしてCH2/CH3のタイマスタート(TS)をセットすると下記動作になってしまいます。
本来ならActtiveがCH2、in-ActiveがCH3であるのに対し、CH2/CH3が同時にスタートしているので必要な時間がとれなくなっています。
皆様もタイマアレイユニット(TAU)を利用する際はご注意ください。