1<

napelun 2006-09-20 04:07:37
我在配置ATmage48单片机的ADC时候。

配置ADMUX 时候 以变量iADMUX直接将值传递到ADMUX,而将ADC通道的参数通过 iMUX 传递到ADMUX。

iADMUX=REFS0 | iMUX 的区别
ADMUX=iADMUX
我用该数值来反映iMUX通道的电压,此时读取的数值很不稳定浮动在三十左右。

当我将上面的赋予值更改为
iADMUX=(1<<REFS0) | iMUX
ADMUX= iADMUX
该数值很稳定上下浮动在1之内。

问题就是出在了ADMUX=(1<<REFS0) | iMUX 与 ADMUX=REFS0 | iMUX 的区别上,请各个高手指教,1<<REFS0的意义是什么,它与REFS0有什么区别。

...全文
323 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ningxin 2006-09-22
  • 打赏
  • 举报
回复
再多一句:
有的程序里,也会直接把REFS0定义为0x40,这样
ADMUX=REFS0|iMUX就是对的。所以仔细看你自己程序的宏定义。
ningxin 2006-09-22
  • 打赏
  • 举报
回复
还在up啊?
详细点说,REFS0是一个宏定义或者const变量。
这是为了程序容易阅读,并且配合硬件datasheet里的描述才定义的这个宏。
比方说,当你阅读你MCU的datasheet的时候,会看到在你的ADMUX寄存器里,有一位(比如第6位)的名称叫REFS0(也仅仅是助记符而已,让你知道这一位是表示参考电压设置的0位)。
这一位置1,将实现某种功能(比如是选择参考电压S0);置0则取消这种功能。那么你就可以
#define REFS0 6
然后在需要对该寄存器的第6位置位(也就是要实现更改参考电压的时候),使用
ADMUX=(1<<REFS0) | iMUX,就实现了置位的操作。
如果你用
ADMUX=REFS0|iMUX,那么就是用6去对ADMUX置位,那么是置位了bit1和bit2(6==二进制的110),并非我们需要的bit6,结果当然不对了。

总体来说,使用这个宏是为了程序的可读性和可维护性,如果你要直接用0x40来代替(1<<REFS0),程序运行结果也是一样的。但是,如果其它人来看,就不知道0x40是什么含意;同时,如果另一种芯片,REFS0是第16位,那你只需要修改REFS0为16,其他部分的程序不用修改。

PS: 这个问题见你发过一个帖子了,不知道现在能不能帮你搞清楚?
napelun 2006-09-21
  • 打赏
  • 举报
回复
up
napelun 2006-09-21
  • 打赏
  • 举报
回复
seedundersnow(正在为**苦苦张罗)

你好!

这么说,很多对ADMUX赋值的程序,就是因为容易理解才写为 ADMUX=(1<<REFS0) 对么?
seedundersnow 2006-09-21
  • 打赏
  • 举报
回复
一个寄存器有多个功能,如果控制某个功能的几个位不在从 bit0 开始的位置,
为该功能定义一个符号,再以左移配合,容易理解。
napelun 2006-09-21
  • 打赏
  • 举报
回复
up
flowercity 2006-09-21
  • 打赏
  • 举报
回复

移位操作啊
单片机编程常用的
xiaobaozi520 2006-09-20
  • 打赏
  • 举报
回复
1<<3同等于1*2*2*2
icesnows 2006-09-20
  • 打赏
  • 举报
回复
楼上正解
ningxin 2006-09-20
  • 打赏
  • 举报
回复
1<<REFS0
就是1左移REFS0这么多位。
比如REFS0为5,那么1<<REFS0就是二进制的100000。你说结果与REFS0有什么区别?:)
napelun 2006-09-20
  • 打赏
  • 举报
回复
呜呜 怎么没有人理会我,自己再顶一下

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