忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

RX220のプログラム開発について

SH7125とRX220の比較ハードウェア編に続きソフトウェア開発編です。
2018/11/15 PWMについて訂正があります。

RX220マイコンボード開発セット※販売終了復活でRX220の開発を行う方はありあえず秋月の「★RX220マイコンのプログラムを作って、動かしてみよう☆」に沿って動かしてみましょう。
ちなみにpdfからコードをコピーしようとするとわけわからん事になります。
pdf内のコードは「動かしてみようSAMPLE」フォルダ内にあるのでそっちを使いましょう。

ルネサスの公式サンプルもダウンロードできます。
製品ページより
https://www.renesas.com/ja-jp/products/microcontrollers-microprocessors/rx/rx200/rx220.html
にてダウンロードできます。
ダウンロードにはルネサスへユーザー登録(無料)が必要となります。

サンプルコード > マイクロコンピュータの周辺


例えばPWMなら タイマー > PWM出力

サンプルコードありにチェックして検索

出てきたC Sourceをクリックしてダウンロード

サンプルコード>開発ツール にもサンプルコードがあります。


ここからが本題。sh7125とは色々と勝手が違います。

注意すべき点

・クロックの設定
・設定の変更許可
・マクロ
・PWMの仕様
・その他割込み動作


クロックの設定

ハード編で説明の通り複数種のクロックが搭載されているので低速低消費電力でも高速高消費電力にも設定可能ですが、標準プロジェクトだと低速動作に設定されてるのでPWMなどを運用しようと思うと高速動作になるようクロック設定を自分で行う必要があります。
メインクロック発振器・・・・20MHz(外付け水晶発振子)
サブクロック発振器・・・・・32.768KHz(外付け水晶発振子)
高速オンチップオシレータ(HOCO)・・・32MHz/36.864MHz/40MHz/50MHz(CPU内蔵発信回路)
低速オンチップオシレータ(LOCO)・・・125KHz(CPU内蔵発信回路)
IWDT 専用オンチップオシレータ・・・・125KHz(CPU内蔵発信回路)
※基本的にCPU内蔵のクロックより外付けクロックの方が発信周期は正確になります。時計機能(RMT)を使用する場合は外付けクロックの使用を推奨します。

素の状態では低速オンチップオシレータ(125KHz)が有効になるそうで、このままでは動作が低速で使えません。プログラムにてどのクロック発生元を使用するのかに加えて分周期も設定します。秋月のCMTサンプル(第4章 TEST1.c)ではメインクロック発振器(20MHz,2分周期→実動10MHz)でCMTを動かしています。

これらの設定は使用目的によって様々です。従ってネット上の情報は色んな人色んな使い方をしているため、ネット上のプログラムは当然クロック設定がバラバラです。
また、各機能を設定する前にどこかでクロック設定を行っているため各機能説明をしているページにクロックをどの様に設定したか書いてないことも多いはずです。
これらのプログラムを寄せ集めて使用するとクロック設定がバラバラの状態になるためすべての機能が予定通りに動くことは無いでしょう。

私はロボットを動かすことを前提としているため「クロックに高い精度は必要ない」「可能な限り高速処理」の条件のもと32MHz1分周期実動32MHz(CPUの最大動作周波数)として使用しています。
ちなみに20MHz,1分周期では設定上の誤差によりシリアル通信115200bps通信できませんでした32MHz,1分周期では通信が可能でした。


マクロ

ルネサス公式サンプルを見ると
MSTP(MTU)
とか
IEN(MTU3,TGIA3)
とか
IPR(MTU3,TGIA3)
とか
IR(MTU3,TGIA3)
とか出てきます。
何かな~と思ってハードウェアマニュアルを検索しても出てきません
これらはiodefine.h内で定義されているマクロです。

MSTPであれば
MSTP(MTU)

MSTP_MTU

SYSTEM.MSTPCRA.BIT.MSTPA9 が本来の姿です。

IPRであれば
IPR(MTU3,TGIA3)

_IPR(_MTU3_TGIA3)

__IPR(_MTU3_TGIA3)

ICU.IPR[ IPR_MTU3_TGIA3 ].BIT.IPR

