![見出し画像](https://assets.st-note.com/production/uploads/images/111798480/rectangle_large_type_2_a46155e50da2d431a67e2f627d758ea1.jpeg?width=1200)
RL78 DTCは便利だけどちょっとムズイ
APS-Web様向け寄稿記事で、
色々なMCU評価ボードでブラシレスモーターを回す
という活動をしています。
ルネサスエレクトロニクス社製
RL78/G14の実装が一通り完了しました。
前回のELCと組み合わせて、DTCも使ってみました。
結構ハマりポイントがあったので、
設定と使い方をさくっと解説します。
1. DTCとは
DTCは、周辺機能割り込みによって起動し
CPUを介さずにメモリとメモリ間の
データ転送を行う機能です。
ELCはペリフェラル間の連携動作ですが、
DTCは任意のメモリ間でデータ転送を行います。
似たような機能でDMAがありますが、
DMAと比較し柔軟なデータ転送が可能です。
詳しくは RL78/G14 初めてのDTC 7項をご覧ください。
2. 設定方法
AD変換結果を勝手に配列に並べてくれる
という動作を試してみました。
AD変換完了毎に、指定した配列(要素数8)にデータを転送
データ転送毎に配列の要素数を1追加
8要素埋まったら配列の先頭要素を上書き
以下繰返し
コード生成設定
![](https://assets.st-note.com/img/1690429167002-TibgU0pf9c.jpg?width=1200)
起動要因を"A/D変換"にします。
これでAD変換完了後にDTCが動作するようになります。
![](https://assets.st-note.com/img/1690429483922-5F1U4eDfpi.jpg)
DTCの動作を具体的に設定します。
リピートモードにすることで、8要素分配列が埋まったら
勝手に先頭の要素に戻ってくれます。
転送元アドレス
転送元アドレス 0xFF1F は、
AD変換結果が格納されるレジスタのアドレスです。
ユーザーマニュアルにアドレスが記載されています。
14.3.5 10ビットA/D変換結果レジスタ(ADCR)
A/D変換結果を保持する16ビットのレジスタです。
(一部省略)
変換結果の上位8ビットがFFF1FHに,
下位2ビットがFFF1EHの上位2ビットに格納されます。
アドレスの最初の"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に配置されています。
![](https://assets.st-note.com/img/1690580062851-c3kHFmWxoE.jpg)
転送先アドレス(バッファ)
コード上で定義した要素数8の配列です。
前項の定義にて
0xFA000~0xFA00F (16byte分)
が確保されます。
転送元アドレス
転送元バッファはRAMではなかったので、
図上には記載されていません。
DTC領域
DTCが動作するためのデータです。
この領域はe2studioのコード生成機能が
勝手に生成してくれます。
その他
汎用レジスタ等、他のブロックは
RL78に最初から割り当てられた別の機能ですので、
ここでは説明を省略します。
スタックは?
スタックはコンパイラが勝手に生成してくれます。
RAM上の空いている領域をブロックで確保します。
私の場合、
0xFA0010~0xFFD00(約24Kbyte)
が確保されていました。
4. 動作確認
モーター電流をAD変換し、
DTCで変数(dtc_buf[8])に転送します。
![](https://assets.st-note.com/img/1690593335659-FVqEJl4BmH.jpg?width=1200)
dtc_buf をデバッガでモニタリングします。
![](https://assets.st-note.com/img/1690593518948-SPqIXvIfp9.jpg)
右側の"アドレス"に、
変数のアドレスが表示されています。
確保した領域
0xFA000~0xFA00F (16byte分) が
きれいに並んでいます。
RL78 DTCでAD変換結果を直接RAMに転送しました。
— みはらぼ (@miha_labs) July 29, 2023
画面上部の黄色部分が転送されたデータ。下段赤線が転送データを電流値に変換してグラフ表示したもの。 pic.twitter.com/aX1kwiM5xk
モーターに負荷をかけると、
電流量が増えてdtc_bufの値が減っています。
(最上位の数値が3から2に減っています)
ELCと組み合わせているので、
① タイマーRDアンダーフロー
▽
② AD変換開始
▽
③ AD変換完了
▽
④ AD変換結果を配列に格納
の4工程を全部勝手にやってくれます。
5. 最後に
RL78は一通り触り終わりました。
この後UARTも実装しているのですが、
ネタが弱いので記事化するか迷っています。
RL78関連記事 ▼
もしこの記事があなたの役に立ったようでしたら、
みはらぼに一杯おごっていただければ幸いです。
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?