見出し画像

RL78 DTCは便利だけどちょっとムズイ

APS-Web様向け寄稿記事で、
色々なMCU評価ボードでブラシレスモーターを回す
という活動をしています。

ルネサスエレクトロニクス社製
RL78/G14の実装が一通り完了しました。

前回のELCと組み合わせて、DTCも使ってみました。
結構ハマりポイントがあったので、
設定と使い方をさくっと解説します。


1. DTCとは

DTCは、周辺機能割り込みによって起動し
CPUを介さずにメモリとメモリ間の
データ転送を行う機能です。

RL78/G14 初めてのDTCより

ELCはペリフェラル間の連携動作ですが、
DTCは任意のメモリ間でデータ転送を行います。

似たような機能でDMAがありますが、
DMAと比較し柔軟なデータ転送が可能です。
詳しくは RL78/G14 初めてのDTC 7項をご覧ください。

2. 設定方法

AD変換結果を勝手に配列に並べてくれる
という動作を試してみました。

  • AD変換完了毎に、指定した配列(要素数8)にデータを転送

  • データ転送毎に配列の要素数を1追加

  • 8要素埋まったら配列の先頭要素を上書き

  • 以下繰返し

コード生成設定

DTC起動要因を設定

起動要因を"A/D変換"にします。
これでAD変換完了後にDTCが動作するようになります。

転送モードや転送アドレスを設定

DTCの動作を具体的に設定します。
リピートモードにすることで、8要素分配列が埋まったら
勝手に先頭の要素に戻ってくれます。

転送元アドレス

転送元アドレス 0xFF1F は、
AD変換結果が格納されるレジスタのアドレスです。
ユーザーマニュアルにアドレスが記載されています。

14.3.5 10ビットA/D変換結果レジスタ(ADCR)
A/D変換結果を保持する16ビットのレジスタです。
(一部省略)
変換結果の上位8ビットがFFF1FHに,
下位2ビットがFFF1EHの上位2ビットに格納されます。

RL78/G14 ユーザーズマニュアル より

アドレスの最初の"F"は、DTCの設定では省略されます。

転送先アドレス

コード上で、AD変換結果を格納する配列を定義します。

#define DMA_BUF_SIZE	8

#pragma address dtc_buf = 0x0FA000U
uint16_t __near dtc_buf[DMA_BUF_SIZE];

#pragma address dtc_buf = 0x0FA000U
で、dtc_bufという変数のアドレスを0x0FA000に配置します。

DTCの設定では最初の"F"を省略するので、
dtc_bufの転送先アドレスは 0xA000 になります。

3. RAMの配置を整理してみる

ここで一旦、RAM上にどのようなデータが
配置されたか整理してみます。
(とりあえず動けばいいよ という人は
読み飛ばしても大丈夫です)

RAM全体像

ボードに搭載されたRL78のRAMは48Kbyteで、
0xF3F00~0xFFEFFに配置されています。

RAM 48KBの内訳

転送先アドレス(バッファ)

コード上で定義した要素数8の配列です。
前項の定義にて
0xFA000~0xFA00F (16byte分)
が確保されます。

転送元アドレス

転送元バッファはRAMではなかったので、
図上には記載されていません。

DTC領域

DTCが動作するためのデータです。
この領域はe2studioのコード生成機能が
勝手に生成してくれます。

その他

汎用レジスタ等、他のブロックは
RL78に最初から割り当てられた別の機能ですので、
ここでは説明を省略します。

スタックは?

スタックはコンパイラが勝手に生成してくれます。
RAM上の空いている領域をブロックで確保します。
私の場合、
0xFA0010~0xFFD00(約24Kbyte)
が確保されていました。

4. 動作確認

モーター電流をAD変換し、
DTCで変数(dtc_buf[8])に転送します。

動作確認機材

dtc_buf をデバッガでモニタリングします。

変数の値、アドレスがわかる

右側の"アドレス"に、
変数のアドレスが表示されています。
確保した領域
0xFA000~0xFA00F (16byte分) が
きれいに並んでいます。

モーターに負荷をかけると、
電流量が増えてdtc_bufの値が減っています。
(最上位の数値が3から2に減っています)

ELCと組み合わせているので、
① タイマーRDアンダーフロー
 ▽
② AD変換開始
 ▽
③ AD変換完了
 ▽
④ AD変換結果を配列に格納
の4工程を全部勝手にやってくれます

5. 最後に

RL78は一通り触り終わりました。
この後UARTも実装しているのですが、
ネタが弱いので記事化するか迷っています。

RL78関連記事 ▼

もしこの記事があなたの役に立ったようでしたら、
みはらぼに一杯おごっていただければ幸いです。

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?