完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前几天在做一个基于ZigBee的医疗无线监护系统,采用ticc2430的芯片和DS18b20温度传感器,Z-stack协议栈。在用测温节点采集DS18b20的数据时,遇到如下问题,程序总是停在DS18b20的驱动程序里的这一句:
while(IN_DQ) {;}//等待回复 #define IN_DQ P0_0 说明传感器的DQ引脚总是输出高电平,所以无法完成传感器的初始化,导致后面的测温、无线发送程序无法运行。传感器应该是好的,驱动也是网上流传甚广,经过认证的。而且我以前成功过。试了很多方法都没能解决。 这个问题也直接导致了第二个问题,即数据收集显示节点因为无法接收到采集节点的数据信息而无法进入数据处理程序,即Z-stack总在osal_start_system()这个操作系统函数里循环,即下面的函数段 do { if (tasksEvents[idx]) // Task is highest priority that is ready. { break; } } while (++idx < tasksCnt); 其中tasksEvents[idx]总为0,说明没有事件触发消息传递到tasksEvents[idx]中来,程序检测不到事件的发生,无法运行任务处理函数。 经过艰苦调试,终于找到了解决的方法,或者说是碰到了,呵呵{:soso_e112:} 。过程如下: ①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);一句被注释掉了,导致该错误。去掉注释后就一切正常了。 ②协议栈无法运行 呵呵,其实第一个问题解决了,这个问题也就迎刃而解了,因为测温节点成功读取数据后就可以发送无线数据给显示节点,显示节点就获得了进入任务处理的激发信号,因此程序也就顺利运行,成功地在液晶屏上显示出温度数值了,呵呵。 以上就是本人针对这两个问题的一点经验,拿来与大家分享,献丑了,呵呵 |
|
相关推荐
|
|
您好,您能不能把您的关于TIcc2430的芯片和DS18b20温度传感器的程序资料给我发一份啊,谢谢啦。邮箱:pj8586@163.com
|
|
|
|
|
|
您好,您能不能把您的关于TIcc2430的芯片和DS18b20温度传感器的程序资料给我发一份啊,谢谢啦。1291260404@qq.com
|
|
|
|
|
|
您好,您能不能把您的关于TIcc2430的芯片和DS18b20温度传感器的程序资料给我发一份啊,谢谢啦。
373300122@126.com |
|
|
|
|
|
您好,您能不能把您的关于TIcc2430的芯片和DS18b20温度传感器的程序资料给我发一份啊,谢谢啦。874976809@qq.com
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
物联网工程师必备:怎么选择不同的无线连接技术,本指南帮你忙!
3245 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3892 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3403 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
3951 浏览 1 评论
20563 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
708浏览 2评论
884浏览 2评论
933浏览 1评论
1050浏览 1评论
346浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 19:33 , Processed in 0.708426 second(s), Total 53, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号