//============================================================================ // R8C/25 I2C液晶,ADC,UART,AD9833-2CH 制御プログラム // 2015.09.22 Copyright narichan //============================================================================ #include #include #include "sfr_r825.h" // R8C/25 SFRの定義ファイル == #include "lcd_st7032i_lib.h" // ST7032i(I2C)液晶表示ライブラリ ジャパンマイコンカーラリー実行委員会 == //====================================== // 定数 //====================================== #define SDATA0 p2_0 // DDS0 #define SCLK0 p2_1 // DDS0 #define FSYNC0 p2_2 // DDS0 #define SDATA1 p2_3 // DDS1 #define SCLK1 p2_4 // DDS1 #define FSYNC1 p2_5 // DDS1 #define Freq_Unit 0.074505806 // 20MHz / 2^28 //======================================== // プロトタイプ //======================================== void init( void ); void Init_UART(void); void Send_UART(char); void Rec_UART(char *); void Send_UART_s(char *); void Init_ADC(void); void Get_ADC(unsigned int *); void wait(void); void INIT_DDS(void); void DDS_WRITE(unsigned int DDS_SEL); void sprintf_(char *str,float mVolt_ ); //======================================== // 変数 //======================================== unsigned short int DDS_DATA; //16bit data unsigned int UART_DATA; //======================================================================== void main( void ) { unsigned int lp; init(); // 初期化 asm("ldipl #2") ; //IPLを設定する(0〜7) ※注)プロセスの割り込み優先レベル > IPL なら割り込みが発生する asm(" fset I "); //enable Intrupt(Iフラグ) initLcd(); // initialize I2C LCD Init_UART(); // initialize UART1 Init_ADC(); // initialize A/D Converter INIT_DDS; // initialize DDS // UART_DATA = 0x39; // コマンド デフォルト = 9 Send_UART_s("R8C/25 Connected OK> "); // 初期メッセージ送出 lcdContrast( 18 ); // コントラスト(濃さ)の設定0〜63 lcdPosition( 0, 0 ); lcdPrintf( "Power&RL" ); // 初期データLCD表示 while( 1 ); // イベント待ちループ } //======================================================================== void init( void ) { int i; prc0 = 1; // プロテクト解除 cm04 = 1; // XCIN,XCOUT使用 cm06 = 0; // cm16,cm17 有効 cm16 = 0; // cm17 = 0; // 分周 なし cm13 = 1; // P4_6,P4_7をXIN-XOUT端子にする cm05 = 0; // XINクロック発振 for(i=0; i<50; i++ ); // 安定するまで少し待つ(約10ms) ocd2 = 0; // システムクロックをXINにする prc0 = 0; // プロテクトON // ポートの入出力 pd2 = 0x3f; p2 = 0x3f; //SDATA=1,SCLK=1,FSYNC=1 // タイマRB // 周期 = 1 / 20[MHz] * (TRBPRE+1) * (TRBPR+1) // = 1 / (20*10^6) * 200 * 100 // = 0.001[s] = 1[ms] trbmr = 0x00; // 動作モード、分周比設定 trbpre = 200-1; // プリスケーラレジスタ trbpr = 100-1; // プライマリレジスタ trbic = 0x05; // 割り込み優先レベル設定 trbcr = 0x01; // カウント開始 // タイマRA // 周期 = 1 / 32.768[KHz] /32 * (TRAPRE+1) * (TRA+1) // = 1 / 1.024[ms] * 256 * 2 // = 0.9765625[ms] * 512 = 500[ms] tramr = 0x40; // 動作モード、fc32 trapre = 256-1; // プリスケーラレジスタ tra = 2-1; // プライマリレジスタ traic = 0x07; // 割り込み優先レベル設定 tstart_tracr = 0x01; // カウント開始 } //======================================================================== //UART0 RCV 割り込み処理 //======================================================================== #pragma interrupt UART0_RCV(vect=18) void UART0_RCV( void ) { char error; error = u0rbh & 0xf0; // エラーデータ if (error == 0x00 ){ UART_DATA = u0rbl; } re_u0c1 = 1; // 受信可 } //======================================================================== // タイマRB 割り込み処理 LCD表示処理用関数(1msごとに実行) //======================================================================== #pragma interrupt intTRB(vect=24) void intTRB( void ) { // LCD表示処理用関数(1msごとに実行) lcdShowProcess(); } //======================================================================== // タイマRA 割り込み処理 AD変換取り込み UART送受信 サイン波周波数変更 //              LCD表示データセット             //======================================================================== #pragma interrupt intTRA(vect=22) void intTRA( void ) { unsigned int i; unsigned int ad_data; unsigned int cnv_data; float ad_data_f; float cnv_data_f; float cnv_data_f_PO; float cnv_data_f_RL; float dds_data_f; unsigned long int dds_DAT; unsigned int dds_LSB; unsigned int dds_MSB; unsigned char msg_line[10]; unsigned char msg_line_1[10]; unsigned char c_data; float POWER_dBm; float POWER_W; float RL_dB; float    VSWR; float    LGP_; float    P_; unsigned int POWER_DATA; unsigned int VSWR_DATA; tstart_tracr = 0x00; // カウント停止 //+++++++++++++++++++++++++++++++++ 0は何もしない デフォルトは9 +++++++++++++++++++++++++++++++++ if (UART_DATA != 0x30){ // 0以外の処理 //*********************** 1,3,5,8,9 ****************************** if ((UART_DATA == 0x31) || (UART_DATA == 0x33) || (UART_DATA == 0x35) || (UART_DATA == 0x38) || (UART_DATA == 0x39) ){ //POW-Vの処理 ch2 = 0; // ch1 = 0; // ch0 = 0; // AN0指定 Get_ADC(&ad_data); // アナログ値取り込み ad_data_f = ad_data ; // フロート化 cnv_data_f = ad_data_f / (float)255 * (float)5000; //電圧に変換(REF=5000mV) //DDS if (UART_DATA == 0x39) { dds_data_f = cnv_data_f / Freq_Unit; // DDSのFREQREG値計算 dds_DAT = (unsigned long int)dds_data_f; // 32bit binary dds_LSB = (dds_DAT & 0x03fff) | 0x4000; // 14LSB + REGaddress for ( i=1; i<=14; i++ ) dds_DAT >>=1; // 14MSB = 14bit sift dds_MSB = (dds_DAT & 0x03fff) | 0x4000; // 14MSB + REGaddress DDS_DATA = 0x2000; //ContREG B28=1 RESET=0 // DDS send DDS_WRITE(0); DDS_DATA = dds_LSB; //14LSB send DDS_WRITE(0); DDS_DATA = dds_MSB; //14MSB send DDS_WRITE(0); } //UART if (UART_DATA != 0x39) { cnv_data = (unsigned int)cnv_data_f; sprintf(msg_line,"%04d\n", cnv_data); Send_UART_s(msg_line); // UART Send wait(); } else cnv_data_f_PO = cnv_data_f; } //************************ 2,3,5,8,9 ********************************* if ((UART_DATA == 0x32) || (UART_DATA == 0x33) || (UART_DATA == 0x35) || (UART_DATA == 0x38) || (UART_DATA == 0x39) ){ //RL-Vの処理 ch2 = 0; // ch1 = 0; // ch0 = 1; // AN1指定 Get_ADC(&ad_data); // アナログ値取り込み ad_data_f = ad_data ; // フロート化 cnv_data_f = ad_data_f / (float)255 * (float)5000; //電圧に変換(REF=5000mV) dds_data_f = cnv_data_f / Freq_Unit; // DDSのFREQREG値計算 //DDS if (UART_DATA == 0x39) { dds_DAT = (unsigned long int)dds_data_f; // 32bit binary dds_LSB = (dds_DAT & 0x03fff) | 0x4000; // 14LSB + REGaddress for ( i=1; i<=14; i++ ) dds_DAT >>=1; // 14MSB = 14bit sift dds_MSB = (dds_DAT & 0x03fff) | 0x4000; // 14MSB + REGaddress DDS_DATA = 0x2000; //ContREG B28=1 RESET=0 // DDS send DDS_WRITE(1); DDS_DATA = dds_LSB; //14LSB send DDS_WRITE(1); DDS_DATA = dds_MSB; //14MSB send DDS_WRITE(1); } //UART if (UART_DATA != 0x39) { cnv_data = (unsigned int)cnv_data_f; sprintf(msg_line,"%04d\n", cnv_data); Send_UART_s(msg_line); // UART Send wait(); } else cnv_data_f_RL = cnv_data_f; } //************************ 4,5 ****************************** if ((UART_DATA == 0x34) || (UART_DATA == 0x35) ){ //FOR-Vの処理 ch2 = 0; // ch1 = 1; // ch0 = 0; // AN2指定 Get_ADC(&ad_data); // アナログ値取り込み ad_data_f = ad_data ; // フロート化 cnv_data_f = ad_data_f / (float)255 * (float)5000; //電圧に変換(REF=5000mV) //UART cnv_data = (unsigned int)cnv_data_f; sprintf(msg_line,"%04d\n", cnv_data); Send_UART_s(msg_line); wait(); // UART Send } //************************** 4,5 ********************************** if ((UART_DATA == 0x34) || (UART_DATA == 0x35) ){ //REF-Vの処理 ch2 = 0; // ch1 = 1; // ch0 = 1; // AN3指定 Get_ADC(&ad_data); // アナログ値取り込み ad_data_f = ad_data ; // フロート化 cnv_data_f = ad_data_f / (float)255 * (float)5000; //電圧に変換(REF=5000mV) //UART cnv_data = (unsigned int)cnv_data_f; sprintf(msg_line,"%04d\n", cnv_data); Send_UART_s(msg_line); wait(); // UART Send } //+++++++++++++++++++++++++++++++++ 9以外はLCD表示しない+++++++++++++++++++++++++++++++++ if (UART_DATA == 0x39 ){ //SWR & POWER POWER_dBm =(0.011723329 * cnv_data_f_PO ) + 4.49; POWER_W =(powf(10,POWER_dBm / 10)) / 1000; //mathf.powf sprintf_(msg_line,POWER_W); RL_dB =(0.009025 * cnv_data_f_RL )-1.59; LGP_ = -(RL_dB /20); P_ = powf(10,LGP_); //mathf. VSWR = (1+P_) / (1-P_); sprintf_(msg_line_1,VSWR); //LCD lcdPosition( 0, 0 ); lcdPrintf( "%s"," "); lcdPosition( 0, 0 ); lcdPrintf( "P=%5sW",msg_line); lcdPosition( 0, 1 ); lcdPrintf( "%s"," "); lcdPosition( 0, 1 ); lcdPrintf( "SWR=%3s",msg_line_1); } //+++++++++++++++++++++++++++++++++ 8,9以外は1回こっきりの処理+++++++++++++++++++++++++++++++++ if ((UART_DATA != 0x39) && (UART_DATA != 0x38))UART_DATA = 0x30; // 1回こっきりの処理 } // 0以外ここまで else { // 0の処理 lcdPosition( 0, 0 ); lcdPrintf( "%s"," "); lcdPosition( 0, 1 ); lcdPrintf( "%s"," "); } // 0の処理 ここまで tstart_tracr = 0x01; // カウント開始 } //======================================================================================== // Function Name : INIT DDS //======================================================================================== void INIT_DDS(void) { DDS_DATA = 0x2100; //コントロールレジスタ B28=1 RESET=1 DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0x4625; //FRE =( 20MHz / 684,354,560 )* 0x10625 = 5KHz DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0x4004; // DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0xC000; //PHASE0 <= 0000 DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0x2000; //コントロールレジスタ B28=1 RESET=0 DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0x4625; //FRE =( 20MHz / 684,354,560 )* 0x10625 = 5KHz DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0x4004; DDS_WRITE(0); DDS_WRITE(1); DDS_DATA = 0xC000; //PHASE0 <= 0000 DDS_WRITE(0); DDS_WRITE(1); } //========================================================================================= // Function Name : DDS_WRITE //========================================================================================= void DDS_WRITE(unsigned int DDS_SEL) { unsigned int i,d; d = DDS_DATA; if (DDS_SEL == 0){ FSYNC0 = 0; for( i=1; i<=16; i++){ if (d & 0x8000) SDATA0 = 1; else SDATA0 = 0; d <<=1; SCLK0 = 0; SCLK0 = 1; } FSYNC0 = 1; }else if (DDS_SEL == 1){ FSYNC1 = 0; for( i=1; i<=16; i++){ if (d & 0x8000) SDATA1 = 1; else SDATA1 = 0; d <<=1; SCLK1 = 0; SCLK1 = 1; } FSYNC0 = 1; } } ///========================================================================================* // Function Init_ADC ADCの初期化 割り込み未使用 ///========================================================================================* void Init_ADC(void) { // ==================================== // ADCON0の設定 // ==================================== // md = 0; //単発モード ch2 = 0; // ch1 = 0; // ch0 = 0; // AN0指定 adgsel0 = 0; //AN8-AN11使用不可 adst = 0; //A/D変換停止 cks0 = 0; // cks1 = 0; // f4指定 bits = 0; // 8bit mode vcut = 1; //VREF接続 // ==================================== // ADCON2の設定 // ==================================== smp = 0; //サンプル&ホールドなし } ///========================================================================================* // Function Get_ADC ADC読み取り ///========================================================================================* void Get_ADC(unsigned int *ad_data) { adst = 1; // Start while(adst!=0); // Cehck *ad_data = ad ; // Copy adst = 0; // End } ///========================================================================================* // Function Send_UART_s  UART 文字列送信 ///========================================================================================* void Send_UART_s(char *put_string) { while(*put_string!=0x00){ Send_UART(*put_string); put_string++; } } ///========================================================================================* // Function Init_UART UART初期化 割り込み受信使用 ///========================================================================================* void Init_UART(void) { u0brg = 0x0A; //ビットレート(115200bps) smd0_u0mr = 1; // smd1_u0mr = 0; // smd2_u0mr = 1; //8ビット長   ckdir_u0mr = 0; // 外部クロック未使用 stps_u0mr = 0; //1ストップビット prye_u0mr = 0; //パリティなし clk0_u0c0 = 0; // clk1_u0c0 = 0; // f1 nch_u0c0 = 0; ckpol_u0c0 = 0; uform_u0c0 = 0; te_u0c1 = 1; // 送信可 re_u0c1 = 1; // 受信可 // ************************************ // UARTi割り込みの設定 // ************************************ s0ric = 0x0d; // 割り込み有りレベル6 } ///========================================================================================* // Function Send_UART UART 送信 ///========================================================================================* void Send_UART(char c_data) { while(ti_u0c1 != 1); // 送信バッファ空フラグ(0:UiTBにデータあり) u0tb = c_data; } ///========================================================================================* // Function Rec_UART UART受信 ///========================================================================================* void Rec_UART(char *c_data) { char error_f; char err; *c_data = u0rbl; // UARTi受信バッファレジスタ error_f = u0rbh & 0xf0; // エラーデータ } ///========================================================================================* // Function wait 待ち時間生成 ///========================================================================================* void wait(void) { unsigned int i,i1; for( i1=0 ; i1<500 ; i1++ ){ for( i=0 ; i<200 ; i++ ){ asm("NOP"); } } } //============================================================= // sprintf_ // 入力 float // 出力 char xx.x //============================================================= void sprintf_(char *str,float mVolt_ ) { int i; int k; int l; i = mVolt_ * 10; k = i/10; // 整数部 l = i- ( 10 * k ); // 小数部 sprintf(str,"%d%s%d",k,".",l); } //======================================================================== // end of file //========================================================================