PMC0のシンボル定義が見つかりません。

マイコンはRL78/G13 48ピンのR5F100GEです。

搭載されている評価ボードはRM-RL78-G13です。

LチカさせようとP00からHi/Loを出力させようとしたのですが

うまくいきませんでした。

最初、

P0_bit.no0 = 0 // 出力Lo(念のため)

PM0_bit.no0 = 0 // 出力モードに設定

としてから、1秒周期で

P0_bit.no0 = 0 or 1 // 出力ラッチ設定

としていたのですが、Lチカできていません。

ソフト的な設定は他に何か必要でしょうか?

→P00に関しては、PMCレジスタの設定で「デジタル入出力」に設定する必要がありますか?

PMC00はリセット値はアナログ入力です。

これを試そうとしたのですが、PMC0のシンボル定義がなく困っています。(←タイトルの質問です。)

PMC12と14だけ定義されているのですが、なぜPMC0がないのか理解できません。

48ピンにはあると思うのですが違うのでしょうか?

 

  • チョコです。

    >PMC12と14だけ定義されているのですが、なぜPMC0がないのか理解できません。

    iodefine.hのバグだと思います。64ピンで確認すると以下のようにPMC0もきちんと定義されています。

    #define PMC0         (*(volatile __near unsigned char  *)0x60)
    #define PMC0_bit     (*(volatile __near __bitf_T *)0x60)
    #define PMC12        (*(volatile __near unsigned char  *)0x6C)
    #define PMC12_bit    (*(volatile __near __bitf_T *)0x6C)
    #define PMC14        (*(volatile __near unsigned char  *)0x6E)
    #define PMC14_bit    (*(volatile __near __bitf_T *)0x6E)

    とりあえずは、iodefine.hにこのPMC0関係の定義部分の2行を追加して試してください。

     

  • > PMC12と14だけ定義されているのですが、なぜPMC0がないのか理解できません。

    PMC0 は ポート0 のピンのデジタル入出力/アナログ入力を切り替えるレジスタですが、RL78/G13 の 48ピン製品でデジタル入出力とアナログ入力が切り替えられるピンは

    24: P147/ANI18
    37: P120/ANI19

    だけであり、ポート0 のピンは

    34: P01/TO00/RxD1
    35: P00/TI00/TxD1

    となっていてアナログ入力機能がないため、PMC0 も存在しないのだと思います。

  • チョコです。

    fujitaさんが正解ですね。P00とP01は20ピン~32ピンだけがアナログ入力が存在し、

    36ピン~48ピンはP0はP00とP01しかないので、P0にアナログ機能が兼用されtれいないので、PMC0がなかったのですね。

    探してみたら、RM-RL78-G13が見つかったので、P00とP01にLEDを接続して(実際はLEDと電流制限抵抗を実装したボードに接続して)、

    実際に動作させてみました。

    RM-RL78-G13では、P00とP01は下側のピン以外にUART1の4ピンのヘッダにも出ているので、そちらから信号を引き出してみました。

    デバッガとしては、E1を使いました。

    CS+CC-RLでコード生成を使用して、TM00を500msのインターバル・タイマで使用しています。

    初期設定は以下のようにP0とPM0を設定しているだけです。

    void R_PORT_Create(void)
    {
        P0 = _00_Pn0_OUTPUT_0 | _00_Pn1_OUTPUT_0;
        PM0 = _00_PMn0_MODE_OUTPUT | _00_PMn1_MODE_OUTPUT | _FC_PM0_DEFAULT;
    }

    main関数の中は以下のようにHALTで500msのインターバル・タイマ割り込みを待って、P00の設定を行っています。

        while (1U)
        {
            P0_bit.no0 = 0;
            HALT();
            P0_bit.no0 = 1;
            HALT();
        }

    これとは別にTM00の割り込み処理の中でP01を反転させています。

    static void __near r_tau0_channel0_interrupt(void)
    {
        /* Start user code. Do not edit comment generated here */
        P0_bit.no1 ^= 0x01;
        /* End user code. Do not edit comment generated here */
    }

    これで、P00とP01に接続した2つのLEDが1秒周期で点滅しました。

    参考までに、プロジェクト・ファイルをzipで圧縮したものを添付しておきます。

    TEST_G13_PMC.zip

     

  • チョコです。

    参考として、こちらで評価したときの写真を添付します。

    ここからブレーク・ポイントを使って、いくつかの表示状態を作りました。

    ダウンロードし、起動時でブレーク・ポイントを設定した画面です。

    LEDはカソードをポートに接続しているので、起動時には点灯しています。

     

    ここから、ブレーク・ポイントを有効にして実行します。

    設定したブレーク・ポイントで実行を中断し、P01だけが1になり、消灯した状態です。

    P00をリセットするところにブレーク・ポイントを設定して、実行します。

    P00が消灯して、P01が点灯した状態です。

    ということで、動作が確認されました。

     

     

  • >チョコ様

    ご回答ありがとうございます。

    Lチカに成功しました。

    ただ
     PMC0_bit.no0 = 0;
    とするかどうかに関わらず、Lチカは出来ました。
    →オシロで確認し、Hi/Loが出力されていることを確認しました。
    P00はデフォルトでデジタル入出力ということでしょうか。

    直接的な原因はGNDとの間をオシロで見たところ、
    波形がなまっていましたので、GNDに落ち切っていなかったようです。
    ブレッドボードにしっかり挿しているのですが、内部が断線しているのか、
    別のところに挿しなおしたところうまくいきました。

    とりあえず解決しましたが、P00については腑に落ちないです。
  • すみません、直前の回答を見ずに投稿してしまいました。
    時間がないのであとで確認します。。
  • >チョコ様、fujita様

    下記、承知しました。
    「36ピン~48ピンはP0はP00とP01しかないので、P0にアナログ機能が兼用されtれいないので、PMC0がなかったのですね。」
    ありがとうございました。