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を動かしています。
これらの設定は
使用目的によって様々です。従ってネット上の情報は
色んな人が
色んな使い方をしているため、ネット上のプログラムは当然クロック設定がバラバラです。
また、各機能を設定する前にどこかでクロック設定を行っているため各機能説明をしているページにクロックをどの様に設定したか書いてないことも多いはずです。
これらのプログラムを寄せ集めて使用するとクロック設定がバラバラの状態になるためすべての機能が予定通りに動くことは無いでしょう。
私はロボットを動かすことを前提としているため「
クロックに高い精度は必要ない」「
可能な限り高速処理」の条件のもと
32MHz、
1分周期→
実動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;
//プロテクト有効の様に書きます。
0xA502は
0xA500と
0x0002に分けて考え、上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_3CMPC.P17PFS.BIT.PSEL = 0x1u;
//MTIOC_3AMPC.P27PFS.BIT.PSEL = 0x1u;
//MTIOC_2BMPC.PA0PFS.BIT.PSEL = 0x1u;
//MTIOC_4AMPC.PA1PFS.BIT.PSEL = 0x1u;
//MTIOC_0BMPC.PA3PFS.BIT.PSEL = 0x1u;
//MTIOC_0DMPC.PB1PFS.BIT.PSEL = 0x1u;
//MTIOC_0CMPC.PB3PFS.BIT.PSEL = 0x1u;
//MTIOC_0AMPC.PB5PFS.BIT.PSEL = 0x2u;
//MTIOC_1BMPC.PE4PFS.BIT.PSEL = 0x2u;
//MTIOC_1AMPC.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でOFF、
B相の制御にTGRCでON、TGRDでOFFとします。
この時A相は
MTIOCxA、B相は
MTIOCxCから出力されます。TIOCxBとTIOCxDはそれぞれA相B相に連動して反転出力を出せます。(※ハードウェアマニュアルの説明と違う気がする)
で、
PWMモード2が使えるのは
MTU0,1,2のみで
MTU3,4は
PWMモード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に文字を入力した時点で
自動的に送信されるようです。
作成したサンプルプログラムは
こちら