最近很多人在讨论CC2510挂DS18B20温度传感器这事,我也凑上两句吧。
记得我第一次用B20的时候也着实用了不少时间,大概有1周的时间,才把别人为S51写的程序在自己的电路跑出一个结果,当时觉得这个单总线真的不好用,不过跑能之后也兴奋了一把。现在在网上能找到很多18B20的写温程序,《路上》也有。可是这些程序除了是基C51这类单片机的之外,就只剩下AVR的和PIC的程序了。
做完那次课题设计就再没有碰过DS18B20,只是关于它的记忆有点深刻,记得在操作B20的时候,每读、写一位中间有个延时,不能长过某个时间,也不能短过某个时间,当时我在读B20的时候还来了个EA=0,把中断关完了。但倒底是不是一定要把中断关了才能读出温度,我也不知道。这就是我对B20的了解。
对于CC2510,我在无线龙上班,所以电脑桌上总会有几个放着,呵呵。2510其实也是51内核,不过指令周期比前面提到的51要短很多,我想这也是很多人在操作B20的时候不好写软件延时程序的最终原因吧。所以我在这里就想跟各位用2510的朋友说下2510的系统时钟设定。2510一共有4个时钟源,把括内部集成的高、低速RC振荡器,外部高、低频率晶振,它们的频率分别是13M,32K,26M,32.768K,4个时钟源分成高低两组,高速一组可以都打开或者打开一个时钟源,PM1及更低功能下两都关闭。而低速一组只能有一个时钟源可以打开,仅在电源模式PM3下两者都关闭。在接有外部晶振时,2510会对RC振荡器进行校准。为了延时可靠,在使用B20的时候选用高速晶振吧。《CC1110/CC2510无线单片机和无线自组织网络入门与实战》这本书上有讲2510/1110的时钟,可以参考。
现在在来说2510系统时钟的分步,2510的系统时钟可以用CLKCON.SPKCLK(D2-D0位)来分频,一共8种分频倍数。分频结果为:
000 26M(高速RC只能在13M)
001 13M
010 6.5M
011 3.25M
100 1.625M
101 812.5K
110 406.25K
111 203.125K
在这里我们选010 -6.5M这个组合。也就每执行13条指命耗时2us。如果我们要延时50us的话,就需要325个指令周期。
再说说延时吧,一般在C里面我们都是用for(;;)或者while(i--)这样的语句来延时,这里应该也可以用,试着多改几下入参,应该是可以用的。以前看过些精确延时的帖子,现在都不记得的方法了。汇编我又不懂,不过刚好前几天在21IC上看到一个很有意思的宏,搬来这里给大家看看,也许用得上,我写的延时代码用的也是这个。
#define __NOP1__ asm("nop");
#define __NOP2__ __NOP1__ __NOP1__
#define __NOP4__ __NOP2__ __NOP2__
#define __NOP8__ __NOP4__ __NOP4__
#define __NOP16__ __NOP8__ __NOP8__
#define __NOP32__ __NOP16__ __NOP16__
#define __NOP64__ __NOP32__ __NOP32__
#define __NOP128__ __NOP64__ __NOP64__
#define __NOPX__(a) \
if ((a)&(0x01)) {__NOP1__} \
if ((a)&(0x02)) {__NOP2__} \
if ((a)&(0x04)) {__NOP4__} \
if ((a)&(0x08)) {__NOP8__} \
if ((a)&(0x10)) {__NOP16__} \
if ((a)&(0x20)) {__NOP32__} \
if ((a)&(0x40)) {__NOP64__} \
if ((a)&(0x80)) {__NOP128__}
好了,就说这些吧,把代码帖上,希望大家能尽快的用2510将B20的数据准确地读出来。
!!!~~~~关注2510和B20的调试结果。~~~~~~!!!!!!
wangxinfeng6666_749290079 2012-7-2 21:54
zigbee_904218839 2010-8-9 08:35
用户867511 2010-6-12 15:52
zigbee_904218839 2009-8-30 20:55
用户20718 2009-8-14 20:19
zigbee_904218839 2009-1-9 18:22
zigbee_904218839 2009-1-9 18:19
用户127006 2008-12-29 12:28
用户25691 2008-12-29 12:28
用户142654 2008-11-20 20:31