RX71M の汎用 I/O 設定がうまく出来ません

初めまして gNuco(ぬこ:古いスラングで”猫”の事)と申します。GNUプロジェクトとは全く関係有りません。

RX71M の 汎用I/O設定がうまくいかず困っています。

以下の不具合の解決策が分かる方がおられたら、お助け下さい。なにとぞよろしくお願いいたします。

*********** 代表的な不具合例  *********************

●代表的な不具合の概要 :初期化に関するアプリケーションノート添付のサンプルコードで初期化を行った後、汎用I/Oポート設定を行うと"0", "1" のいずれを力しても "1" しか出力しない。

●実コード :メイン関数
  void main(void) {
          clrsw_i( ); // マスカブル割り込みの停止
          R_INIT_StopModule( ); // 初期化関数1:周辺モジュールの停止
          RINIT_Port_Initialize( ); // 初期化関数2:存在しないポートの処理
          R_INIT_Clock( ); // 初期化関数3:クロック設定

          PORTG.PDR.BIT.B2 = 1; // PG2 出力ポート    【2020/6/22 間違いを修正しました】
          PORTG.PODR.BIT.B2 = 0; // 又は = 1;    【2020/6/22 間違いを修正しました】

          while(1) { }
}

 【2020/6/22 追記】  I/O ポートの設定コードが間違っていたので修正しました。
  hirakuni45 様、fujita nozomu 様 ご両名からご指摘を頂きました。
   修正前のモノは実使用コードを直接コピーしたモノでなく、ペースト後に編集をしており、
  その時に間違いました。
   プログラムに関する質問をするのに、肝心なコード記述が間違っていてはこれを読んでいただいた皆さまに
  ご迷惑をかける事になり全く申しわけありません。今後はこの様な事の無いように勤めます。       【追記 ここまで】
 

 ※ I/O ポートに関する他の設定は、
   デフォルト値のままでも、明示的にデフォルト値を設定しても、結果は同じでした。

●使用環境
  ・マイコン: RX71M _ 176pin R5F571MLDDFC
  ・αプロジェクト社ボード
     ピンは全てプルアップ、又はプルダウン
  ・ツールチェーン: Renesas CCRX v3.01.00
  ・e2studio: V7.7.0 を windows10 で使用
  ・E1 を持っていますが、まだ使えません。アセンブラも分かりません。
  ・出力の確認: オンボードLED、5V NAND を介した LED の点燈・消燈、 及び テスター
●私が思い込んでいる事=間違いの原因かもしれない事
  ・汎用 I/O ポート設定は モジュール停止、クロック設定の影響を受けないはず。
  ・汎用 I/O ポートを 出力設定 するのは 
    ポート方向 PDR, ポートモード PMR, オープンドレイン制御 ODR0/1 、駆動能力制御 DSCR 
    及び PODR だけで、 PDR, PODR 以外はデフォルト値で CMOS 出力ができるはず。  (いくつかは明示的に設定したけれどだめでした)
 
*********** 以上が代表的な不具合例です  ***************

*********** 以下は更に話がややこしくなる不具合例です  ****
●他の不具合例
  コンパイラ、PDR の設定位置等の組み合わせによって、
  不具合症状が 『 "0" しか出力しない』だったり、或いは『"1" しか出力しない』 だったり、
  正常動作したりします。

  ・コンパイラを変えた場合
    上記 CCRX 以外に、GCC、或いは G++11 を使用する。   
    GCC for Renesas RX 8.3.0.201904LF
    ※マスカブル割り込みの停止 clrsw_i( ) は省略しています。
      割り込み関数は、 extern "C" で Cファイルのまま使う他に
       C++ ファイルに修正して使う事も行いました。

  ・3つの初期化関数を、
    上記の様に個々にコールするか、   
    或いは『3つの関数をコールする』関数を作成し、メイン関数でコールするか。
    【2020/6/22 追記】初期化関数を実行せず、I/O ポートの設定だけを行った場合は、
              正常に動作します。 
      

  ・ポート方向レジスタ PDR の設定を、
     3つの初期化関数のコールより前に実行するか、後に実行するか。
     或いは上記の『3つの関数をコールする』関数の前に実行するか、後に実行するか。

  正常動作をする組み合わせでコンペアマッチタイマを使った Lチカ がうまくいかず、割り込みハンドラにポート出力を仕込んで割り込みの可否を確かめようとしました。でも割り込みに問題があるのか、このコードではポート出力に不具合があるのか見分けがつきません。

************** 以上、更に話がややこしくなる不具合例でした ****

●問題の背景 
 当初 GR-SAKURA の RX63N を G++ で使っていました。この時は初期化に、サンプルコードを G++ 用に修正したモノで正しく動作しました。
 しかし周辺機能ピンのやりくりが出来なくなり、データ処理量が多い使い方をする為に速いマイコンとして RX71M に乗り換えました。
 RX63N との違いは、ピン数、クロック速度、メモリウェイト設定 だけという考えで G++11 によるボードの立ち上げを始めたところ、I/O ポート動作でつまづきました。
 CC-RX を使った事はありませんが、GCC, G++ に問題があるかとも考え、今回初めて CC-RX を使って無修正のサンプルコードにポート設定だけを追加しましたが、やはり I/O 出力の不具合があったのでこちらに質問する事を決心しました。。   

 長くなりましたが、おかしなところがあればご指摘ください。よろしくお願いいたします。

