打印
[AVR单片机]

AD转换疑问

[复制链接]
1756|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shiyan1532|  楼主 | 2014-7-4 09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void AD_count(void)
{
        value=0;
        value=ADCL;                         //Read 8 low bits first (important)
        value=value|((unsigned int)ADCH << 8); //read 2 high bits and shift into top byte
        AD_value=value;//采集到的AD值
}

其中value是unsigned int 形的全局变量,但我不明白为啥要对高位寄存器ADCH进行强制类型转换?value=value|((unsigned int)ADCH << 8);

相关帖子

沙发
wangch_sh| | 2014-7-4 09:45 | 只看该作者
ADCH是8位的吧?

使用特权

评论回复
板凳
shiyan1532|  楼主 | 2014-7-4 18:08 | 只看该作者
wangch_sh 发表于 2014-7-4 09:45
ADCH是8位的吧?

是八位的。

ADCH是AD结果存放的高八位。是一个寄存器名字。


如果I是无符号字符型的常亮,

unsigned char i=5;
(unsigned int)i,是对这个变量强制转换,转换以后I是unsigned int 型?

ADCH是个寄存器,对寄存器强制类型转换?不太理解。

使用特权

评论回复
地板
wangch_sh| | 2014-7-4 18:29 | 只看该作者
如果不理解,可以那样:
把ADCH里的值读到一个8位变量里边在强制类型转换就好理解了。
其实只要结果对就可以了。
强制转换以后,就变成unsigned int了。

使用特权

评论回复
5
huangxz| | 2014-7-5 10:19 | 只看该作者
看看汇编 代码就知道了

使用特权

评论回复
6
shiyan1532|  楼主 | 2014-7-5 10:59 | 只看该作者
huangxz 发表于 2014-7-5 10:19
看看汇编 代码就知道了

讲讲。我就是不理解对 ADCH强制转换的 过程 是什么样的?

使用特权

评论回复
7
roykin| | 2014-7-5 11:08 | 只看该作者
其实是将寄存器的结果强行类型转换而不对寄存器的内容本身构成影响。

使用特权

评论回复
8
shiyan1532|  楼主 | 2014-7-6 12:11 | 只看该作者
roykin 发表于 2014-7-5 11:08
其实是将寄存器的结果强行类型转换而不对寄存器的内容本身构成影响。

value=value|((unsigned int)ADCH << 8);

(unsigned int)ADCH 对内容转换以后,ADCH就存不下了,那这个数存在一个临时的16位空间么?

使用特权

评论回复
9
roykin| | 2014-7-6 19:16 | 只看该作者
本帖最后由 roykin 于 2014-7-6 19:23 编辑
shiyan1532 发表于 2014-7-6 12:11
value=value|((unsigned int)ADCH

= =你的MCU是8位么。。要是8位的话 那就不科学了。
如果16位 那么int的占用大小就是16位。

相关老帖子看看 很有意思。。https://bbs.21ic.com/icview-51262-1-1.html

使用特权

评论回复
10
yubsh| | 2014-7-7 09:41 | 只看该作者
ADCH是8位寄存器,直接左移8位,ADCH就空了,因为它本身没有高8位可以存放临时变量。强制转换之后,会用一个16位的无符号整数存放这个16位的数据。
这种写法跟编译器耦合比较大,建议定一个16位的变量,存放左移后的中间值。
最近用keil C写代码,两次遇到类似的问题,造成数据混乱,深受其害。

使用特权

评论回复
11
ayb_ice| | 2014-7-9 14:35 | 只看该作者
不转换移位就溢出了

使用特权

评论回复
12
yuxin11434| | 2014-7-11 12:18 | 只看该作者
ATtiny13A/D怎么检测电压值

使用特权

评论回复
13
shiyan1532|  楼主 | 2014-7-13 09:51 | 只看该作者
yuxin11434 发表于 2014-7-11 12:18
ATtiny13A/D怎么检测电压值

应该都差不多吧 。要么查询方式 要么中断方式。

使用特权

评论回复
14
zhujunjiejuan| | 2014-7-16 15:02 | 只看该作者
我理解的方式是ADCH是一个8位的寄存器,加强制类型转换只是将ADCH的值存放入一个temp缓冲区,此缓冲区是由强制类型转换而生成的,接下来就是实际对此缓冲区进行左移8位再和value运算。和ADCH已经没有任何关系。不知道我这么理解对不对。。。

使用特权

评论回复
15
liqinghai1990| | 2014-7-19 10:26 | 只看该作者
单片机是8位的,ad是10位的。所以需要两个寄存器来存ad数据。怎么存可以设置。靠左,靠右可以设置。uint是16位,可以放你的ad数据。但你要把ad寄存器的数据调整好。

使用特权

评论回复
16
wxhland| | 2014-8-24 21:37 | 只看该作者
[em:29:][em:29:]

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:当我发到20000贴的时候,我可能会比现在牛,也可能比现在B,谁知道呢。

48

主题

1158

帖子

0

粉丝