找回密码
 注册
搜索
查看: 983|回复: 6

[讨论] 大家帮忙看看s3c44b0x的AD启动程序

[复制链接]
发表于 2006-5-12 09:58:00 | 显示全部楼层 |阅读模式
大家帮忙看看s3c44b0x的AD启动程序:
rADCCON=0x1|(0x0<<2);       //开始A/D转换
问题:这里直接用rADCCON=0x1不就可以了吗?
while(rADCCON&0x1);      //为避免第一个标志位有错
问题:这条指令又是什么意思?
发表于 2006-5-12 15:23:00 | 显示全部楼层
<P>由于AD转换需要时间(尤其是便宜的逐次比较型AD),此句就是,检测忙信号,</P><P>等到AD转换完成,</P>[br]<p align=right><font color=red>+1 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-9-7 18:14:00 | 显示全部楼层
你可以查下RADCCON设置为0X01的具体作用.
[em01]
点评回复

使用道具 举报

发表于 2006-9-8 11:45:00 | 显示全部楼层
哪里啊,那个语句是判断rADCCON的第一位的值,做标志位的
点评回复

使用道具 举报

发表于 2006-9-9 17:05:00 | 显示全部楼层
我也刚做AD装换,不了解阿!!
点评回复

使用道具 举报

发表于 2006-9-11 11:50:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>freshman123</I>在2006-5-12 9:58:00的发言:</B>
大家帮忙看看s3c44b0x的AD启动程序:
rADCCON=0x1|(0x0&lt;&lt;2);       //开始A/D转换
问题:这里直接用rADCCON=0x1不就可以了吗?
while(rADCCON&amp;0x1);      //为避免第一个标志位有错
问题:这条指令又是什么意思? </DIV>


你看一下源码:
unsigned short Read_Adc(unsigned char ch)
{
int i;
    static int prevCh=-1;
    if(prevCh!=ch)
    {
  rADCCON = 0x1|(ch<<2);  //设置AD转换通道
     for(i=0;i<150;i++);  //最小15uS
}

    rADCCON=0x1|(ch<<2); //开始AD转换
while(rADCCON & 0x1); //避免标志FLAG错误
    while(!(rADCCON & 0x40));  //等待AD转换结束
for(i = 0; i < rADCPSR; i++);  //避免第二次标志FLAG错误
    prevCh=ch;
return rADCDAT;  //返回AD转换值
}
它这里是    rADCCON=0x1|(ch<<2); //开始AD转换
如果你直接用rADCCON=0x1,那就是把AD输入通道指定为0通道。那如果用别的通道的话这段程序就不能用。所以它这儿用的语句是rADCCON=0x1|(ch<<2);
第二个问题我也不明白,看那个SPEC上说:
The ADC converter state flag(ADCCON[6], FLAG bit) is not correct. The FLAG operates incorrectly in the following
cases:
a) The FLAG will be 1 for one ADC clock time just after the ADC conversion is started. This is not correct.
b) The FLAG will be 1 one ADC clock time ago than the ADC conversion is completed. This is not correct.
This problem will be shown conspicuously only if the ADCPSR is large. To read ADC converted data correctly ,
please refer to the following codes;
rADCCON=0x1|(0x0<<2); //Start A/D conversion
while(rADCCON &0x1); //To avoid The first FLAG error case.
//(The START bit is cleared in one ADC clock.)
while(!(rADCCON & 0x40));
for(i=0;i<rADCPSR;i++); //To avoid The second FLAG error case
Uart_Printf("A0=%03xh ",rADCDAT);
照上面的意思,在执行完rADCCON=0x1|(0x0<<2); 后ADCCON的FLAG位被置1了,但这不应该的,我觉得在这条语句之后加上rADCCON&=0x1才对,那样才能改rADCCON里的值,如果是while(rADCCON &0x1);rADCCON的值永远也改不了。请老手指点。
我最近也在学习S3C44BOX,想共同探讨的朋友加我。QQ:58576410,MSN: wangx_nj@hotmail.com
点评回复

使用道具 举报

发表于 2006-9-11 12:26:00 | 显示全部楼层
刚明白了,是自己英文水平不过关,没理解SPCE的意思。
a) The FLAG will be 1 for one ADC clock time just after the ADC conversion is started. This is not correct.
在ADC开始执行时有1个ADC周期内FLAG被置1,所以加入while(rADCCON &0x1); 等待一个ADC周期后,FLAG回到零,此时可以判断AD转换是否结束!
在这里我要感谢一下同事刘工。一起研究学习中碰到的问题。受益菲浅。祝他能涨工资。呵呵!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-7-5 19:58 , Processed in 0.046887 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表