【问题标题】:1wire problem in detail1wire问题详细
【发布时间】:2009-12-15 20:22:07
【问题描述】:

我已经在下面定义了这些函数,当我询问 Device_ID 函数时,例如 家庭代码,我只得到FF(应该是28),实际上我得到了家庭代码,48位串行和crc 8位都是“一”。似乎检测从设备功能正常工作......如果我连接从设备,他说我在这里,如果我把它拿走......没有设备存在。我在 1wire 上也有一个 5kohm 的上拉电阻。

而且我不知道为什么我的 Device_ID 不起作用,所以我的问题是为什么它不起作用!?你能在这段代码中看到任何错误吗(我使用的是 PIC 18F87J50 和一个 DS18B20):

我在 Main 中的声明:

     OSCTUNEbits.PLLEN = 1;

 Init_Registers();
 Init_Settings();
 Init_Ports();
 Init_Glcd();

 Detect_Slave_Device();
 Device_ID( 0x33 );

用到的函数:

    void Detect_Slave_Device(void){ 
 uint8_t value;
 OW_reset_pulse();
 if (OW_reset_pulse())
 {
  Display_Cls();
  Display_StringAt("No Device Present!",5,6);
  Delay_1sec();
  Delay_1sec();
 } else {
  Display_Cls();
  Display_StringAt("Device Present!",5,6);
  Delay_1sec();
  Delay_1sec(); }}

   uint8_t OW_reset_pulse(void){
 uint8_t presence_detect;

   drive_OW_low();     // Drive the bus low

  Delay_us(200);     // Delay at least 480 microsecond (us)
 Delay_us(200);
 Delay_us(85);  

  drive_OW_high ();      // Release the bus
         // Here should the client drive low
 Delay_us(50);     // Delay 50 microsecond (us)

 presence_detect = read_OW(); // Sample for presence pulse from slave

  Delay_us(200);       // Delay 435 microsecond (us)
 Delay_us(200);
 Delay_us(35);  

 drive_OW_high ();       // Release the bus

 return presence_detect;} 

    void drive_OW_low (void){
 LATHbits.LATH0 = 0;
 TRISHbits.TRISH0 = 0; }// Output

    void drive_OW_high (void){
 LATHbits.LATH0 = 0;
 TRISHbits.TRISH0 = 1;} // Input

    uint8_t read_OW (void){
 unsigned char read_data=0;

 TRISHbits.TRISH0 = 1;

  if (1 == PORTHbits.RH0)
   read_data = 1;
  else  
  read_data = 0;

 return read_data;}

现在还有一些重要的 device_id:

    void Device_ID( uint8_t command ){
 uint8_t loop, family, checksum, ROM_CODE[8];   // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
 static char container[1];

 OW_reset_pulse();
 OW_write_byte( 0x33 );   // READ ROM COMMAND DS18B20

 for(loop = 0; loop < 9; loop++) // 1 byte in per time = 64-bits
 {
  ROM_CODE[loop] = OW_read_byte();
 }

 family = ROM_CODE[1];
 checksum = ROM_CODE[8];
 And so on = Print MY VALUES ->

   void OW_write_byte (uint8_t write_data){
 uint8_t loop;

 for (loop = 0; loop < 8; loop++)
 {
  OW_write_bit(write_data & 0x01);  //Sending LS-bit first
  write_data >>= 1;     // shift the data byte for the next bit to send
 } }

   void OW_write_bit (uint8_t write_bit){
 if (write_bit)       // Write 1 time slot
 { 
  Brakepoint();     // 1 us
  //writing a bit '1'
  drive_OW_low();     // Drive the bus low
  Delay_us(6);     // Delay 6 microsecond (us)
  drive_OW_high ();      // Release the bus
  Delay_us(64);;     // Delay 64 microsecond (us)
 }
 else        // Write 0 time slot
 {
  Brakepoint();     // 1 us
  //writing a bit '0'
  drive_OW_low();     // Drive the bus low
  Delay_us(65);     // Delay 65 microsecond (us)
  drive_OW_high ();      // Release the bus
  Delay_us(10);     // Delay 10 microsecond for recovery (us)
 }} 

   uint8_t OW_read_byte (void)
 uint8_t loop, result=0;

 for (loop = 0; loop < 8; loop++)
 {

  result >>= 1;     // shift the result to get it ready for the next bit to receive
  if (OW_read_bit())
   result |= 0x80;   // if result is one, then set MS-bit
 }
 return result;     }

   uint8_t OW_read_bit (void){
 uint8_t read_data;       // Reading a bit 
 Brakepoint();       // 1 us
 drive_OW_low();       // Drive the bus low
 Delay_us(6);       // delay 6 microsecond (us)
 drive_OW_high ();        // Release the bus
 Delay_us(9);       // delay 9 microsecond (us)

 read_data = read_OW();     //Read the status of OW_PIN

 Delay_us(55);       // delay 55 microsecond (us) 
 return read_data;}

