RX65NでのMTU3aの使い方について

皆様こんにちは、MXKazと申します。
RX621(MTU2)で動いていたコードをRX65N(MTU3a)でも動かしたくて四苦八苦行きしており
詰りました。どなたかご教授お願いします。


Parents
  • 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.TCR
    MTU0.TIER
    TU.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さん、こんばんは。

    割り込みかかるようになりました。提供していただいたコードのおかげで、不具合の切り分けがスムーズに行えました。頂いたコードはファイルヘッダと共に使わせて頂きます。
    ありがとうございました。

  • MXkazさん おはようございます。 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さんへのアドバイスだったのです。)

Reply
  • NAKAさん、こんにちは。NoMaYです。

    そちらのMTUの個別のレジスタのことでしたか。私はMTUに対するMSTPレジスタの話をしていました。こちらの方が、リセット後の設定が以下のようになっているのです。

    (1) MTU動作停止(他のモジュールも同様)
    (1') つまりMTUレジスタ全般へのライト不可(というか上に書いたようにMTU動作停止の状態です)
    (2) MTUに対するMSTPレジスタへのライト不可(他のモジュールに対するMSTPも同様)

    なので、mushipanさんの対処が必要なのですけれども、そのような処理を入れたことを忘れてないでしょうか?ということなのでした。(そして、それが必要なことが最初のhirakuni45さんからのMXkazさんへのアドバイスだったのです。)

Children
  • >何が原因だったか、気になるぅ~~ (';')?
    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.

    最新の書き込みが一番下にないと、見にくいですね!