MC9s12G系列 AD转换时不能被中断?
如题,程序如下:在执行AD转换前如果不关中断,执行 ATDCTL5 = CH; //转换AD08,后正好中断来,会打断转换的序列, 这时程序就死在下一句while 里了。
加上disable后 就行。请问AD转换的时候必须关中断吗?
u16 System_ADcapture(u8 CH)
{
unsigned int AD_data;
DisableInterrupts; //关中断
ATDCTL5 = CH; //转换AD08
while(!ATDSTAT0_SCF);
EnableInterrupts; //开中断
AD_data = ATDDR0;
return(AD_data);
} 看看中断里面是不是有清AD标志位的操作 w282529350 发表于 2018-5-22 14:19
看看中断里面是不是有清AD标志位的操作
还有个情况如下:很奇怪
u16 System_ADcapture(u8 CH)
{
unsigned int AD_data;
ATDCTL5 = CH; //转换AD08
//此处加入很短的延时, while 里就出不来。 就是说 启动转换 和 等待标志位 必须是连续执行,中间暂停 一段时间就 出不来......
while(!ATDSTAT0_SCF);
AD_data = ATDDR0;
return(AD_data);
} 2011年玩飞思卡尔时候用过这个芯片兄弟版本。。 现在忘光了。。感觉跟AVR的指令有点像。。 12tangyang12 发表于 2018-5-22 14:33
还有个情况如下:很奇怪
u16 System_ADcapture(u8 CH)
中断里面有没有读ad的操作 w282529350 发表于 2018-5-22 14:45
中断里面有没有读ad的操作
没有,在启动转换后,加入一段时间的延时,必定会死在while()里,
转换完成标志 需要如下 三种情况之一 清除
A) Write “1” to SCF
B) Write to ATDCTL5 (a new conversion sequence is started)
C) If AFFC=1 and a result register is read
u16 System_ADcapture(u8 CH)
{
unsigned int AD_data;
DisableInterrupts; //这里先关闭中断,排除别的中断里有清标志可能
ATDCTL5 = CH; //转换AD08
Delay(100); // 这里只要加入延时, 让启动转换 和 while 里 分开执行, 就必定死在while里,
while(!ATDSTAT0_SCF);
EnableInterrupts;
AD_data = ATDDR0;
return(AD_data);
} 12tangyang12 发表于 2018-5-22 14:57
没有,在启动转换后,加入一段时间的延时,必定会死在while()里,
转换完成标志 需要如下 三种情况之 ...
用过这个芯片的ad,没有遇到你说过的这种情况。每路ad转换的结果放在不同的寄存器内,而看你的程序,要转换的ad通道是变数,但读取的一直是通道0? w282529350 发表于 2018-5-22 15:10
用过这个芯片的ad,没有遇到你说过的这种情况。每路ad转换的结果放在不同的寄存器内,而看你的程序, ...
手册里写了,ATDDR0 是 ad转换的序号 不是通道号。也就是说,在多通道连续采集时,ATDDR0 是 第一个采集的通道。
12tangyang12 发表于 2018-5-22 15:28
手册里写了,ATDDR0 是 ad转换的序号 不是通道号。也就是说,在多通道连续采集时,ATDDR0 是 第一个采集 ...
可能我跟你的ad配置不一样,你还是在网上找一下能用的测试程序试验下吧 刚开始使用这个芯片。以往使用的经验,应该有个中断优先级的吧 兄弟,请教几个问题。我是刚接触这个芯片。请问开发环境(IDE)用的是什么?开发方式是怎样的,库开发还是寄存器开发?库开发的话,有没有专门的配置工具?
页:
[1]