[MCU] 如何实现软件检测18B20的复位是否正常?

[复制链接]
2897|10
 楼主| mfkyygt 发表于 2014-9-20 16:30 | 显示全部楼层 |阅读模式
    一直用18B20测温都好好的,某日不知为何18B20发烫厉害,程序跑飞复位后卡在18B20初始化上,以前没有特别注意这个环节,认为18B20初始化后就可以执行下面的代码了,现在遇到问题确实忽视了这点。查了datasheet,18B20复位正常后由于有10K电阻的上拉,空闲时间端口输出为高电平,那是否可以通过软件检测输出端口持续高电平的时间来判断18B20复位是否正常?不知其他朋友是如何判断检测的?
//---- DS18B20复位 ----
void DS18B20_reset()
{
        OUTPUT(DDRB,DQ);   //DQ设为输出
        CLR(PORTB,DQ);        //DQ拉低电平
        delay_us(680);           //延迟500us
        SET(PORTB,DQ);        //DQ置高电平
        delay_us(50);             //延迟40us
        INPUT(DDRB,DQ);      //DQ设为输入
        while(PINB&BIT(DQ));       //在这里加入检测长时间的高电平?
        while(!(PINB&BIT(DQ)));
}


 楼主| mfkyygt 发表于 2014-9-20 21:22 | 显示全部楼层
本帖最后由 mfkyygt 于 2014-9-21 07:40 编辑

试着改为上电后先复位一次18B20,然后查总线是否一直为高,是则判断为18B20未接好或损坏,显示err,问题初步解决

//----
OUTPUT(DDRB,DQ);   //DQ设为输出
CLR(PORTB,DQ);     //DQ拉低电平
delay_us(680);     //延迟500us
SET(PORTB,DQ);     //DQ置高电平
delay_us(50);      //延迟40us
INPUT(DDRB,DQ);    //DQ设为输入
while (PINB&BIT(DQ))
{
    L_aderr =1;
    show_led(22);
    SET(PORTB,BT);
  }
  L_aderr =0;
  delay_ms(100);
  //----
  while (1)      
  {
     DS18B20_reset();       //DS18B20复位
     DS18B20_write(0xCC);   //跳过ROM
     DS18B20_write(0x44);   //启动温度转换
     ……
ningling_21 发表于 2014-9-21 00:15 | 显示全部楼层
10K的上啦电阻有点大,一般取4.7K,电源3.3V也可以工作...

评分

参与人数 1威望 +3 收起 理由
mfkyygt + 3 神马都是浮云

查看全部评分

ayb_ice 发表于 2014-9-21 10:17 来自手机 | 显示全部楼层
通信过程都有应答的,中间出错应该知道的

评分

参与人数 1威望 +3 收起 理由
mfkyygt + 3 神马都是浮云

查看全部评分

 楼主| mfkyygt 发表于 2014-9-21 21:54 | 显示全部楼层
ayb_ice 发表于 2014-9-21 10:17
通信过程都有应答的,中间出错应该知道的

现在就是想知道应如何在测温过程中检测18B20是否连接或工作正常,请指教解决方法,谢谢。
ayb_ice 发表于 2014-9-22 07:13 来自手机 | 显示全部楼层
没有应答就说明有问题了
ayb_ice 发表于 2014-9-22 07:13 来自手机 | 显示全部楼层
没有应答就说明有问题了
ayb_ice 发表于 2014-9-22 09:06 | 显示全部楼层
//------------------------------------------------------
// check_reset_wire
//------------------------------------------------------
//
// 检查(复位)是否有总线存在(退出时总线应该为高)
// 返回: WIRE_TRUE=成功, WIRE_FALSE=失败, WIRE_NO=没有器件
//
#if CHECK_RESET_WIRE_EN > 0
#pragma WIRE_DISABLE
U8 check_reset_wire(void)
{
        U8 x;

        DQ = 0;
        wire_reset_delay();
        DQ = 1;
        _nopx(1);
        if(!DQ) return WIRE_FALSE;
        x = 0;
        while(DQ){
                if(++x > 250){
                        return WIRE_NO;                // 2008-12-13 18:31
                }                                                // 由return WIRE_FALSE;改为return WIRE_NO;
        }
        wire_reset_delay();
        if(!DQ) return WIRE_FALSE;
        return WIRE_TRUE;
}
#endif
 楼主| mfkyygt 发表于 2014-9-22 14:37 | 显示全部楼层
那实际也是轮询DQ位是否一直为高电平了

谢谢关注
cdf1214 发表于 2015-3-28 16:31 | 显示全部楼层
                 北京长实拓展电子有限公司
本公司主营TI. NXP. IR. ON. SiLicon                                                                                                       等著名世界品牌产品。
MSP430F一系列TI储存芯片 微控处理器
MSP430F149IPMR MSP430F5438AIPZR MSP430F5438IPZR等。
C8051F 一系列SILICON 单片机 微控处理器
C8051F020 C8051F120 C8051F340 C8051F040等
LPC一系列NXP单片机  
LPC2132FBD64 LPC2134FBD64 LPC2214FBD144  
LPC2378FBD144 LPC2292FBD144等一系列供应
专营:低压差 基准源 三 五 七端稳压 二三极管 场效应 快恢复 肖特基二极管 可控硅 达林顿 整流桥 TVS管 光藕 MAX AD 集成电路 
                   北京长实拓展电子销售:陈冬锋
                                     QQ:2850327057
                      电话:15711002528,13641144498
cdf961214 发表于 2015-4-2 15:29 | 显示全部楼层
                 北京长实拓展电子有限公司
        本公司主营TI. NXP. IR. ON. SILIABS
                                               
18B20温度传感器特价销售                                              等著名世界品牌产品。
MSP430F一系列TI储存芯片 微控处理器
MSP430F149 169 249 449 1611 5438 5438AIPZR  等。
C8051F 一系列SILICON 单片机 微控处理器
C8051F020 021 022 023 040 120 310 320 330 340 350等
LPC一系列NXP单片机  
LPC2132FBD64 LPC2134FBD64 LPC2214FBD144  
LPC2378FBD144 LPC2292FBD144等一系列供应
专营:低压差 基准源 三 五 七端稳压 二三极管 场效应 快恢复 肖特基二极管 可控硅 达林顿 整流桥 TVS管 光藕 MAX AD 集成电路 
                   北京长实拓展电子销售:陈冬锋
                                     QQ:2850327057
                      电话:15711002528,13641144498
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

65

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部