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変換後の値が取得できておらず、上記①~③の内いづれか(もしくは全部)が間違っているのではと考えています。

 

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

 

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

Parents
  • panpanpandaさん、こんにちは。NoMaYです。#お久しぶりです。

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

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

  • 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); //ここでブレークポイント
      }

    }

Reply
  • 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); //ここでブレークポイント
      }

    }

Children
No Data