void ADCInit(void)
{
// ATD0CTL2=0xC0; //EAD模块上电, 快速清零, 无等待模式, 禁止外部触发
ATD0CTL3=0X38; // 每个序列7次转换, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x81; // 8位精度, 2个时钟,2uS ATDClock=[BusClock*0.5]/[PRS+1]RS=1, divider=4
ATD0CTL5=0xb0; //右对齐无符号,多通道采样,通道0开始至6
ATD0DIEN=0x00; // 禁止数字输入
//start new conversation
ATD0CTL2_ASCIE=1; //interrupt enable
ATD0CTL5_SCAN=1;
ATD0CTL2=0xC0;
}
void main(void) {
unsigned int b=0,c=0,d=100;
/* put your own code here */
PLL_INIT();
SciInit();
ADCInit();
DDRB=0XFF;
PORTB=0X00;
EnableInterrupts;
for(ad_count=0;ad_count<=5;ad_count++) { //第一次输出
printp("AD_Data[%d]=%d \n",ad_count,AD_Data[ad_count]);
}
for(b=500;b>1;b--) { //第一次等待时间
PORTB=~PORTB;
for(c=60000;c>1;c--)
PORTB=~PORTB;
}
printp("+++++++++++++++++++++++++++++++++\n");
ATD0CTL2_ASCIE=0;
for(ad_count=0;ad_count<=5;ad_count++) { // 第二次等待时间 第二次输出
printp("AD_Data[%d]=%d \n",ad_count,AD_Data[ad_count]);
}
ATD0CTL2_ASCIE=1;
for(;;) {
for(b=5000;b>1;b--)
for(c=2000;c>1;c--)
asm("nop");
ATD0CTL2_ASCIE=0;
for(ad_count=0;ad_count<=5;ad_count++) {
printp("AD_Data[%d]=%d \n",ad_count,AD_Data[ad_count]); //第三次输出
}
ATD0CTL2_ASCIE=1;
} /* wait forever */
/* please make sure that you never leave this function */
}
void interrupt Int_AD0() {
ATD0CTL2_ASCIE=0; //interrupt disable;
AD_Data[0]=ATD0DR0L;
AD_Data[1]=ATD0DR2L;
AD_Data[2]=ATD0DR3L;
AD_Data[3]=ATD0DR4L;
AD_Data[4]=ATD0DR5L;
AD_Data[5]=ATD0DR6L;
ATD0CTL2_ASCIE=1;
}
问题出现在第一次输出结果为0;说明AD没有工作,但我已经开中断了,也允许AD转换进行,但是第二次还是没有结果我就想不通了,为什么在延时了很长时间,AD还是没有结果,但是在第三次输出就有正常的结果了,请斑主帮忙.
不好意思,发现问题了,
ATD0CTL2_ASCIE=1; //interrupt enable
ATD0CTL5_SCAN=1;
ATD0CTL2=0xC0;
位置放错了,一直没注意.找到原因了.
不行,还是不对.帮我看看吧.
首先确定一下你的中断性质,是你用到的所有通道转换完成后进入中断,还是只有AD0转换完成后进入中断,可以再读每一通道AD前加一句判断此通道AD是否完成的语句,查询标志位就行,
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |