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
  • I/O ポートの出力をトグルするのは、何の設定も必要無く、出力モードにして、[0]、[1]を出すだけです。
    それが動かないとゆーのは、出来たバイナリーが正しくマイコンに書かれていないとか、
    「ソフト以前」
    の問題なのでは無いでしょうか?

    「E1 を持っていますが、まだ使えません。」
    とありますが、どのようにバイナリーをマイコンに書き込んでいますか?
    ※使わない理由は何でしょうか?

    あと、

    PORTE.PDR.BIT.B2 = 1; // PG2 出力ポート
    PORTE.PODR.BIT.B = 0; // 又は = 1;
    カット&ペーストのミス??

    これでは、PG2 ではなく PE2 が指定されているように思いますが・・・
    BIT.B2 ではなく BIT.B2 ?

    -----
    RX71M は自分のフレームワークでもサポートしているので参考になるかと思います。
    github.com/.../RX
Reply
  • I/O ポートの出力をトグルするのは、何の設定も必要無く、出力モードにして、[0]、[1]を出すだけです。
    それが動かないとゆーのは、出来たバイナリーが正しくマイコンに書かれていないとか、
    「ソフト以前」
    の問題なのでは無いでしょうか?

    「E1 を持っていますが、まだ使えません。」
    とありますが、どのようにバイナリーをマイコンに書き込んでいますか?
    ※使わない理由は何でしょうか?

    あと、

    PORTE.PDR.BIT.B2 = 1; // PG2 出力ポート
    PORTE.PODR.BIT.B = 0; // 又は = 1;
    カット&ペーストのミス??

    これでは、PG2 ではなく PE2 が指定されているように思いますが・・・
    BIT.B2 ではなく BIT.B2 ?

    -----
    RX71M は自分のフレームワークでもサポートしているので参考になるかと思います。
    github.com/.../RX
Children
  • hirakuni45さん 
     初めまして gNuco です。ご指摘ありがとうございます。

    ●バイナリの書き込み方法
     RX63N では  Flash Development Toolkit (FDT) を使用、
     RX71M に乗り替えたタイミングで  Renesas Flash Programmer (RFP) に乗り替えました。
     ちなみにRX71M で初期化処理を全く行わず、ポート方向 PDR 設定とポート出力値 PODR 設定だけを行った時はコードどおりに動いたので、書き込みは正常に行われていると思っていました。●しかし初期化処理を行った時は正しく書き込みが行われたかどうかは分かりません。E1 やデバッガを使えばわかるのでしょうか。これも勉強不足でまだ分かりません。出来ればこれらが分かってから質問をした方が良かったのでしょうが、甘えておりました。申し訳ありません。

    ●E1 を使わない理由
     一言でまとめると、最近のマイコンの使用方法を1から学び直す必要があったので、E1 使用法の勉強まで手が回らなかったからです。 ●詳細は長くなります。15年程前からベストテクノロジー社の SH2 マイコンボードを使って電子工作を始めました。しかし処々の理由で10年間電子工作が出来なくなり、昨年10年ぶりに電子工作を再開しました。その時点で使用したいセンサの出力が SPI 通信を使用しており、SH2 が SPI に対応していないので、RX マイコンに乗り替えました。●SH2 マイコンではベストテクノロジー社製の GCC  Developer Lite だけでプログラミング、ビルドから書き込みまで出来た為、ブートストラップ、動作モード、リンカ等々の知識が不要でした。それ故、他社製のボードを使う為に、ブートストラップ等々マイコンの基礎知識を1から学ばなければならない『超初心者』に戻りました。更に e2studio, G++ 等々を学ぶのに精いっぱいで、とりあえず使わなくても何とかなる E1 の勉強を後回しにしました。『使えるようになった方が早道だったかもしれない』とも思いますが、精神的にとても出来ませんでした。

    ●PORTE.PDR.BIT.B2 = 1; // PG2 出力ポート
    PORTE.PODR.BIT.B = 0; // 又は = 1;     は御指摘通りコピペ後の編集ミスです。

     当初 I/O ポートの動作確認にオンボードLED (PG2)を使用するつもりでした。しかしUSB モードにおける LED の動作が不安定であった為、シングルチップ・モードでの LED の動作を信用できなくなり、1ヵ月間ボード・メーカとメール相談をして、メーカがプルアップ抵抗が付けていていない事が原因と分かりました。●この様な事情もあって、I/O の動作確認は オンボードLED (PG2:プルアップ抵抗を外付け)と PE0 - PE7 を併用しました。その時のコードは以下のものです。
     PORTE.PDR.BYTE = 0xff;   PORTG.PDR.BIT.B2 = 1;
    PORTE.PODR.BYTE = 0x55; // または = 0xaa; , = 0xf0; , = 0x0f;  等々
    PORTG.PODR.BI.B2 = 1; // または = 0;
    ただ当フォーラムで御相談をするにあたり簡単化の為 PORT-E のコードを省略する事にしましたが、コピペ後の編集でミスをしました。申し訳ありません。●ちなみに USB モードにおけるオンボードLED の不安定動作というのが『リセット後3秒間点燈してから消燈する』という意味ありげなものだった為、私が『メーカが設定した演出』ではないかと勘違いし、かつメーカがこの事象を把握していなかった為に話がこじれ、原因究明に1カ月かかりました。この間のゴタゴタも E1 使用法の勉強を後回しにする理由の一つになりました。言い訳ばかりですが。

    ●GitHub を見せていただきました。
     先ずは LED の点滅サンプルから参考にさせていただきます。また、センサとの通信にSPI だけでなく I2C 通信も必要になったので、これらも参考にさせていただきます。ありがとうございます。
     ただ、GitHub の存在も最近知ったばかりなので、使い方はこれから勉強します。

    以上、言い訳ばかりになってしまいましたが、色々と御指摘、御助言ありがとうございました。
    参考にさせていただきます。