BillT
Joined: 09 Feb 2006 Posts: 1
|
DS18B20 help |
Posted: Thu Feb 09, 2006 6:20 pm |
|
|
Hi and help!
I stripped my code to barebones and even copied some of it to be sure: no matter what I do, I can't read the sensor - one single sensor! I swapped out the PIC, tried different pins, and changed timing. The 1-wire part is indeed found - it just doesn't send any data back. During read by the PIC, it just sits high, which gives the 0xFFFFF... response. Any advice?
Thanks very much,
BillT
My output is always:
Code: | Pulse detected!!!
ffffffffffffffffff
ffffffffffffffffff
ffffffffffffffffff
ffffffffffffffffff |
except when I unplug the sensor, and then the DS18B02 is indeed not found as expected.
Code: | //
// Dallas 18B20 I/O pin connected to PIC RB5 pin, pulled up by 5k ohm resistor
// Data sent to PC via MAX232 on PIC RC6 pin
//
//
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,DEBUG,NOBROWNOUT,
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8, stream=PC)
int1 init_1_wire(void);
void send_byte(int8 data);
int8 read_byte(void);
void main() {
int8 k;
int1 test;
int8 buff[9];
// For now, keep it simple wrt interrupts:
disable_interrupts(GLOBAL);
// Default state: 1-wire pin is floating:
output_float(PIN_B5);
// Find the device and report the results:
test = init_1_wire();
if(test)
fprintf(PC, "\r\nPulse detected!!!\r\n");
else
fprintf(PC, "\r\nPulse NOT detected!!!\r\n");
// Here, perform temperature conversion and send scratchpad bytes to PC:
while(1){
test = init_1_wire();
send_byte(0xCC); // Skip ROM
send_byte(0x44); // Perform temperature conversion
delay_ms(800); // Takes 750 msec for conversion
test = init_1_wire();
send_byte(0xCC); // Skip ROM
send_byte(0xBE); // Read scratchpad
delay_us(60);
// Read and report what was found:
for(k = 0; k < 9;++k){
buff[k] = read_byte(); }
fprintf(PC, "%x%x%x%x%x%x%x%x%x\r\n", buff[8],buff[7],buff[6],buff[5],buff[4],buff[3],buff[2],buff[1],buff[0]);
} // Close the while
} // Close the main
int1 init_1_wire(void){
int8 n = 250;
// Pull pin low for 500 usec and check if device is there:
output_low(PIN_B5);
delay_us(500);
output_float(PIN_B5);
while((--n) && input(PIN_B5));
if(n)
return(1);
else
return(0);
} // close init_1_wire
void send_byte(int8 data){
int8 count;
for(count = 0; count < 8; ++count) {
output_low(PIN_B5);
delay_us(2);
output_bit(PIN_B5, shift_right(&data,1,0)); // Put bit on pin
delay_us(60); // End of write slot
output_float(PIN_B5); // 1-wire goes high
delay_us(2); // Must be high > 1 usec
}
} // Close send_byte
int8 read_byte(void){
int8 count, data;
for(count = 0; count < 8; ++count) {
output_low(PIN_B5);
delay_us(2);
output_float(PIN_B5);
delay_us(13);
shift_right(&data,1,input(PIN_B5));
delay_us(45);
}
return(data);
} //Close read_byte |
|
|