皆様こんにちは、MXKazと申します。RX621(MTU2)で動いていたコードをRX65N(MTU3a)でも動かしたくて四苦八苦行きしており詰りました。どなたかご教授お願いします。
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.周期は適当です。(^_-)-☆
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は許可しなくても大丈夫でしたけど......
NAKAさん、おはようございますMXKazです。
いろいろありがとうございます。ご指示のコードを挿入してみましたがNGでした。今回はレジスタが読めない事(書き込めないことですね)が問題ですね?NAKAさんに動作検証済のコードを戴いたおかげで、問題の切り分けに早く到達できたと思います。自分はRENESAUの”Target Board for R65N”で確認しています。念の為”ENVISION KIT”でもためしましたが、結は同じでした。
開発環境はCS+を使い、新規プロジェクトの作成時に対象のチップを選択して”アプリケーション(CC-RX)を選択し、自動生成されたコードを使っています。
う~ん、何かミスっていてレジスタに書き込みできないのだと思います。
NAKAさん、こんばんは。
割り込みかかるようになりました。提供していただいたコードのおかげで、不具合の切り分けがスムーズに行えました。頂いたコードはファイルヘッダと共に使わせて頂きます。ありがとうございました。
良かったですね!あまりお力になれなくてすみません。何が原因だったか、気になるぅ~~ (';')?
NAKAさん、こんにちは。NoMaYです。> デフォルトで許可になっているので関係ないかもですが!コード生成で禁止にされてたりして? この認識がおかしいと思うのです。マイコンの初期設定は不許可で、コード生成機能やRXスマートコンフィグレータでは一時的に許可してレジスタを変更していますよ。(そして変更した後で不許可に戻しています。) ひょっとして、コードを新規作成されたのでは無くて、土台は別のところからコピペしたものを使っていて、その土台のところで、昔、NAKAさんの好みのやり方として、プログラム全域で許可したままにする、というのを入れたけれども、すっかり忘れていた、とかないでしょうか?
NoMaY先生 おはようございます。 NAKAです。
僕なんか勘違いしてます?
デフォルトで許可というのは、リセット後の値がリードライト許可になっているという意味でした。
>NAKAさんの好みのやり方
⇒そうなんです。相変わらずあまりコード生成機能を使ってません、タイマーや通信のボーレートの値を確認するくらいです。
たしかに、タイマーやタイミングが何等かの原因で変わっちゃうのは良くないので、タイミングに変更がないのであれば、初期設定後は禁止にしておいたがいいですね!(^^)/
NAKAさん、こんにちは。NoMaYです。そちらのMTUの個別のレジスタのことでしたか。私はMTUに対するMSTPレジスタの話をしていました。こちらの方が、リセット後の設定が以下のようになっているのです。(1) MTU動作停止(他のモジュールも同様)(1') つまりMTUレジスタ全般へのライト不可(というか上に書いたようにMTU動作停止の状態です)(2) MTUに対するMSTPレジスタへのライト不可(他のモジュールに対するMSTPも同様)なので、mushipanさんの対処が必要なのですけれども、そのような処理を入れたことを忘れてないでしょうか?ということなのでした。(そして、それが必要なことが最初のhirakuni45さんからのMXkazさんへのアドバイスだったのです。)
>何が原因だったか、気になるぅ~~ (';')?mushipanさんが答えていただいていましたね!!わかりました。PRCRのことかぁ~!ここ何年もRXを触ってないので、すっかり忘れてた!NAKAは初期化(下記)の中でやっていたので、MTU0ちょこちょこ書いただけで動いちゃったんですね!(^^)/ あぁぁ失礼しました!m(__)m
//***********************************************************************// 関数名 : fn_Init_Device(void)// 動作 : デバイスの初期化 // 引数 : // 作成 : NAKA 17.06.19// **********************************************************************void fn_Init_Device(void){ clrpsw_i(); //割り込み禁止 SYSTEM.PRCR.WORD = 0xA50B; //プロテクト解除 MPC.PWPR.BIT.B0WI = 0; //PFEWE書き込み 0:許可 MPC.PWPR.BIT.PFSWE = 1; //PFS書き込み 1:許可
fn_Init_Clock(); //クロックの初期化 fn_Init_RTC(); //RTCの初期化 fn_Init_Port(); //ポートの初期化 fn_Init_TPU0(); //TPU0の初期化 fn_Init_MTU0(); //MTUU0の初期化 fn_Init_IRQ8(); //外部割り込み8の初期化 fn_Init_SCI2(); //SCI2の初期化 fn_Init_CAN0(); //CAN0の初期化 MPC.PWPR.BIT.PFSWE = 0; //PFS書き込み 0:禁止 MPC.PWPR.BIT.B0WI = 1; //PFEWE書き込み 1:禁止 SYSTEM.PRCR.WORD = 0xA500; //プロテクト!(書き換え禁止) setpsw_i(); //割り込み許可 }
P.S.
最新の書き込みが一番下にないと、見にくいですね!