J'ai défini ces fonctions ci-dessous, et quand je demande à Device_ID fonction par exemple de le code de famille, je reçois seulement FF (devrait être 28), en fait je reçois à la fois le code de famille, série 48 bits , et le crc 8 bits pour être tous "ceux". Il semble que la fonction de détection d'esclave fonctionne comme il se doit ... Si je connecte l'esclave, il dit que je suis là, et si je l'enlève ... aucun périphérique présent. J'ai aussi un 5kohm pull-up au 1wire.1wire problème en détail
Et je n'ai pas la moindre idée pourquoi mon Device_ID ne fonctionne pas, alors ma question est la suivante: pourquoi ça ne marche pas? u peut voir quelque chose de mal dans ce code (Im en utilisant un PIC 18F87J50 et un DS18B20):
Ma déclaration principale:
OSCTUNEbits.PLLEN = 1;
Init_Registers();
Init_Settings();
Init_Ports();
Init_Glcd();
Detect_Slave_Device();
Device_ID(0x33);
Fonctions utilisées:
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;}
Et maintenant quelques DELA device_id importante:
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;}