|
|
View previous topic :: View next topic |
Author |
Message |
Guest
|
DS18B20 |
Posted: Tue Apr 28, 2009 8:35 am |
|
|
I have a problem about ds18b20 digital termometer. I found a driver for it on internet. And I wrote a simple code for it.
1wire.c
Code: | #ifndef ONE_WIRE_C
#define ONE_WIRE_C
/*
* One wire (1-wire) driver for CCS C compiler. Suitable for use with devices
* such as the DS18B20 1-wire digital temperature sensor.
*/
#define ONE_WIRE_PIN PIN_C5
/*
* onewire_reset()
* Description: Initiates the one wire bus.
*/
// OK if just using a single permanently connected device
void onewire_reset() {
output_low(ONE_WIRE_PIN); // pull the bus low for reset
delay_us(500);
output_float(ONE_WIRE_PIN); // float the bus high
delay_us(500); // wait-out remaining initialisation window
output_float(ONE_WIRE_PIN);
}
/*
* onewire_write(int8 data)
* Arguments: a byte of data.
* Description: writes a byte of data to the device.
*/
void onewire_write(int8 data) {
int8 count;
for(count = 0; count < 8; ++count) {
output_low(ONE_WIRE_PIN);
delay_us(2); // pull 1-wire low to initiate write time-slot.
output_bit(ONE_WIRE_PIN, shift_right(&data, 1, 0)); // set output bit on 1-wire
delay_us(60); // wait until end of write slot.
output_float(ONE_WIRE_PIN); // set 1-wire high again,
delay_us(2); // for more than 1us minimum.
}
}
/*
* onewire_read()
* Description: reads and returns a byte of data from the device.
*/
int onewire_read() {
int count, data;
for(count = 0; count < 8; ++count) {
output_low(ONE_WIRE_PIN);
delay_us(2); // pull 1-wire low to initiate read time-slot.
output_float(ONE_WIRE_PIN); // now let 1-wire float high,
delay_us(8); // let device state stabilise,
shift_right(&data, 1, input(ONE_WIRE_PIN)); // and load result.
delay_us(120); // wait until end of read slot.
}
return data;
}
#endif /*ONE_WIRE_C*/
|
Ds18b20.c
Code: |
#ifndef DS1820_C
#define DS1820_C
#include "1wire.c"
float ds1820_read();
void ds1820_configure(int8 TH, int8 TL, int8 config);
/*
* ds1820_read()
* Description: reads the ds18x20 device on the 1-wire bus and returns
* the temperature
*/
float ds1820_read() {
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
//ds1820_configure(0x00, 0x00, 0x00); //9 bit resolution
onewire_reset();
onewire_write(0xCC); //Skip ROM, address all devices
onewire_write(0x44); //Start temperature conversion
while(busy == 0) //Wait while busy (bus is low)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC); //Skip ROM, address all devices
onewire_write(0xBE); //Read scratchpad
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
//result = (float) temp3 / 2.0; //Calculation for DS18S20 with 0.5 deg C resolution
result = (float) temp3 / 16.0; //Calculation for DS18B20
delay_ms(200);
return(result);
} |
And this is my code
Code: | if(t>=20)
{
output_high(pin_c0);
delay_ms(1000);
printf(lcd_putc,"\fKlima ON\n%f>20'C",t);
delay_ms(5000);
goto LOOP1;
} |
But it doesn't make high output pin_c0.
I couldnt understand why? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Apr 28, 2009 11:35 am |
|
|
The DS18B20 driver you use is the driver as posted in the CCS Code Library but with the name of the original author and GNU license text removed. I'm not saying that you removed the comments, maybe you copied it from another source, but it would be nice to respect the original author.
Your program is not complete so we can not test it. For example the declaration of 't' is missing. Post a small program demonstrating your problem. Make the program complete, including #fuses, and not larger than 25 lines. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|