工理南华 发表于 2013-3-24 21:16:21

求各位好心人高手赐教 DS18B20

本帖最后由 工理南华 于 2013-3-24 21:56 编辑

温度传感器DS18B20读取温度第17次出错。问题有点棘手,调试了好久没跳出来,现在着急,请好人高手赐教。
单片机ATMega128 、温度传感器DS18B20 、单片机与18BS20数据连接端口为PE3
问题:DS18B20读温度错误,执行主函数中的while(1)死循环会被终止跳出,重新开始执行(没有开看门狗),像是被复位。我已经用AVR Studio JTAG仿真过,程序执行tp=get_temp();读温度时候,前16次读取都没有问题,到了第17次(ynimeia计数到17)时读取的温度就出错,ynimeia从新归0。然后我在程序执行第17次的时候进入get_temp()函数中,是在第一次执行write_ds18b20(SkipROM);时出错的,然后进入write_ds18b20()函数中看到是在delay_us(80);这句出错的,本来以为是时序问题,但是把80改成60,40,50,64后均出错。
望有高手好人们帮忙!!!不胜感激!!!
代码用附件上传,谢谢。

箫天 发表于 2013-3-24 21:58:52

虽然上传了出错源程序,别人也很难帮助排错,一是看懂代码需要时间,二是没有配套的测试硬件。
读取DS18B20本不难,看你搞的好象挺复杂。
建议:
1、再仔细看下DS18B20的DATASHEET,有许多需要注意的地方。
2、发送温度转换指令后,是否进行了延时,DS18B20转换需要时间。
3、索性每次转换前都执行一下初始化。
4、是否有变量定义问题,溢出了或者非法操作,编译时看不出错误。
想到这几点,供参考。

枯恋凡尘 发表于 2013-3-24 22:06:09

ICC,无法验证,帮不上,看下内存占用和堆栈吧。先把其他程序全部屏蔽掉。单纯操作DS18B20

工理南华 发表于 2013-3-24 22:25:38

箫天 发表于 2013-3-24 21:58 static/image/common/back.gif
虽然上传了出错源程序,别人也很难帮助排错,一是看懂代码需要时间,二是没有配套的测试硬件。
读取DS18B20 ...

管理员,你好,谢谢你的建议,你的建议还是对我有帮助的。我也知道看懂别人的代码很难,但是我新上传的代码我有规划过和注释了的,应该比较容易看一点。我就是想问问高手们有没有遇到这种情况,我的代码前16次温度读取都可以正确运行,但是第17次就出错,这是什么原因。1、发送温度转换指令后,我有进行了延时1000ms。2、我每次发送温度转换指令和发送读取温度指令之前都有用到初始化哦。3、为了区别变量重复问题,我把某些变量定义成了搞笑罕见的名字,应该不会出问题了吧?再次感谢建议!

箫天 发表于 2013-3-24 22:29:23

按 枯恋凡尘 说的试试吧。

御斩 发表于 2013-3-25 15:43:05

按照凡尘的先检查一下,把其他程序去掉,只是单独读18B20,在每个需要延时的地方以及对18B20操作的地方都多加些延时。另外建议查一下硬件,看看是否硬件上有问题。

铜河 发表于 2013-3-25 16:38:24

没遇到过你这种情况。

工理南华 发表于 2013-3-26 20:39:33

御斩 发表于 2013-3-25 15:43 static/image/common/back.gif
按照凡尘的先检查一下,把其他程序去掉,只是单独读18B20,在每个需要延时的地方以及对18B20操作的地方都多 ...

你好,谢谢你的回答,我觉得硬件是没问题的,因为我用的是开发板啊,而且用卖家自己写的程序可以运行,而我移植他的程序就出现这样的问题了,不知道为什么。我已经把其他程序去掉了,只留下18B20的程序了,调试也是不行,这才着急啊。

箫天 发表于 2013-3-26 21:05:58

还没解决?
移植程序,编译环境也变了?平常不用C,我是无能为力了。

quanpengfei 发表于 2013-5-30 15:20:51

18B20这东西,反正和时间量有关,不好整,原来我在51RC上面弄好了,移到stc12C系统的片子上不行了,时钟频率啥的很重要,我没有用定时器,所以,移植的氛围要小,建议用定时器延时
页: [1]
查看完整版本: 求各位好心人高手赐教 DS18B20