2009-12-15 63 views
0

我已经在下面定义了这些函数,并且当我询问Device_ID函数为例如 的家族代码时,我只得到了FF(应该是28),实际上我同时得到了家族代码,48位串行,crc 8位全部是“1”。它似乎像检测从属设备功能,因为它应该....如果我连接奴隶他说我的这里,如果我把它拿走...没有设备存在。我还有一个5线的拉线。1wire问题详细

而我没有线索为什么我的Device_ID不工作,所以我的问题是为什么不工作!? u能看到这段代码中的任何错误(IM使用PIC 18F87J50和一个DS18B20):

我的发言中主要:

 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;} 

回答

0

故障不是代码它自,我试图将其与RC滤波器,10nF的小导体和1K欧姆的电阻器连接到一个数字端口。

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

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; 
}