如题,
其他品牌的在IDE在线调试的时候,可以事实看到变量值,为什么这个FMD IDE看不到呢?
一致都不刷新的,打断点的话可以有时候可以看到,有时候又看不到,哪里出了问题?
如下初始化:
void ADC_INITIAL(void)
{
ANSEL0 = 0B00000001; //模拟口设置,AN0为模拟管脚
ADCON1 = 0B11100101; //右对齐,转换时钟SysClk/64,负参考电压GND?////正参考电压VDD
//ADCON1 = 0B11100100; //右对齐,转换时钟SysClk/64,负参考电压GND,正参考电压内部电压(2V)
//Bit7:ADFM A/D转换结果格式
//1 = 右对齐。
//0 = 左对齐。
//Bit6~Bit4:ADCS ADC转换时钟源
//TSEL=2T
//000 = SysClk/2
//001 = SysClk/8
//010 = SysClk/32
//011 = SysClk
//100 = SysClk/4
//101 = SysClk/16
//110 = SysClk/64
//111 = LIRC
//Bit3~Bit2:ADNREF ADC负参考电压
//00 = Int Vref(内部参考电压)
//01 = GND
//10 = Int Vref + Ext Cap(内部参考电压 + 外部电容)
//11 = Ext Vref(外部参考电压)
//Bit1~Bit0:ADPREF ADC正参考电压
//00 = Int Vref(内部参考电压)
//01 = VDD
//10 = Int Vref + Ext Cap(内部参考电压 + 外部电容)
//11 = Ext Vref(外部参考电压)
ADCON0 = 0B00000000; //选择AD转换通道0,软件触发ADC
//Bit6~Bit3:CHS ADC模拟通道选择位
//0000 = AN0
//0001 = AN1
//0010 = AN2
//0011 = AN3
//0100 = AN4
//0101 = AN5
//0110 = AN6
//0111 = AN7
//1xxx = Int Vref(内部参考电压)
//Bit2:ADEX ADC触发条件
//0 = 由置位指令GO/DONE(软件触发)
//1 = 由PA4或PWM置位G0/DONE(硬件触发)
//Bit1:G0/DONE ADC转换启动和状态位
//0 = A/D转换完成/未进行转换
//1 = A/D转换正在进行或硬件触发延时正在计数
//Bit0:ADON 使能ADC
//0 = ADC被禁止且不消耗工作电流
//1 = ADC被使能
ADCON2 = 0B01000000; //选择内部正参考电压2V,无外部触发源
//Bit7~Bit6:ADINTREF ADC内部参考电压
//00 = 0.5V
//01 = 2.0V
//10 = 3.0V
//11 = 未连接
//Bit5~Bit4:ETGTYP 外部触发沿(当ADEX=1时适用)
//00 = PWM 或 ADC_ETR脚的下降沿
//01 = PWM 或 ADC_ETR脚的上升沿
//Bit3:ADDLY.8/LEBPR9 ADC外部触发延时计数器或LEB计数器的第8位
//Bit2~Bit0:ETGSEL 外部触发源(当ADEX=1时适用)
//选择PWM源时需要配置TIMER为PWM输出模式并使能输出。
//000 = P1A0
//001 = P1A0N
//010 = P1B
//011 = P1C
//100 = P1D
//101 = ADC_ETR
//11x = 无
ADCON3 = 0B00000000;
//Bit7:ADFBEN ADC比较结果响应故障刹车使能
//0 = 禁止
//1 = 使能
//Bit6:ADCMPOP ADC比较器输出极性
//0 = ADC结果的高八位大于或等于ADCMPH[7:0]
//1 = ADC结果的高八位小于ADCMPH[7:0]
//Bit5:ADCMPEN ADC结果比较使能位
//0 = 关闭
//1 = 使能
//Bit3:LEBADT 前沿消隐周期结束后,ADC触发使能
//1 = 触发ADC转换
//0 = 不触发ADC转换
ADCMPH = 0B00000000; //ADC比较阈值,仅8位,用于ADC结果高8位比较。
ADON=1; //使能ADC
DelayUs(200); //打开ADC模块后,需等待ADC稳定时间Tst(~15us);当选择内部参考电压时需等待内部参考电压的稳定时间Tvrint(~450us)
DelayUs(200);
DelayUs(50);
}
/*-------------------------------------------------
* 函数名: GET_ADC_DATA
* 功能: 读取通道ADC值
* 输入: adcChannel 通道序号
* 输出: INT类型AD值(单次采样无滤波)
--------------------------------------------------*/
unsigned int GET_ADC_DATA (unchar adcChannel)
{
ADCON0 &= 0B00000111;
ADCON0 |= adcChannel<<3; //重新加载通道值
DelayUs(2); //TACQ延时2us,外部串联电阻小于21kΩ
//TACQ延时4us,外部串联电阻43kΩ
//TACQ时间:必做,通道切换到GO/DONE置1的时间,保证内部 ADC 输入电容充满。
//TACQ > 0.09*(R+1)us;R为外部串联电阻(kΩ),串联电阻越小越好,最大不要超过50kΩ
ADCON0 = ADCON0|0x02; //启动ADC
//采样保持时间0~1TAD
NOP();
NOP();
while(ADCON0&0x02); //等待ADC转换完成
//从GO_DONE = 1 ---> 从GO_DONE = 0,转换过程需要15TAD ~16TAD
//TAD(us)与转换时钟Fosc/ADCS[2:0]有关
return(unsigned int)(ADRESH<<8|ADRESL); //整合12位AD值
}
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //IRCF=111=16MHz/2T=8MHz,0.125us
OPTION = 0B00001000; //Bit3=1 WDT,Bit[2:0]=000=WDT RATE 1:1
INTCON = 0; //暂禁止所有中断
//PORTA = 0B00000000;
PORTA = 0B11111100;
TRISA = 0B00000011; //PA0--AN0 ---PA1--AN1
//PA输入输出 0-输出 1-输入
//PA4-OUT
//PORTC = 0B00000000;
PORTC = 0B11111111;
TRISC = 0B00000000; //PC输入输出 0-输出 1-输入
PORTB = 0B11011111;
TRISB = 0B10000000; //PC输入输出 0-输出 1-输入
WPUB = 0B10000000;
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
}
unsigned int GetAD(void)
{
unsigned int DataBat=0;
unsigned int DataBat0=0;
unsigned char i=0;
for(i=0;i<10;i++)
{
DataBat = GET_ADC_DATA(0);
NOP();NOP();NOP();NOP();
DataBat0+=DataBat;
}
DataBat0=(DataBat0/10);
return DataBat0;
}
void Task(void)
{
// Val=GetAD();
}
} |