【问题讨论】:

    标签: embedded pic pic18 1wire


    【解决方案1】:

    这是我为 PIC18 编写的用于读取 DS18B20 的一些代码。

    /****************************************************************************
    * temperature.h
    ****************************************************************************/
    
    #ifndef TEMP_H
    #define TEMP_H
    
    extern double read_temp(void) ;
    extern void start_temp(void);
    
    #endif
    
    /****************************************************************************
    * temperature.c
    ****************************************************************************/
    
    void     reset_ow(void);
    void     write_ow(uint8_t  b);
    uint8_t  read_ow (void);
    
    #define OW_TEMP_SIG LATHbits.LATH0
    #define OW_TEMP_TRIS TRISHbits.TRISH0
    #define OW_TEMP_SIG_IN PORTHbits.RH0
    #define DIR_OUT 0
    #define DIR_IN 1
    
    void start_temp(void) 
    {
       uint8_t i;
    
       OW_TEMP_SIG=1;
       OW_TEMP_TRIS=DIR_OUT;
       for ( i=0;i<100;i++)
       {
           Delay_us(100);
       }
       reset_ow();
       write_ow(0xcc); // skip rom
       write_ow(0x44); // start t conv
    }
    
    double read_temp(void) 
    {
       double temp=0;
       S16 itemp;
    
       reset_ow();
       write_ow(0xcc); // skip rom
       write_ow(0xbe); // read scratch pad
       itemp=read_ow();
       itemp|=(S16)read_ow()<<8;
    
       temp = itemp*(0.0625);
       OW_TEMP_TRIS=DIR_IN;
       OW_TEMP_SIG=1;
       return temp; 
    }
    
    
    void reset_ow(void)
    {
       OW_TEMP_TRIS=DIR_OUT;
       OW_TEMP_SIG=0;
       Delay_us(250);
       Delay_us(250);
       OW_TEMP_TRIS=DIR_IN;
       OW_TEMP_SIG=1;
       Delay_us(250);
       Delay_us(250);
    }
    
    void write_ow(uint8_t b)
    {
       uint8_t i;
    
       OW_TEMP_SIG=1;
       OW_TEMP_TRIS=DIR_OUT;
       for ( i=0;i<8;i++)
       {
          OW_TEMP_SIG=0;
          if ( b & 0x01 )
          {
             Delay_us(10);
             OW_TEMP_SIG=1;
          }
          Delay_us(70);
          OW_TEMP_SIG=1;
          Delay_us(10);
          b >>= 1;
       }
       OW_TEMP_TRIS=DIR_IN;
       OW_TEMP_SIG=1;
    }
    
    uint8_t read_ow(void)
    {
       uint8_t b=0;
       uint8_t m;
       uint8_t i;
    
       m=1;
       for ( i=0;i<8;i++)
       {
          OW_TEMP_SIG=1;
          OW_TEMP_TRIS=DIR_OUT;
          OW_TEMP_SIG=0;        
          Delay_us(8);
          OW_TEMP_TRIS=DIR_IN;
          OW_TEMP_SIG=1;
          Delay_us(15);
    
          if ( 1 == OW_TEMP_SIG_IN )
          {
             b |= m;
          }
          m <<=1;
          Delay_us(60);
       }
       OW_TEMP_TRIS=DIR_IN;
       OW_TEMP_SIG=1;
       return b;
    }
    

    【讨论】:

      【解决方案2】:

      故障不是代码本身,我尝试将其连接到带有 RC 滤波器、10nf 小导体和 1k 欧姆电阻的数字端口。

      直到后来我才知道这一点。感谢您的回复,很有帮助。

      【讨论】:

        猜你喜欢
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        相关资源
        最近更新 更多