AD変換値の取得方法が分からない

初歩的な質問で大変恐縮なのですが、AD変換された値を取得する方法についてご教授いただきたいです。

RX72T Starter Kitを使用して開発を行っております。

AD変換された値を以下①~③の手順で取得しようとしていますが、取得できていない状態です。

おそらくどこかの理解が間違っていると思うのですが、ご指摘いただけないでしょうか。

(開発環境はe2Studio, GCCです。リアルタイムOSは入れていません)

 

①AD変換する電圧の入力は、マイクロコントローラピンヘッダJA1の9~12ピン(ADC0~ADC3)のいずれかを使用する

 (ユーザーマニュアルを参考:https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/r20ut4272jg0100-rskrx72t-usermanual.pdf

 

②上記のピン位置は以下の場所である

 

③AD変換後の値を取得するには「S12AD.ADDR0~ADDR7」を使用する

 例えば「 hoge = S12AD.ADDR0 」でAD変換後の値がhogeに格納される

 (ピンは4つなのにADDRは8つ指定できるのがよく分かっていない点です)

 

現状ではAD変換後の値が取得できておらず、上記①~③の内いづれか(もしくは全部)が間違っているのではと考えています。

 

初歩的な質問で申し訳ありませんが、ご教授いただけると幸いです。

 

よろしくお願いいたします。

  • panpanpandaさん
    結構設定個所があるみたいです、下は63Tなので多少差異があるかもしれません
    SYS_PROTECT_OFF
    MSTP_S12AD=0;
    MSTP_S12AD1=0;
    MSTP_AD=0;
    SYS_PROTECT_ON
    S12AD.ADCSR.BIT.DBLANS=0;
    S12AD.ADCSR.BIT.GBADIE=0;
    S12AD.ADCSR.BIT.DBLE=0;
    S12AD.ADCSR.BIT.EXTRG=1;
    S12AD.ADCSR.BIT.TRGE=1;
    S12AD.ADCSR.BIT.ADIE=0; //完了割込み禁止
    S12AD.ADCSR.BIT.ADCS=2; //連続スキャンモード
    S12AD.ADCSR.BIT.ADST=0; //A/D変換停止
    S12AD1.ADCSR.BIT.DBLANS=0;
    S12AD1.ADCSR.BIT.GBADIE=0;
    S12AD1.ADCSR.BIT.DBLE=0;
    S12AD1.ADCSR.BIT.EXTRG=1;
    S12AD1.ADCSR.BIT.TRGE=1;
    S12AD1.ADCSR.BIT.ADIE=0; //完了割込み禁止
    S12AD1.ADCSR.BIT.ADCS=2; //連続スキャンモード
    S12AD1.ADCSR.BIT.ADST=0; //A/D変換停止
    MPC_PROTECT_OFF
    MPC.P40PFS.BIT.ASEL=1; //AN000
    MPC.P41PFS.BIT.ASEL=1; //AN001
    MPC.P42PFS.BIT.ASEL=1; //AN002
    MPC.P43PFS.BIT.ASEL=1; //AN003
    MPC.P44PFS.BIT.ASEL=1; //AN100
    MPC.P45PFS.BIT.ASEL=1; //AN101
    MPC.P46PFS.BIT.ASEL=1; //AN102
    MPC.P47PFS.BIT.ASEL=1; //AN103
    MPC_PROTECT_ON
    S12AD.ADANSA.BIT.ANSA=0xF; //AN003~AN000有効
    S12AD.ADANSA.BIT.PG000EN=0; //GAIN無効
    S12AD.ADANSA.BIT.PG001EN=0; //GAIN無効
    S12AD.ADANSA.BIT.PG002EN=0; //GAIN無効
    S12AD.ADANSA.BIT.PG000SEL=0;
    S12AD.ADANSA.BIT.PG001SEL=0;
    S12AD.ADANSA.BIT.PG002SEL=0;
    S12AD1.ADANSA.BIT.ANSA=0xF; //AN003~AN000有効
    S12AD1.ADANSA.BIT.PG000EN=0; //GAIN無効
    S12AD1.ADANSA.BIT.PG001EN=0; //GAIN無効
    S12AD1.ADANSA.BIT.PG002EN=0; //GAIN無効
    S12AD1.ADANSA.BIT.PG000SEL=0;
    S12AD1.ADANSA.BIT.PG001SEL=0;
    S12AD1.ADANSA.BIT.PG002SEL=0;
    S12AD.ADSSTR0=20; //サンプリングステート
    S12AD.ADSSTR1=20; //サンプリングステート
    S12AD.ADSSTR2=20; //サンプリングステート
    S12AD.ADSSTR3=20; //サンプリングステート
    S12AD.ADSSTR4=20; //サンプリングステート
    S12AD.ADSSTR5=20; //サンプリングステート
    S12AD.ADSSTR6=20; //サンプリングステート
    S12AD.ADSSTR7=20; //サンプリングステート
    S12AD1.ADSSTR0=20; //サンプリングステート
    S12AD1.ADSSTR1=20; //サンプリングステート
    S12AD1.ADSSTR2=20; //サンプリングステート
    S12AD1.ADSSTR3=20; //サンプリングステート
    S12AD1.ADSSTR4=20; //サンプリングステート
    S12AD1.ADSSTR5=20; //サンプリングステート
    S12AD1.ADSSTR6=20; //サンプリングステート
    S12AD1.ADSSTR7=20; //サンプリングステート
    S12AD.ADSHCR.BIT.SSTSH=20; //サンプリング時間
    S12AD.ADSHCR.BIT.SHANS=0; //ホールド禁止
    S12AD.ADCER.BIT.ADRFMT=0; //右詰めデータ
    S12AD.ADCSR.BIT.ADST=1; //A/D変換開始
    S12AD1.ADSHCR.BIT.SSTSH=20; //サンプリング時間
    S12AD1.ADSHCR.BIT.SHANS=0; //ホールド禁止
    S12AD1.ADCER.BIT.ADRFMT=0; //右詰めデータ
    S12AD1.ADCSR.BIT.ADST=1; //A/D変換開始
    //A/Dコンバータ8チャネルのデータを表示
    if(S12AD.ADCSR.BIT.ADST){
    printf("0=%6d 1=%6d 2=%6d 3=%6d 4=%6d 5=%6d 6=%6d 7=%6d \r",
    S12AD.ADDR0,
    S12AD.ADDR1,
    S12AD.ADDR2,
    S12AD.ADDR3,
    S12AD1.ADDR0,
    S12AD1.ADDR1,
    S12AD1.ADDR2,
    S12AD1.ADDR3);
    }
  • panpanpandaさん、こんにちは。NoMaYです。#お久しぶりです。

    RXスマートコンフィグレータというツール(e2 studioに組み込まれています)を使うと、AD変換ぐらいであれば何事も無くコード生成出来るだろうと思います。そして、そのコードと現在の手元のコードを比較して相違点を調べていくのも手ではないかと思うのです。(そのままコードを使っても良いと思います。)

    スマート・コンフィグレータ
    www.renesas.com/jp/ja/products/software-tools/tools/solution-toolkit/smart-configurator.html
     

  • IKUZOさん
    早速お返事いただきありがとうございます!
    初期設定が必要なのですね、なるほど。
    頂いたコードを参考に色々試してみます!
  • NoMaYさん
    お返事いただきありがとうございます。
    また、その節は大変お世話になりました。非常に助かりました。
    コンフィグレータというツールがあるのですね。そしてURLまでいただき本当にありがとうございます。
    こちら参考にして相違点確認してみます!
  • NoMayさん

    スマート・コンフィグレータの情報をいただきありがとうございました。

    使用しコードを作成しました。

     

    RX72Tで走らせるところまでは問題なくできているのですが、AD変換値を取得することができていません。

    以下のコードで実行しており、何かデータが入ればブレークアウトする仕様としているのですが、ブレークポイントに入ってこないです。

     

    データ取得の方法としてどこが問題となっているのでしょうか。

    それとも確認の方法として間違っているでしょうか。

     

    お忙しいところ申し訳ありませんが、ご教授いただけると幸いです。

    よろしくお願いいたします。

     

    ****Main***

    void main(void)
    {
      ad_channel_t channel = ADCHANNEL0;
      uint16_t * const buffer;
      R_Config_S12AD0_Create();
      while(true){
        R_Config_S12AD0_Start();
        R_Config_S12AD0_Get_ValueResult(channel, buffer);
        R_Config_S12AD0_Stop();
      }
    }

    ****関数部分**

    void R_Config_S12AD0_Create(void)
    {
      /* Cancel S12AD0 module stop state */
      MSTP(S12AD) = 0U;

      /* Disable and clear interrupt flags of S12AD0 module */
      S12AD.ADCSR.BIT.ADIE = 0U;
      S12AD.ADCMPCR.BIT.CMPAIE = 0U;
      S12AD.ADCMPCR.BIT.CMPBIE = 0U;
      IR(S12AD, S12ADI) = 0U;
      IEN(S12AD, S12ADI) = 0U;

      /* Set S12AD0 control registers */
      S12AD.ADCSR.WORD = _0000_AD_DBLTRIGGER_DISABLE | _0100_AD_ASYNC_TRIGGER | _0200_AD_SYNCASYNCTRG_ENABLE |
      _0000_AD_SINGLE_SCAN_MODE;

      /* Set AD conversion start trigger sources */
      S12AD.ADSTRGR.WORD = _0000_AD_TRSA_ADTRG;
      S12AD.ADADC.BYTE = _00_AD_1_TIME_CONVERSION | _00_AD_ADDITION_MODE;
      S12AD.ADDISCR.BYTE = _00_AD_DISCONECT_DISCHARGE | _0F_AD_DISCONECT_15ADCLK;

      /* Set channels and sampling time */
      S12AD.ADSSTR0 = _1B_AD0_SAMPLING_STATE_0;
      S12AD.ADANSA0.WORD = _0001_AD_ANx00_USED;

      /* Set AN000 amplifier */
      S12AD.ADPGADCR0.BIT.P000DEN = 0U;
      S12AD.ADPGACR.BIT.P000CR = _0001_AD_PATH_ANx_NONE_NONE;
      S12AD.ADCER.WORD = _0000_AD_AUTO_CLEARING_DISABLE | _0000_AD_SELFTDIAGST_DISABLE | _0000_AD_RIGHT_ALIGNMENT;
      S12AD.ADELCCR.BYTE = _02_ALL_SCAN_COMPLETION;
      S12AD.ADCSR.WORD |= _1000_AD_SCAN_END_INTERRUPT_ENABLE;

      /* Set compare control register */
      S12AD.ADCMPCR.WORD = _0000_AD_WINDOWB_DISABLE | _0000_AD_WINDOWA_DISABLE | _0000_AD_WINDOWFUNCTION_DISABLE;

      /* Set interrupt and priority level */
      IPR(S12AD, S12ADI) = _0F_AD_PRIORITY_LEVEL15;

      /* Set AN000 pin */
      PORT4.PMR.BYTE &= 0xFEU;
      PORT4.PDR.BYTE &= 0xFEU;
      MPC.P40PFS.BYTE = 0x80U;

      /* Set ADTRG0# pin */
      MPC.PA4PFS.BYTE = 0x09U;
      PORTA.PMR.BYTE |= 0x10U;

      R_Config_S12AD0_Create_UserInit();
    }

     

    void R_Config_S12AD0_Start(void)
    {
      IR(S12AD, S12ADI) = 0U;
      IEN(S12AD, S12ADI) = 1U;
      S12AD.ADCSR.BIT.TRGE = 1U;
    }

     

    void R_Config_S12AD0_Stop(void)
    {
      S12AD.ADCSR.BIT.TRGE = 0U;
      S12AD.ADCSR.BIT.ADST = 0U;
      IEN(S12AD, S12ADI) = 0U;
      IR(S12AD, S12ADI) = 0U;
    }

     

    void R_Config_S12AD0_Get_ValueResult(ad_channel_t channel, uint16_t * const buffer)
    {
      if (channel == ADCHANNEL0)
      {
        *buffer = (uint16_t)(S12AD.ADDR0);
      }

      else
      {
        /* Do Nothing */
      }
      if (*buffer != 0U)
      {
        *buffer = (uint16_t)(S12AD.ADDBLDR.WORD); //ここでブレークポイント
      }

    }

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

    これはAPI関数の使い方を誤解されていると思います。RXスマートコンフィグレータで生成するAPIで、動作完了まで待ちが発生するようなものは以下の簡易IICの例のように動作完了を割り込みで知らせるような作りになっています。S12ADも変換終了コールバック(割り込み)でグローバル変数にフラグを立てるようにして、Startの後、そのフラグが立つのをwhileで待つようにしないといけない、と思います。

    とっさに、(つい最近も他の方に紹介したのですが)役に立ちそうな最近のスレッドかな、と私の頭に思い浮かんだスレッドとしては以下のスレッドがあります。(RX72TではなくてRX231ですが。)

    RX231のコード生成を用いた簡易IIC通信について
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/6169/rx231-iic/34171#34171

    起動直後にr_Config_RIIC0_error_interrupt()が永遠に呼ばれる (RX231/CS+ )
    japan.renesasrulz.com/cafe_rene/f/forum21/6210/r_config_riic0_error_interrupt-rx231-cs

    I2Cバスビジー状態になる時がある(RX231/CS+/Config_RIIC0)
    japan.renesasrulz.com/cafe_rene/f/forum5/6219/i2c-rx231-cs-config_riic0