基于LABVIEW和RL78评估板的心电图采集系统创意进度贴+RL78 ad采集端程序发布 这个采集程序上周都已经完成了,本来想着和labview程序一起发布,怕到时帖子发了图片又给弄乱了,先发布RL78/G14的ad采集端程序吧。 选取AD采样的AIN3(P23)引脚作为采样的输入管脚,利用Applilet3 for RL78_G14产生AD的驱动程序。才开始直接采样总是出问题,后来发现是自己的配置错误,使用选择模式,而不是扫描模式就能解决问题。具体配置如下所示: void R_ADC_Create(void) { ADCEN = 1U; /* supply AD clock */ ADM0 = _00_AD_ADM0_INITIALVALUE; /* disable AD conversion and clear ADM0 register */ ADMK = 1U; /* disable INTADinterrupt */ ADIF = 0U; /* clear INTADinterrupt flag */ /* Set INTAD low priority */ ADPR1 = 1U; ADPR0 = 1U; /* Set ANI0 - ANI3 pin as analog input */ PM2 |= 0x0FU; ADM0 = _30_AD_CONVERSION_CLOCK_4 | _00_AD_TIME_MODE_NORMAL_1 |_00_AD_OPERMODE_SELECT; ADM1 = _00_AD_TRIGGER_SOFTWARE | _00_AD_CONVMODE_CONSELECT; ADM2 = _00_AD_POSITIVE_VDD | _00_AD_NEGATIVE_VSS | _00_AD_AREA_MODE_1 |_00_AD_RESOLUTION_10BIT; ADUL = _FF_AD_ADUL_VALUE; ADLL = _00_AD_ADLL_VALUE; ADS = _03_AD_INPUT_CHANNEL_3; } 同时在ADC_Start中添加 while(ADCS); ,等待系统AD配置完成,才进行下一步。 void R_ADC_Start(void) { ADCE = 1U; ADIF = 0U; /* clear INTADinterrupt flag */ ADMK = 0U; /* enable INTADinterrupt */ ADCS = 1U; /* enable ADconversion */ while(ADCS); } 然后编写中断服务函数,修改r_cg_adc_user.c中的函数如下: __interrupt static void r_adc_interrupt(void) { /* Start user code. Do not edit comment generated here */ ADCS = 0U; /* disable ADconversion */ uart_adc_value();
/* End user code. Do not edit comment generated here */ } 中断服务函数调用了 uart_adc_value()函数,此函数原型如下: void uart_adc_value(void) { int s,i; uint8_t string[3]={'\r','\n'}; uint8_t start[3]="ST"; s=((long)(ADCR>>6)*5000)/1024; uint16_ToString(adc_string_value,0,s); while(R_UART2_Send(start,2)); while(R_UART2_Send(adc_string_value,4)); NOP(); while(R_UART2_Send(string,2)); } 其中的R_UART2_Send被我修改过,中间添加了延时函数,否则会传输不正常。 原型修改后如下所示: /*********************************************************************************************************************** * Function Name: R_UART2_Send * Description : This function sends UART2 data. * Arguments : tx_buf - * transfer buffer pointer * tx_num - * buffer size * Return Value : status - * MD_OK or MD_ARGERROR ***********************************************************************************************************************/ MD_STATUS R_UART2_Send(uint8_t * consttx_buf, uint16_t tx_num) { /* Declare a loop count variable */ uint16_t i; MD_STATUS status = MD_OK;
if (tx_num < 1U) { status = MD_ARGERROR; } else { gp_uart2_tx_address= tx_buf; g_uart2_tx_count = tx_num; SMR10 |= _0001_SAU_BUFFER_EMPTY; STMK2= 1U; /* disable INTST2 interrupt */ while(g_uart2_tx_count) { TXD2 =*gp_uart2_tx_address; /* Allow for the transmission to complete */ for (i=0; i < 6000; i++) { /* Add 1 instruction delay */ NOP(); } gp_uart2_tx_address++; g_uart2_tx_count--; // STMK2 = 0U; /* enable INTST2 interrupt */ } }
return (status); } 上述的函数uart_adc_value()由在主函数中的while循环中断调用adc_get_value()函数触发,adc_get_value函数原型如下: void adc_get_value(void) { R_ADC_Start(); R_ADC_Stop(); } 上述程序经过改动编译后,调试运行结构都符合预期。然后下载程序到RL78/G14中的FLASH中,通过renesas flash programmer下载到芯片中,然后修改跳线帽使程序全速运行。
整体程序见附件中。
[ 本帖最后由 youzizhile 于 2013-11-2 19:47 编辑 ] |