RL78 DTCは便利だけどちょっとムズイ
APS-Web様向け寄稿記事で、
色々なMCU評価ボードでブラシレスモーターを回す
という活動をしています。
ルネサスエレクトロニクス社製
RL78/G14の実装が一通り完了しました。
前回のELCと組み合わせて、DTCも使ってみました。
結構ハマりポイントがあったので、
設定と使い方をさくっと解説します。
1. DTCとは
ELCはペリフェラル間の連携動作ですが、
DTCは任意のメモリ間でデータ転送を行います。
似たような機能でDMAがありますが、
DMAと比較し柔軟なデータ転送が可能です。
詳しくは RL78/G14 初めてのDTC 7項をご覧ください。
2. 設定方法
AD変換結果を勝手に配列に並べてくれる
という動作を試してみました。
AD変換完了毎に、指定した配列(要素数8)にデータを転送
データ転送毎に配列の要素数を1追加
8要素埋まったら配列の先頭要素を上書き
以下繰返し
コード生成設定
起動要因を"A/D変換"にします。
これでAD変換完了後にDTCが動作するようになります。
DTCの動作を具体的に設定します。
リピートモードにすることで、8要素分配列が埋まったら
勝手に先頭の要素に戻ってくれます。
転送元アドレス
転送元アドレス 0xFF1F は、
AD変換結果が格納されるレジスタのアドレスです。
ユーザーマニュアルにアドレスが記載されています。
アドレスの最初の"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に配置されています。
転送先アドレス(バッファ)
コード上で定義した要素数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関連記事 ▼
もしこの記事があなたの役に立ったようでしたら、
みはらぼに一杯おごっていただければ幸いです。
ここから先は
¥ 100
Amazonギフトカード5,000円分が当たる
この記事が気に入ったらチップで応援してみませんか?