Parents
  • gNuco(ぬこ)です
    fujita nozomu 様から、実コードのミスに対する御指摘を頂きました。ありがとうございます。

     メールに連絡があったのですが、こちらのページには表示がありません。私はこのフォーラムを初めて利用する為、まだフォーラムのシステムを理解しておりませんので fujita nozomu 様に直接返信する手段が分からないので、このような形で返事とお礼をいたします。

    **** 以下、fujita nozomu 様のリプライ ***************************
    ●実コード :メイン関数
      void main(void) {
    clrsw_i( ); // マスカブル割り込みの停止
    R_INIT_StopModule( ); // 初期化関数1:周辺モジュールの停止
    RINIT_Port_Initialize( ); // 初期化関数2:存在しないポートの処理
    R_INIT_Clock( ); // 初期化関数3:クロック設定

    PORTE.PDR.BIT.B2 = 1; // PG2 出力ポート
    PORTE.PODR.BIT.B = 0; // 又は = 1;

    while(1) { }
    }
    RX71M の iodefine.h で定義される PORTE.PODR.BIT に B というメンバは存在しないので先ずそこから確認されるべきでは

    **** fujita nozomu 様のリプライ  ここまで  ***************************

    ●実コードをコピー・ペーストした後、間違った編集をしました。編集を行った経緯は、同じ指摘を頂いた hirakuni45 様へのリプライに詳細を記しております。 コードの問題点を相談するのに、間違ったコードを掲示した為に、このページを見ていただいた方々には大変失礼な事をしてしまいました。今後はこの様な事の無いように注意いたします。
    ●fujita nozomu 様には御指摘を頂き感謝いたしております。ありがとうございました。
  • > fujita nozomu 様から、実コードのミスに対する御指摘を頂きました。ありがとうございます。

    あーすいません、一回こちらのフォーラムに投稿したのですが hirakuni45 さんの投稿と内容が被っていたので削除してました。ご丁寧にありがとうございます。
  • fujita nozomu 様 
     改めて
     初めまして gNuco(ぬこ)です
     こちらこそご丁寧にありがとうございます。

    ●コードのミスに関しては、既に投稿した通りなので『ピンポン投稿(?)』を避ける為にも、省略します。しかし私の初めてのかふぇルネ体験で、この件を含めて色々勉強させてもらいました。
    ●ただ直接お礼を言いたいので最後にこれで締めたいと思います。
       御指摘ありがとうございました。
Reply
  • fujita nozomu 様 
     改めて
     初めまして gNuco(ぬこ)です
     こちらこそご丁寧にありがとうございます。

    ●コードのミスに関しては、既に投稿した通りなので『ピンポン投稿(?)』を避ける為にも、省略します。しかし私の初めてのかふぇルネ体験で、この件を含めて色々勉強させてもらいました。
    ●ただ直接お礼を言いたいので最後にこれで締めたいと思います。
       御指摘ありがとうございました。
Children
  • 色々とご指導いただいた皆様へ

    gNuco(ぬこ)です

    ●ご報告が遅れましたが、掲題の『設定が出来ない』理由が少しわかりました。●おそらく、セクション設定をしていない事が原因だと思います。使用したボードはアルファプロジェクト社製で 16MB のSDRAM が外付けされているので、リンカスクリプトの変更が必要なのじゃないかと思います。ただ、初心者なのでこれに全く思い至りませんでした。

    ●ただ例外があり断言できません。セクション設定を行わず、スマートコンフィグレータとCGコードジェネレータを使って Lチカ(CMT0)プロジェクトを作成したとき、CC-RC C プロジェクトだと動作しないけれど、GNU C プロジェクトは動作します。●それでも追加 DRAM があるのにリンカスクリプトを修正しないのは間違いに違いないと思うのですが。

    ●とりあえず参考としてこれまでに得られた事象を、報告が遅れた言い訳と一緒に時系列で列挙します。

    ●皆様から・スマートコンフィグレータを使う、・E1エミュレータを使う、という御助言を頂き、実行しました。●まず スマートコンフィグレータ CG  を使って、初期設定、汎用I/Oポートの制御を行う GNU-C プロジェクトを作成し、これが正しく動作しました。●次に同じ条件で Lチカ(CMT)プロジェクトを作成し、正しく動作しました。

    ●同時並行で E1 エミュレータを使ってデバグを試みましたが、うまくいきません。E2 lite を購入しましたがダメでした。ルネサス殿とメール相談を行い、e2studio にRXのデバッグ関連プラグインが入っていない事が分かるまで2か月を要しました。●デバグが出来る様になって分かったのは、プログラムが初期設定関数の中で停止しており、main ()関数に記述したI/O 設定まで達していない事でした。この頃には『ユーザはセクション設定を行う』という知識を得て、これを行わない事が動作不良の原因と推測しました。

    ●ここまで分かった頃から家庭の事情でマイコンにさわれない状況が始まり、リンカスクリプトを勉強する事が出来ない為、最後に外付けRAMの無い RX72N (北斗社製)を購入し、スマートコンフィグレータを使わない GNU C++ プロジェクトで、『初期化処理が完了し、main()関数内の I/O 設定が実行される』事が確認出来た事で『セクション設定を行わない事が I/O 設定が出来ない原因』との思いを深めました。●しかしそれでは『スマートコンフィグレータを使うと、セクション設定をしなくても Lチカが動く』事を説明できません。それから半年以上マイコンを触れなかった間『スマートコンフィグレータはすごいから、アルファプロジェクト社等のボードメーカのメタデータを持っていて、リンカスクリプトを書き直しているに違いない』と思い込んでいました。

    ●最近ようやくマイコンに復帰し皆様のご指導に事後報告をしていない事を思い出し、上記の事象を再確認する過程で、初めて『RX71M でスマートコンフィグレータを使って CC-RX の Lチカプロジェクト』を作成したら、正しく動作しない事が分かりました。

    ●皆様へのご報告はここまでとし、新しい知見が得られたら改めて報告したいと思います。●昨年の皆様のご指導に感謝いたします。ありがとうございました。