7segLED へのADC変換表示

いつもお世話になります。

としです。

標記の件、7segLED へのADC変換表示でアドバイスを頂きたく思います。

内容は7セグLEDへの小数点以下の表示方法です。

環境;CSPlus_CC_Package_V80300

         CC-RL_V10900

   RL78G11(R5F1058A)

 

初期設定

 P51~56 7segのabcdef

 P00~01 7segのgとドット  ⇒ピン数が足りないのでP5.0を使用しました。

 チャネル0 インターバルタイマ ⇒wait関数を作る様

 チャネル3 インターバルタイマ ⇒7segの桁を変えるよう

 ADC等の初期設定は全て触っておりません。

 

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
volatile    uint8_t g_disp_data[11];     /* P5表示データバッファ   */
uint8_t const CONV_7SEG[11] =
{
    0x7e,    /* "0"  */
    0x0c,    /* "1"  */
    0x36,    /* "2"  */
    0x1e,    /* "3"  */
    0x4c,    /* "4"  */
    0x5a,    /* "5"  */
    0x7a,    /* "6"  */
    0x4e,    /* "7"  */
    0x7e,    /* "8"  */
    0x4e,    /* "9"  */
    0x00    /* " "  */
 };

volatile    uint8_t g_disp_data2[11];    /* P0表示データバッファ   */
uint8_t const CONV_7SEG2[11] =
{
    0x00,    /* "0"  */
    0x00,    /* "1"  */
    0x01,    /* "2"  */
    0x01,    /* "3"  */
    0x01,    /* "4"  */
    0x01,    /* "5"  */
    0x01,    /* "6"  */
    0x00,    /* "7"  */
    0x01,    /* "8"  */
    0x01,    /* "9"  */
    0x00    /* " "  */
};

 

void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    while (1U)
    {
        uint8_t count = 0U;               /* カウンタクリア           */
        g_result_buffer = 0U;            /* A/D結果クリア            */

        R_ADC_Set_OperationOn();  /* 電圧コンパレータを動作許可状態 */

       wait_time(1);                        /* 安定のため5us待機        */
    
        R_ADC_Start();                    /* ADCスタート                */

    /* ---- Main loop ---- */
        while (1U)
        {
            HALT();                  /* HALTモードで待機             */
            ADIF = 0U;                /* 割り込み要求フグのクリア    */
           R_ADC_Get_Result(&g_result_buffer);    /* AD変換結果(10ビット)呼び出し */
            g_disp_data  [0] =  CONV_7SEG[( g_result_buffer)] ;
            g_disp_data2[0] =  CONV_7SEG2[( g_result_buffer)] ;
            g_disp_data  [1] =  CONV_7SEG[( g_result_buffer)] ;
            g_disp_data2[1] =  CONV_7SEG2[( g_result_buffer)] ;
            g_disp_data  [2] =  CONV_7SEG[( (g_result_buffer /100)/2 )] ;
            g_disp_data2[2] =  CONV_7SEG2[( (g_result_buffer /100)/2 )]
            wait_time(1);        /* 安定のため5us待機        */

static void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    R_TAU0_Channel3_Start();        /* チャネル3カウント開始        */
    EI();
    /* End user code. Do not edit comment generated here */
}

 

 

R_ADC_Get_Result(&g_result_buffer); でAD変換値を0~1023で読んでいるので

この変換値をなんらかで計算すると思うのですが

どうすればよいかが分かりません。

整数の場所は(AD変換値/100)/2 で出すことができました。

小数点以下がどう計算するのかが分かりません。

2進数にして考えても見たのですが小数点第一位だけを出すのはわかりませんでした。

 

以上、アドバイスがあれば教えていただきたく思います。

 

 

  • チョコです。
    もう一つ問題がありました(こちらがより基本的な間違いです。)
    「while ( 1 == TMIF00 )」は判断条件が間違えていますね。ここは、比較データは"1"ではなく"0"です。

    TMMK00をセットするタイミングはここしかないです。(できれば、R_TAU0_Channel0_Start()を使うのではなく、単にTMIF00をクリアし、TS0に1を書き込むだけの方が簡単です。)
  • チョコです。
    "r_cg_tau.user.c"を眺めると、INTTM03の中でA/D変換完了の割り込みでHALT を解除し、INTAD割り込み処理の中で変換データを読み出して、A/Dを停止させているようですね。INTADがINTTM00よりも優先順位が上なら動くはずです。
    全体像が見えないので、これ以上の説明はできません。
  • チョコさん

    お世話になります。
    としです。

    R_TAU0_Channel0_Start()については関数があるので
    使っていました。

    これを使うことで割り込みマスクに影響があることが
    やっと理解できました。
    ありがとうございます。

    下記のようにプログラムを修正させていただきました。
    void wait_5us(void)
    {
    TMIF00 = 0; /* 割り込み要求フラグをクリア */
    TS0L = 0x00; /* TM00 のカウントをスタート */
    TMMK00 = 1; /* 割り込みマスク設定 */
    while ( 0== TMIF00 ) /*カウントアップ待ち */
    {
    P5_bit.no6 = 1; /* 確認用 */
    NOP();
    }

    }

    また、
    >INTTM03の中でA/D変換完了の割り込みでHALT を解除し、
    >INTAD割り込み処理の中で変換データを読み出して、A/Dを停止させているようですね。
    >INTADがINTTM00よりも優先順位が上なら動くはずです。

    こちらについても、丁寧に説明頂いたので理解できそうです。

    毎回、アドバイスを頂きましてありがとうございます。

    今回の7seg+ADC と別件でPWM+ADC UART+ADCのプログラムを
    シミュレータで確認できました。

    ここからもう一度、前回教えていただきましたRL78/G11のIICAサンプルプログラムに挑戦したいと思います。
  • チョコです。

    >TS0L = 0x00; /* TM00 のカウントをスタート */

    は、"TS0L = 0x01; /* TM00 のカウントをスタート */"の間違いです。

  • チョコさん。

    いつもお世話になります。
    としです。

    ご指摘ありがとうございます。
    >TS0L = 0x00; /* TM00 のカウントをスタート */
    この内容で確認用のLEDが動作していたので
    気づきませんでした。

    もう一度このあたりをハードウェアマニュアルで
    確認しようと思います。
    (ビット操作間違いが多いため。)