本帖最后由 hjl2832 于 2011-4-21 13:48 编辑
今天在调试程序时居然发现了IAR FOR STM8的一个奇怪的BUG,我将AD采集的值赋给一个数组,结果却发现所有的值都错位。
附上相关程序如下:
//AD采集通道控制定义
#define AD4051_AD0 0x00
#define AD4051_AD1 0x02
#define AD4051_AD2 0x04
#define AD4051_AD3 0x06
#define AD4051_AD4 0x08
#define AD4051_AD5 0x0a
#define AD4051_AD6 0x0c
#define AD4051_AD7 0x0f
unsigned int VoutArray[4]; //** 充电电压 **
unsigned int Vin1Array[4]; //** 太阳能板A电压 **
unsigned int Vin2Array[4]; //** 太阳能板B电压 **
unsigned int IinArray[4]; //** 充电电流 **
unsigned int Iout1Array[4]; //** 负载电流1 **
unsigned int Iout2Array[4]; //** 负载电流2 **
unsigned int tempArray[4]; //** 温度电压 **
unsigned char DatSamCnt=0;
/*******************************************************************************
** 函数名称 :DATA_acq()
** 函数功能 :模拟量数据采集
** 入口参数 :无
** 出口参数 :
*******************************************************************************/
unsigned int DATA_acq(unsigned char channel)
{
unsigned int ADC_DataH;
unsigned char ADC_DataL;
PB_ODR = (PB_ODR & 0xf0)|channel; //** 74HC4051 选通控制 **
ADC_CR1|=0x01; //** 将CR1寄存器的最低位置1,开启AD转换 **
delay_us(5);
ADC_CR1|=0x01; //** 再次将CR1寄存器的最低位置1,开启AD转换 **
while((ADC_CSR & 0x80)!=0x80); //** 等待转换结束 **
ADC_DataH = ADC_DRH; //** 把高位用PB显示出来 ** //****
ADC_DataL = ADC_DRL; //** 把低位用PD显示出来 ** //****
ADC_DataH = ADC_DataL | (ADC_DataH<<8);
ADC_CSR&=(~0x80); //** 软件清零 转换结束 标志位 **
return (ADC_DataH);
}
/**************数据采集***********************************/
void ad_data_gather(void)
{
if(DatSamCnt>=4){DatSamCnt=0;}
// LastVoltgeIn=Vin_Voltge;
VoutArray[DatSamCnt] = DATA_acq (AD4051_AD0); //采集电池充电电压即电池电压
IinArray[DatSamCnt] = DATA_acq (AD4051_AD1); //采集电池充电电流
Iout1Array[DatSamCnt] = DATA_acq (AD4051_AD2); //采集负载1电流
Iout2Array[DatSamCnt] = DATA_acq (AD4051_AD3); //采集负载2电流
Vin1Array[DatSamCnt] = DATA_acq (AD4051_AD4); //采集太阳能板电压
Vin2Array[DatSamCnt] = DATA_acq (AD4051_AD5); //采集风机电压
tempArray[DatSamCnt] = DATA_acq (AD4051_AD6); //采集温度传感器电压
}
执行ad_data_gather后却发现,所有数据都错位,VoutArray[DatSamCnt]的值等于DATA_acq (AD4051_AD6)的值,其它都按序错位,调试时设置断点于 VoutArray[DatSamCnt]处,再在 ADC_CSR&=(~0x80); //** 软件清零 转换结束 标志位 **设断点看ADC_DRH和ADC_DRL的值,结果是等于(AD4051_AD0)通道的实际值; 而这个程序以前用于51和LPC2132上都是正确的。IAR FOR STM8 真的这么烂吗?感觉怪怪。 |