I defined these functions below, and when I request the Device_ID function, for example, the family code, I get only FF (should be 28), I get both the family code, 48-bit serial, and 8-bit crc, to be "alone " It appears that the function of the slave detection device works as it should. If I plug in a slave, he will say that I am here, and if I take it ... there is no device. I also have 5kohm pull-up on 1wire.
And I have no clue why my Device_ID is not working, so my question is why it is not working !? you can see something is wrong in this code (I use PIC 18F87J50 and one DS18B20):
My expression in Main:
OSCTUNEbits.PLLEN = 1; Init_Registers(); Init_Settings(); Init_Ports(); Init_Glcd(); Detect_Slave_Device(); Device_ID( 0x33 );
Functions Used:
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();
void drive_OW_low (void){ LATHbits.LATH0 = 0; TRISHbits.TRISH0 = 0; }
void drive_OW_high (void){ LATHbits.LATH0 = 0; TRISHbits.TRISH0 = 1;}
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;}
And now some of the important 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);
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;}