ICU.IPR[ 129 ].BIT.IPR が本来の姿です。
内容的には割り込み要因プライオリティレジスタn(IPRn)の部分の話です。

まとめると
MSTP(MTU)
モジュールのスタンバイ解除で、SH7125でのSTB.CR4.BIT._MTU2等に相当します。

IEN(MTU3,TGIA3)
割込みの有効無効設定で、SH7125でのMTU20.TIER.BIT.TCIEV等に相当します。

IPR(MTU3,TGIA3)
割込みの優先順位設定で、SH7125でのINTC.IPRD.BIT._MTU20C等に相当します。

IR(MTU3,TGIA3)
割込みフラグで、SH7125でのMTU20.TSR.BIT.TCFV等に相当します。

設定の変更許可

SH7125では各端子の機能を変更する場合は変更内容を書くだけでよかったのですが、RX220では誤って変更されないように保護機能がついています。
従って重要な機能変更を行うためにはまず保護機能の解除を行う必要があります。

モジュールのスタンバイ解除

モジュールのスタンバイ解除を行うには
SYSTEM.PRCR.WORD = 0xA502;    //プロテクト解除
MSTP(MTU) = 0x0;        // MTUモジュール停止解除
SYSTEM.PRCR.WORD = 0xA500;    //プロテクト有効
の様に書きます。
0xA5020xA5000x0002に分けて考え、上2桁0xA500は設定変更のためのパスワードの様なもの、下1桁0x0002がどの部分の保護機能を解除するかを表します。
 0x0001:クロック発生回路関連レジスタへの書き込み許可
 0x0002:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可
 0x0008:LVD(電圧監視)関連レジスタへの書き込み許可
の様になっています。

端子の機能設定

端子の機能設定を変更するには

//特殊機能保護解除
MPC.PWPR.BIT.B0WI = 0;            //PFSレジスタの保護設定をするPFSWEレジスタの保護解除
MPC.PWPR.BIT.PFSWE = 1;            //PFSレジスタの保護解除

//Pxx 端子機能制御レジスタ(PxxPFS)
MPC.P16PFS.BIT.PSEL = 0x1u;        //MTIOC_3C
MPC.P17PFS.BIT.PSEL = 0x1u;        //MTIOC_3A
MPC.P27PFS.BIT.PSEL = 0x1u;        //MTIOC_2B
MPC.PA0PFS.BIT.PSEL = 0x1u;        //MTIOC_4A
MPC.PA1PFS.BIT.PSEL = 0x1u;        //MTIOC_0B
MPC.PA3PFS.BIT.PSEL = 0x1u;        //MTIOC_0D
MPC.PB1PFS.BIT.PSEL = 0x1u;        //MTIOC_0C
MPC.PB3PFS.BIT.PSEL = 0x1u;        //MTIOC_0A
MPC.PB5PFS.BIT.PSEL = 0x2u;        //MTIOC_1B
MPC.PE4PFS.BIT.PSEL = 0x2u;        //MTIOC_1A
MPC.PE5PFS.BIT.PSEL = 0x1u;        //MTIOC_4C

//特殊機能保護有効
MPC.PWPR.BIT.PFSWE = 0;            //PFSレジスタの保護有効;
MPC.PWPR.BIT.B0WI = 1;            //PFSレジスタの保護設定をするPFSWEレジスタの保護有効

の様な書き方をします。
MPC.P16PFSを変更したいのですが、MPC.PWPR.BIT.PFSWEにてP16PFSの保護を解除する必要があります。
が、MPC.PWPR.BIT.PFSWEを変更するためにはMPC.PWPR.BIT.B0WIにてPFSWEの保護を解除しなければいけないそうです。
MPC.P16PFSを変更し終わったら逆手順にて保護をします。
ややこしいです。

PWMの仕様

ロボット用に設定していて一番困ったのがこれでした。
最も違いを感じたのは
・内部カウント値を勝手に変更できない
・モード1とモード2で動作が盛大に違う
の2点です。

SH7125ではPWM波形を生成するためにMTU20.TCNTの値を自分で変更して
 内部カウント値オーバーフローする値1周期分のカウント値
