いつもお世話になります。
としです。
標記の件、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進数にして考えても見たのですが小数点第一位だけを出すのはわかりませんでした。
以上、アドバイスがあれば教えていただきたく思います。
とし さん、こんにちは。NoMaYです。別の発想として、(V(ボルト)ではなく) mV(ミリボルト)でuint16_tの変数に一旦格納して、4桁目(千の位)の数値と3桁目(百の位)の数値を取り出す、というのも素朴でよいかも、と思いました。
個人的には 2のべき乗の値以外での除算はコストが気になるので避けたいです。
https://wandbox.org/permlink/Hw2Z0gwzvCeWIU1p https://wandbox.org/permlink/FKiy3jUchube1srD
チョコです。
>今回、7seg を使用したのも本来はIICAで行いたかったのですが
>表示すらされなかったので、暫定でもこちらを使用しました。
RENESASのRL78/G11のサンプルコードを見ていたら,「デジタル電圧計」(R01AN4063JJ0100)
と言うのがありました。
これは,電圧を測って結果をIICAでLCDに表示しているようです。
このアプリケーションノートはとしさんのやりたいことの参考になりそうです。
また,「1.5 内部基準電圧による補正処理 」に整数での演算について説明があるので,参考になるかもしれません。
一度,ダウンロードしてみてください。