返回该小组首页 回复主题
jizzll

jizzll

小组等级:     E币:2143  (E币换礼)

#1楼主:求助,2510程序中找到问题的地方,但是程序应该没有错误

文章发表于:2008-07-15 12:56

这个是DS18B20的函数,我在51上面编过,现在把它移植到CC2510上面,我从示波器上面看过,延时应该是正确的。就是那个移位有问题。

编译环境是IAR7.20H,成都无线龙提供的

不知道问题出在哪里。经过示波器观测,延时波形都正常,为了找到问题
我在其中加了个data[i]=dat;dati[i]=DQ;datk[i]=dat;
发现以为有问题,得到的移位数据分别是
data[i]=0x80 0x40 0x60 0x70 0xf8 0xfc 0xfe  0xff
datk[i]=0X00 0X40 0X20 0X30 0X78 0X7C 0X7E  0X7F 
dati[i]=1    0      0    0     0    0    0    0

上面的数据是温度里面的高8位,从dati[i]可以看出来数据是正常的,而且我给传感器加温度数据会上升。

问题就存在把1位1位的数据存到dat里面。下面是子函数
/*从ds18b20读一个字节 dat为返回值*/
unsigned char DS_ReadByte(void)
{
  unsigned char presence;
  unsigned char i=0;
  unsigned char dat=0;

        for (i=0;i<8;i++)
         {
                  dat>>=1;              //右移位等待接收一位数据
                  Delay_short(2);   //延时3us
                  P0DIR=0x02;//输出方式
               DQ = 0;               //给脉冲信号
                  Delay_short(3);   //延时3us
                  P0DIR=0x00;//输入方式

                  Delay_short(10);   //延时11us
                   presence=DQ;
                  dati[i]=DQ;
                  datk[i]=dat;
               if(presence)                //从低位开始接收数据

                 {    
                   dat|=0x80;
                  }
              else if(presence==0)
                {
                  dat=dat&0x7F;
                }

                   data[i]=dat;
                   Delay_short(20);   //延时21us
                 Delay_short(20);       //等待复位延时21us
                    P0DIR=0x00;
                   Delay_short(25);   //延时26us

          }
   return(dat);
}

示波器上面的波形,展开是为了看清楚


 (原文件名:TEK0000.JPG) 

工程文件,如果哪个大哥方便的话,可以测试哈
点击此处下载 ourdev_348267.rar(文件大小:22K) (原文件名:CC2510温11.rar) 

orchid123

   小组等级:    E币:1120  (E币换礼)

#2

文章发表于:2008-07-15 18:41

不会,关注

emot

   小组等级:    E币:1152  (E币换礼)

#3

文章发表于:2008-07-15 19:20

想知道你的计算方法,能说下吗?

再有就是把代码打包放上来。

jizzll

   小组等级:    E币:2143  (E币换礼)

#4

文章发表于:2008-07-15 22:17

楼主帖子里面有代码下载的呀,就是图片下面有个工程文件。

 

你是说延时么,我是在泰克数字示波器上面上面调试的。

 

希望EMOT能帮帮忙。我困惑惨了,问了许多人,都说应该没有问题,可是我得到的数据就是没有把温度传感器的数据传进来。我尝试过,直接调试这个函数,一切正常,比如我直接赋值presence=0X35(presence本来应该是端口的电压),运行后dat=0X35。但是我直接运行整个工程的话,它始终会执行

 if(presence)                //从低位开始接收数据

                 {    
                   dat|=0x80;
                  }
而不会执行

 else if(presence==0)
                {
                  dat=dat&0x7F;
                }
这些问题是今天在函数里面增加几个数组发现的,因为程序中有 dati[i]=DQ这句,所以可以肯定presence不可能全是1

 

不知道我上面解释清楚没有

jizzll

   小组等级:    E币:2143  (E币换礼)

#5

文章发表于:2008-07-17 16:25

emot还没有来呀

emot

   小组等级:    E币:1152  (E币换礼)

#6

文章发表于:2008-07-18 09:17

短信里有给你回了。这里不重复了。

jizzll

   小组等级:    E币:2143  (E币换礼)

#7

文章发表于:2008-07-21 21:40

EMOT,你调试过2510+1820没有呀,哎,困难呀

emot

   小组等级:    E币:1152  (E币换礼)

#8

文章发表于:2008-07-23 09:21

也只是做过51接B20。要不就换个温度传感器吧,SPI总线的那种会比较好用点。

jizzll

   小组等级:    E币:2143  (E币换礼)

#9

文章发表于:2008-07-24 00:10

看来只有这样了

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章