とすることでオーバーフロー割込みでデューティー比の更新をしていました。

RX220ではMTU0.TCNT等にて内部カウンタの読み取りはできるのですが、任意のタイミング任意の値へは変更できない様です。
コンペアマッチまたは外部入力によってのみ0にリセットができます。(TCRのCCLRの項)
他のカウンタがリセットされたときに同期してリセットも可能ですが、結局はコンペアマッチをきっかけにする必要があります。
(2018/11/15)訂正
任意のタイミングでTCNTを変更可能なことを確認しました。

これに合わせて注意しなければいけなのはモード1モード2の違いです。
モード1と2ではコンペアマッチに使用する設定値TGRA~Dの使い方が大きく異なります。

SH7125のPWM設定で行った様なA~Dをまとめてリセットする使い方はモード2の方です。
※ハードウェアマニュアルの「PWM モード2 の動作例」を参照の事

モード1はエンコーダのAB相出力の様な使い方になります。
※ハードウェアマニュアルの「同期動作の例」を参照の事

モード1では1つの周期の中A相の制御にTGRAでON、TGRBでOFFB相の制御にTGRCでON、TGRDでOFFとします。
この時A相はMTIOCxA、B相はMTIOCxCから出力されます。TIOCxBとTIOCxDはそれぞれA相B相に連動して反転出力を出せます。(※ハードウェアマニュアルの説明と違う気がする)

で、PWMモード2が使えるのはMTU0,1,2のみMTU3,4PWMモード1のみ使用可能です。MTU5はPWMモードとして使用できません。
PWMモード2を使用する場合は各端子の基準値を設定するためのTGRA~TGRDの他にカウンタリセットで使用する基準値TGR*を用意する必要があります
カウンタリセットとしてTGR*を使用するとこれに関連付けられた端子はPWM出力として使用できません。

私はMTU0~2を同期動作させ
MTIOC_0A
MTIOC_0B
MTIOC_0C
MTIOC_0D
MTIOC_1A
MTIOC_1B
MTIOC_2B
をPWMモード1の出力
MTIOC_2Aリセットのための犠牲(端子自体他と被ってて使えない)
(2018/11/15)訂正
MTU0.TGREを基準値とし、コンペアマッチTGIE0にてリセットが可能です。
2セット分の位相計数を行うとMTU1およびMTU2が使えなくなるので、MTU0のみでPWMの機能を完結しておいた方が良さそうです。

MTU3,4は独立動作
MTIOC_3A
MTIOC_3C
MTIOC_4A
MTIOC_4C
をPWMモード2の出力
として使用する事にしました。(リセット要因はMTU3.TGRB、MTU4.TGRBとのコンペアマッチ)
これで独立してデューティー比が変更可能な端子が11端子になります。

なお、TIOC_4A、TIOC_4CはMTU.TOERにて出力許可をしないと出力されません。

位相計数(エンコーダ入力)を使用する場合MTU1,2が使えなくなるので、MTU0はMTU3か4に同期させて使った方が良いかもしれません。(PWM出力8端子

割込みの動作

ちょっと気になった事。

割込みフラグ

SH7125だと割込み発生後に割込みフラグを自分で解除しないと何度も割込み関数を実行してしまいますが、RX220だと一部割込みに関して一度割込み関数が実行されるとフラグを自分で解除しなくても次に割込み条件が揃うまで割込み関数が実行されない関数がある様です。
そもそもSH7125も同じなのかもしれませんが、良く分かりません。

SH7125で受信エラーが発生すると受信エラーフラグを解除しない限り何度でも受信エラー関数に飛んでメインプログラムが実行されなくなりますが、RX220の場合受信エラーが発生すると受信できなくなるだけでメインプログラムのループは動き続けます。

シリアル送信開始

SH7125では
SCI1.SCTDRに1文字入力して
SCI1.SCSSR.BIT.TDREにて送信を開始していました。

RX220では送信開始フラグが無く、
SCI1.TDRに文字を入力した時点で自動的に送信されるようです。



作成したサンプルプログラムはこちら
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性

最新コメント