|
|
View previous topic :: View next topic |
Author |
Message |
Guest_X44 Guest
|
CCS Exercise on I2C |
Posted: Sun Feb 01, 2004 10:28 pm |
|
|
I’m following the example set out in the CCS Exercise book. P. 17, on using the I2C Temperature Sensor (device is DS1631).
There are a few things I still don’t quite understand. Perhaps, someone here can shed some light.
According to the datasheet, initiating a 2-wire communication requires for the Master (in this case the PIC16F877) to generate a START followed by a CONTROL BYTE – in this case, i2c_write(0x90), then followed by a COMMAND BYTE, which indicates what type of operation is to be performed.
But, looking at the definition inside the init_temp(), in the call to i2c_write(0xee), the parameter 0xee is not among the command protocols in the COMMAND SET listed in the datasheet.
Question: What then is this for if it’s not a command protocol in the COMMAND SET?
Question: What is the temp_config(BYTE data) for, although it makes sense that the temp_config(BYTE data) is called because I recognise that the 12c_write(0xac) corresponds to one of the command protocols in the COMMAND SET. If the temp_config(BYTE data is to configure the device then why is this not called first?
#include <16f877.h>
#device ICD=TRUE
#fuses HS, NOLVP, NOWDT, PUT
#use delay(clock=20000000)
#use rs232(DEBUGGER)
#ifndef DAL_SCL
#define DAL_SCL PIN_B0
#define DAL_SDA PIN_B1
#endif
#define read_temp read_high_temp // for backwards compatability
#use i2c(master,sda=DAL_SDA, scl=DAL_SCL)
void temp_config(BYTE data) {
i2c_start();
i2c_write(0x90);
i2c_write(0xac);
i2c_write(data);
i2c_stop();
}
void init_temp() {
output_high(DAL_SDA);
output_high(DAL_SCL);
i2c_start();
i2c_write(0x90);
i2c_write(0xee);
i2c_stop();
temp_config(8);
}
BYTE read_high_temp() { // Returns degrees F (0-255)
BYTE datah,datal;
signed long data;
i2c_start();
i2c_write(0x90);
i2c_write(0xaa);
i2c_start();
i2c_write(0x91);
datah=i2c_read();
datal=i2c_read(0);
i2c_stop();
data=datah;
data=data*9;
if(bit_test(datal,7))
{
if(data < 0)
data -= 4;
else
data += 4;
}
data=(data/5)+32;
if(data < 0)
data = 0;
else if(data > 255)
data = 255;
return((int)data);
}
signed int read_low_temp() { // Returns degrees F (-67 to 127)
signed int datah, datal;
signed long data;
i2c_start();
i2c_write(0x90);
i2c_write(0xaa);
i2c_start();
i2c_write(0x91);
datah=i2c_read();
datal=i2c_read(0);
i2c_stop();
data=datah;
data=data*9;
if(bit_test(datal,7))
{
if(data < 0)
data -= 4;
else
data += 4;
}
data = (data / 5) + 32;
if(data > 127)
data = 127;
return((int)data);
}
signed long read_full_temp() { // Returns degrees F (-67 to 257)
signed int datah, datal;
signed long data;
i2c_start();
i2c_write(0x90);
i2c_write(0xaa);
i2c_start();
i2c_write(0x91);
datah=i2c_read();
datal=i2c_read(0);
i2c_stop();
data=datah;
data=data*9;
if(bit_test(datal,7))
{
if(data < 0)
data -= 4;
else
data += 4;
}
data = (data / 5) + 32;
return(data);
}
main()
{
byte value;
init_temp();
do{
value = read_temp();
printf("%u\r\n", value);
delay_ms(1000);
}while(TRUE);
} |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Feb 01, 2004 11:57 pm |
|
|
The code that you posted, with the 0xEE command, is from ds1621.c,
not ds1631.c. That file is available in the following folder:
c:\Program Files\Picc\Drivers
So there's either a problem in the exercise book, or you misread it. |
|
|
Guest
|
|
Posted: Mon Feb 02, 2004 3:43 am |
|
|
The circuit in the exercise book shows a ds1621.
Thank you so much, PCM Programmer. |
|
|
|
|
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
|