皆様こんにちは、MXKazと申します。RX621(MTU2)で動いていたコードをRX65N(MTU3a)でも動かしたくて四苦八苦行きしており詰りました。どなたかご教授お願いします。
MXkaz さんこんにちは。
この情報だけでは何とも言えないのですが。
気になるのは「MSTP(MTU0)」マクロで、これは多分「MSTPCRA」レジスタの省電力切り替えだと思います。
RX65x では、省電力切り替えレジスタにアクセスする前に、書き込み許可を与えないと、アクセス出来ない点です。
「レジスタライトプロテクション機能、プロテクトレジスタ (PRCR)」の項目を参照して下さい。
※MSTPマクロの中で、PRCRレジスタのプロテクト解除を行っているのなら問題ありません。
MXkazさん おはようございます。 NAKAといいます。
ちゃちゃっと書いたら、割り込みに飛びました。確認してみてね!
//***********************************************************************// 関数名 : fn_Init_MTU0(void)// 動作 : マルチタイマユニット0の初期化 // 引数 : // 作成 : NAKA 23.03.17// **********************************************************************void fn_Init_MTU0(void){ MSTP(MTU3) = 0; //モジュール許可 MTU.TSTRA.BYTE = 0; //タイマ-STOP ICU.SLIAR208.BYTE = 0x01; //割り込み要因セット IPR(PERIA,INTA208) = 0x05; //プライオリティ_LEVEL5; MTU0.TCR.BYTE = 0x20; //クロック選択 MTU0.TIER.BYTE = 0x01; MTU0.TGRA = 0xEA5F; //周期SET IEN(PERIA,INTA208) = 1; //割り込み許可 MTU.TSTRA.BYTE |= 0x01; //タイマ-START }
P.S.周期は適当です。(^_-)-☆
hirakuni45さん、こんばんわ。
ご教授ありがとうございます。MSTP(MTU0)については、以前RX621の開発時にマクロつかいましたがその辺の経緯は完全に失念しております。「レジスタライトプロテクション機能、プロテクトレジスタ (PRCR)」の項目を参照しましたが、自分の知識レベルではまだ理解できておりません。さらに調べてみます。
ありがとうございました。
NAKAさんこんばんわ、ご教授ありがとうございます。早速頂いた「fn_Init_MTU();]に置き換えてみましたが見た目の現象は変化ありませんでした。念の為 MSTP(MTU3) = 0; //モジュール許可 をMTU0 にしてみましたが変わりませんでした。
どうやら自分が根本的なところで何か足りないのかもしれません。現在の動作環境は Target Board for RX65N に開発環境はCS+forCCです。新規プロジェクトを作成して自動生成されたコードに多少手を加えた状態です。手を加えたのはresetprg.c のHardwareSetup(); がコメントになっていたので、コメント外した事hwsetup.cの void HardwareSetup(void) で頂いた fn_Init_MTU0()を呼んでます。intprg.cの void Excep_PERIA_INTA208(void){ mtu0_test(); } のように書き換えました。mtu0_testの中身は PORTD.PODR.BIT.B7 = ~PORTD.PODR.BIT.B7; の1行です。割り込みが発生してmtu_test()が呼ばれる毎にPORTDのbit7が反転するのでオシロで波形見ればわかると思っています。mainの中身は while(1) ; としてぐるぐる回ってます。CS+でブレークポイント設定しても mtu_testでブレークしません。
以上のような状態で、これ以外で何か足りない事があるような気がしますが、分かりません。
何かお気づきありましたら宜しくお願いします。
MXkazさん おはようございます。 NAKAです。MSTP(MTU3) = 0; //モジュール許可は
マルチファンクションタイマパルスユニット3(MTU3a)なのでMTU3のままでいいと思います。一応確認しましたが、下記のように割り込みに飛んできます。
確認ですが、main()の中のwhile(1)の前でfn_Init_MTU0();を設定されてますでしょうか?
main()にちゃんととんできているのでしょうか?
例えば、main()の前でグローバル変数(g_i)をunsigned long型で宣言しておき
unsigned long g_i;
while(1)
{
g_i++; if(g_i>= 0xFFFFFF) {
g_i = 0;
PORTD.PODR.BIT.B7 = ~PORTD.PODR.BIT.B7;
}
}とかしたら、ちゃんとこのPD7は反転しますか? 記 ①実行
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
②ブレークポイントで停止
NAKAさん、こんにちはお忙しい中ありがとうございます。モジュール許可の件はそういう事ですか、よく理解していませんでした。
fn_Init_MTU0();はmain()の前で読んでいます。hwsetup.cの void HardwareSetup(void) で頂いた fn_Init_MTU0()を呼んでます。PORTD.7はwhile(1)のループ内で反転している事は確認できました。
新たに気になる事があります。MTU0.TCRMTU0.TIERTU.TSTRを読んでもセットした値が書き込まれていませんがこれっておかしいですよね?
何を行えば書き込めるのか分かりません。
MXkazさん おはようございます。 NAKAです。
>新たに気になる事があります。>MTU0.TCR>MTU0.TIER>TU.TSTR>を読んでもセットした値が書き込まれていませんが
⇒不思議ですね! 一応タイマーのリードとライトを許可するレジスタがありますのでMSTP(MTU3)した後くらいにいれてみます?デフォルトで許可になっているので関係ないかもですが!コード生成で禁止にされてたりして? MTU.TRWERA.BIT.RWE = 1; MTU.TRWERB.BIT.RWE = 1;
NAKAは許可しなくても大丈夫でしたけど......
MXkazさん、こんにちは。NoMaYと申します。横から失礼いたします。すみません、念の為にちょっと確認させて欲しいのですけれども、MXkazさんは、RXスマートコンフィグレータというツールが存在することをご存知でしょうか?[関連リンク]RX231のAD変換器、DA変換器 の使い方についてcommunity-ja.renesas.com/cafe_rene/forums-groups/beginners/f/002-2095199602/9826/rx231-ad-da
NAKAさん、おはようございますMXKazです。
いろいろありがとうございます。ご指示のコードを挿入してみましたがNGでした。今回はレジスタが読めない事(書き込めないことですね)が問題ですね?NAKAさんに動作検証済のコードを戴いたおかげで、問題の切り分けに早く到達できたと思います。自分はRENESAUの”Target Board for R65N”で確認しています。念の為”ENVISION KIT”でもためしましたが、結は同じでした。
開発環境はCS+を使い、新規プロジェクトの作成時に対象のチップを選択して”アプリケーション(CC-RX)を選択し、自動生成されたコードを使っています。
う~ん、何かミスっていてレジスタに書き込みできないのだと思います。
NoMayさん、おはようございますMXKazです。
>横から失礼いたします。いえいえ、そんなことないです。ありがとうございます。RXスマートコンフィギュレータについては知りませんでした。試しにインストールしました。CS+のツリーに出ていますね。これを使い切るにはまだハードル高そうです。e2 studioでのサンプルを見つけましたので参考にしながら勉強します。