查看: 7468|回复: 7

问题解决,分享经验

[复制链接]
wwh199169 发表于 2011-10-21 22:26:15 | 显示全部楼层 |阅读模式
前几天在论坛里发了两篇求助帖,分别是关于DS18b20无法完成初始化协议栈无法运行的问题,原文链接如下:
DS18b20问题  http://www.feibit.com/bbs/viewthread.php?tid=3345
协议栈运行问题 http://www.feibit.com/bbs/viewthread.php?tid=3346

这两个问题前两天已经解决了,但因为忙于准备项目中期答辩的事,没来得及和大家分享解决过程。现在补上来:
①DS18b20无法完成初始化:
   这个问题出自驱动程序中初始化函数
void init_1820(void)
{
   //cli();
  //P0SEL&=0xfe;//将P0.0口设置为普通IO口
  SET_OUT;
  SET_DQ;//输出1
  CL_DQ;
  Delay_nus(700);//拉低一段时间
  SET_DQ;//释放
  SET_IN;//输入
  Delay_nus(40); //释放总线后等待15-60us
while(IN_DQ);//等待回复
  Delay_nus(240);//回复的低电平在60到240us  
  SET_OUT;
  SET_DQ;//回到初始DQ=1;
}
中的while(IN_DQ);,经检测,IN_DQ的输出总是1,即程序无法得到完成初始化所需的IN_DQ低电平信号,故而卡在这个无限满足的死循环里。
首先感谢kennan前辈的回答,原先我也以为是时序问题,但是了很多不同的延时时间,但都无效。又以为是DS18b20坏了,但换了几个都是这样,于是也排除这种可能。
      最后,我用IAR的断点设置功能,在while(IN_DQ);这句上设置断点,当程序运行这一句之前,我把DS18b20的DQ引脚从连接的P0.0口上拔下来,插到GND引脚上,也就是人为的制造一个低电平,嘻嘻。效果还不错,程序终于越过这一句,成功运行下去了!而且后面循环执行初始化函数时也没有再卡在这一句上。虽然不能解释为什么,但我灵机一动,把while(IN_DQ);这句之前的读写操作改成循环语句,即将原函数修改如下:
  void init_1820(void)
{
   //cli();
  //P0SEL&=0xfe;//将P0.0口设置为普通IO口
  do
  {  
  SET_OUT;
  SET_DQ;//输出1
  CL_DQ;
  Delay_nus(700);//拉低一段时间
  SET_DQ;//释放
  SET_IN;//输入
  Delay_nus(40); //释放总线后等待15-60us
  } while(IN_DQ);//等待回复
  Delay_nus(240);//回复的低电平在60到240us  
  SET_OUT;
  SET_DQ;//回到初始DQ=1;
}
此后,程序就再也没有卡过了。但是,到现在我也不知道自己为什么要这样改,只是一时的灵感而已···


不过,后来在运行时,又遇到一个问题,读出的第一个数据总是85℃,也就是DS18b20以12位精度初始化时输出的数据。经过仔细排查,发现是读数据函数中:
unsigned int read_data_value(void)
{
    unsigned int j;
    unsigned char temh,teml;
//    unsigned char a,b,c;
//    unsigned int data_value;


    init_1820();  //复位18b20  
    write_1820(0xcc);   // 发出转换命令 搜索器件
    write_1820(0x44);     //启动
    for(j=20;j>1;j--)  
    Delay_nus(500);
    init_1820();  
    write_1820(0xcc);
    //match_rom(serial);   //匹配
    write_1820(0xbe);


    teml=read_1820();  //读数据  
    temh=read_1820();  


      if(temh&0x80)//判断正负
    {
      flag=1;
    }
    else
    {
      flag=0;   //为正
    }


    sensor_data_value[0]=teml;
    sensor_data_value[1]=temh;


    data_value = temh;
    data_value = ( data_value << 8 )| teml;


    return data_value;


}

for(j=20;j>1;j--)  
    Delay_nus(500);一句被注释掉了,导致该错误。去掉注释后就一切正常了。


②协议栈无法运行
呵呵,其实第一个问题解决了,这个问题也就迎刃而解了,因为测温节点成功读取数据后就可以发送无线数据给显示节点,显示节点就获得了进入任务处理的激发信号,因此程序也就顺利运行,成功地在液晶屏上显示出温度数值了,呵呵。


以上就是本人针对这两个问题的一点经验,拿来与大家分享,献丑了,呵呵
outman 发表于 2011-10-21 23:44:44 | 显示全部楼层
赞一下楼主的研究精神,更得赞共享精神。如果是本科的毕业设计能做到这一步,更得赞一下了。

已经将楼主转为vip会员了,多谢您对飞比论坛的贡献。
 楼主| wwh199169 发表于 2011-10-22 00:36:32 | 显示全部楼层
回复 2# outman


    多谢outman前辈的厚爱!呵呵,这还不是毕业设计,那是下学期的任务。这是我做的一个学校SRTP实验项目,基于ZigBee的医疗无线监护系统。呵呵,也是边做边学,现炒现卖,今后肯定还会遇到更多更棘手的问题,恐怕不会每次都能幸运地发现问题所在并成功解决,届时还望论坛里诸如outman您这样的前辈不吝赐教啊!
安龙飞 发表于 2011-11-8 17:09:11 | 显示全部楼层
一直在关注啊   楼主加油哈  向你学习
安龙飞 发表于 2011-11-8 19:40:16 | 显示全部楼层
一直在关注啊   楼主加油哈  向你学习
lizheng86312 发表于 2012-8-29 13:24:22 | 显示全部楼层
学到东西了。顶。。。
1992410lpq 发表于 2013-1-18 21:43:05 | 显示全部楼层
为什么我在点击debug后出现下面图片。。。求指教

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
pierce033 发表于 2013-4-20 11:14:07 | 显示全部楼层
1992410lpq 发表于 2013-1-18 21:43
为什么我在点击debug后出现下面图片。。。求指教

你的器件(CC24/530)没有识别,按下下载器的RESET就行了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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