原创 AVR+DS18B20调试成功

2010-10-6 11:34 3459 3 3 分类: MCU/ 嵌入式

       昨天上午写日志时,还没开始调试DS18B20测温,写完后,发下狠心,好好的重新温习了下DS18B20时序,也参照了一些前人的例子,但试了许久都没起色,下了个国外的示例,调试了下,也没什么改进,后面开始想利用AVR内部的RC时钟,问了下厂家,厂家也未忙过来答复,我只有自己看数据手册,将保险置为RC 8MHz 时钟,一试,还未通,怀疑延时程序有问题,后来,换用春风的程序版本,在软件上进行了少许改动,并将SPI模块添加上去,一试,居然可以显示数据了,至少不是显示DS18B20复位失败信息(自定义为55H),但数据一直在跳动,后来,我再看了下程序,是原程序中对于温度变换时多X5了,后面捌掉,再运行,一切工作正常,室温25度,用手紧摸,温度慢慢上升,成功了。
       其实先前做个若干个51的温度计,有C和汇编语言的,但在做AVR时,由于对AVR的IO特性操作以及时钟流程不是太熟,所以走了许多弯路,分析时序,尤其是DS18B20需要严格的时序,比如说下面:


(0077) void delay_1ms(void)                 //1ms延时函数
(0078)   {
(0079)    unsigned int i;
(0080)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    005F 2700      CLR R16
    0060 2711      CLR R17
    0061 C002      RJMP 0x0064
    0062 5F0F      SUBI R16,0xFF
    0063 4F1F      SBCI R17,0xFF
    0064 3704      CPI R16,0x74
    0065 E0E4      LDI R30,4
    0066 071E      CPC R17,R30
    0067 F3D0      BCS 0x0062
    0068 9508      RET

       这个是一个1ms的延时程序,初看,一般都直接想到是1140个时钟周期,可你用编译器译完后,才发现并非如此,里面有些赋值、比较、跳转等指令,经过本人一分析,基本上Nt=5+1140X7=7980个时钟周期,再考虑是用的8MHz内部晶振,还真是1ms,所以,看多少个时钟还得汇编清晰,这个挺有用的吧!
       感兴趣的朋友,也可以好好研究下C程序编译后的汇编延时程序,你会发现许多内在的东西。

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条