CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

PIC16F877 readout SHT15 data show increase from real value

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Mr.P
Guest







PIC16F877 readout SHT15 data show increase from real value
PostPosted: Fri Jan 23, 2009 3:07 am     Reply with quote

SHT15 Code driver
Code:


///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Driver file for SHT75 Temperature & Humidity Sensor                       //
//                                                                           //
// ***** To initialise SHT75 sensor upon power up *****                      //
//                                                                           //
// Function : sht_init()                                                     //
// Return   : none                                                           //
//                                                                           //
//                                                                           //
// ***** To measure and caluculate SHT75 temp & real RH *****                //
//                                                                           //
// Function : sht_rd (temp, truehumid)                                       //
// Return   : temperature & true humidity in float values                    //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#define sht_data_pin   PIN_A1
#define sht_clk_pin    PIN_C4


//***** Function to alert SHT75 *****

void comstart (void)
{
 output_float(sht_data_pin);  //data high
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(2);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
}


//***** Function to write data to SHT75 *****

int1 comwrite (int8 iobyte)
{
 int8 i, mask = 0x80;
 int1 ack;

 //Shift out command
 delay_us(4);
 for(i=0; i<8; i++)
  {
   output_bit(sht_clk_pin, 0);                          //clk low
   if((iobyte & mask) > 0) output_float(sht_data_pin);  //data high if MSB high
   else output_bit(sht_data_pin, 0);                    //data low if MSB low
   delay_us(1);
   output_bit(sht_clk_pin, 1);                          //clk high
   delay_us(1);
   mask = mask >> 1;                                    //shift to next bit
  }

 //Shift in ack
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 ack = input(sht_data_pin);   //get ack bit
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 return(ack);
}


//***** Function to read data from SHT75 *****

int16 comread (void)
{
 int8 i;
 int16 iobyte = 0;
 const int16 mask0 = 0x0000;
 const int16 mask1 = 0x0001;

 //shift in MSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 0 bit
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_float(sht_data_pin);  //data high

 //shift in LSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 1 bit
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low

 return(iobyte);
}


//***** Function to wait for SHT75 reading *****

void comwait (void)
{
 int16 sht_delay;

 output_float(sht_data_pin);                     //data high
 output_bit(sht_clk_pin, 0);                     //clk low
 delay_us(1);
 for(sht_delay=0; sht_delay<30000; sht_delay++)  // wait for max 300ms
  {
   if (!input(sht_data_pin)) break;              //if sht_data_pin low, SHT75 ready
   delay_us(10);
  }
}


//***** Function to reset SHT75 communication *****

void comreset (void)
{
 int8 i;

 output_float(sht_data_pin);    //data high
 output_bit(sht_clk_pin, 0);    //clk low
 delay_us(2);
 for(i=0; i<9; i++)
  {
   output_bit(sht_clk_pin, 1);  //toggle clk 9 times
   delay_us(2);
   output_bit(sht_clk_pin, 0);
   delay_us(2);
 }
 comstart();
}


//***** Function to soft reset SHT75 *****

void sht_soft_reset (void)
{
 comreset();           //SHT75 communication reset
 comwrite(0x1e);       //send SHT75 reset command
 delay_ms(15);         //pause 15 ms
}


//***** Function to measure SHT75 temperature *****

int16 measuretemp (void)
{
 int1 ack;
 int16 iobyte;

 comstart();             //alert SHT75
 ack = comwrite(0x03);   //send measure temp command and read ack status
 if(ack == 1) return;
 comwait();              //wait for SHT75 measurement to complete
 iobyte = comread();     //read SHT75 temp data
 return(iobyte);
}


//***** Function to measure SHT75 RH *****

int16 measurehumid (void)
{
 int1 ack;
 int16 iobyte;

 comstart();            //alert SHT75
 ack = comwrite(0x05);  //send measure RH command and read ack status
 if(ack == 1) return;
 comwait();             //wait for SHT75 measurement to complete
 iobyte = comread();    //read SHT75 temp data
 return(iobyte);
}


//***** Function to calculate SHT75 temp & RH *****

void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
 float  rh;
 //float truehumid1;

 //calculate temperature reading
 tc = ((float) temp * 0.01) - 40.0;

 //calculate Real RH reading
 rh = (float) humid;

 rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;

 //calculate True RH reading
 rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}


//***** Function to measure & calculate SHT75 temp & RH *****

void sht_rd (float & temp, float & truehumid)
{
 int16 restemp, reshumid;
 float realhumid;
 restemp = 0; truehumid = 0;

 restemp = measuretemp();    //measure temp
 reshumid = measurehumid();  //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH
}


//***** Function to initialise SHT75 on power-up *****

void sht_init (void)
{
 comreset();    //reset SHT75
 delay_ms(20);  //delay for power-up
}


Main code
Code:

#include <16F877.h>

#define  TxD         PIN_C6   // Define Transmitted Data
#define  RxD         PIN_C7   // Define Received Data
#define  CLOCK_SP    10000000 // Clock Speed(Hz)

#fuses HS                     // Oscillator mode HS
#fuses NOLVP, NOWDT           // No Low Voltage Program, No Watchdog timer
#fuses NOPROTECT              // Code no protection
#use delay (clock=CLOCK_SP)   // Use built-in function: delay_ms() & delay_us()
#use rs232(baud=9600,parity=N,xmit=TxD,rcv=RxD,bits=8,stream=PC_COM) // Use serial I/O port (RS232)


#include<lcd.c>
#include<sht15.c>

void main(void)
{
 float restemp, truehumid;
 //lcd_init();
 sht_init();

 while(TRUE)
 {
  sht_rd (restemp, truehumid);
  //lcd_gotoxy(1,1);
  //printf(lcd_putc, "Temp : %3.1f %cC   ", restemp, 223);
  //printf(lcd_putc, "\nRH   : %3.1f %%   ", truehumid);
  printf("\r\nTemp : %3.1f %cC   ", restemp, 223); // print to hyper terminal
  printf("\r\nRH   : %3.1f %%   ", truehumid); // print to hyper terminal
  printf("\r\n- - - - - - - - - - - - - - - -");
  delay_ms(500);        //delay 500 ms between reading to prevent self heating of sensor
 }
}
 
 


and I debugging on hyperterminal

"
- - - - - - - - - - - - - - - -
Temp : 27.5 ßC
RH : 37.6 %
- - - - - - - - - - - - - - - -
"
while room temperature show 25.3 C

I don't know why.
someone help me please. Thanks
Wayne_



Joined: 10 Oct 2007
Posts: 681

View user's profile Send private message

PostPosted: Fri Jan 23, 2009 3:23 am     Reply with quote

This is most likely to do with your hardware.
How are you reading the room temp 25.3 ?

If the difference is consitant e.g.
Code:

Room   Reading  Diff
25.3     27.5       2.2
10.0     12.2       2.2
50.5     52.7       2.2


Then you can just add a cal value, this may need to be set differently on each hardware build as you have to adjust for tollerences of components.

You would do this by storing the value in eeprom or flash and have a serial or other routine to allow you to set it.

If the difference changes you need to work out if it is exponential, if the difference in change is the same then you have the same problem and can adjust for it.

If it is random then you have a different problem.

Besides all this, are you sure the device you are using to read the room temp is correct ?
Have you tried different ones ?
Are you reading the temp from exactly the same place ?
Is the vref correct ?
Does the vref change on each build of hardware ?
how many builds of hardware do you have ?
asmallri



Joined: 12 Aug 2004
Posts: 1634
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Fri Jan 23, 2009 9:44 am     Reply with quote

The SHT15 is a precision sensor (an SMD variant of the SHT75). I have use lots of these sensors in precision environment monitoring systems and found them to be reliable and accurate when check against calibrated precision instruments.

Check the following:
1. Ensure you have not turned on the sensor's self heater - this will give an error corresponding to what you are seeing

2. Do you have heat sources or contaminated airflow near the sensor?

3. Is the PCB holding the sensor obstructing the airflow?

4. Are you comparing the temperature reading against a precision, calibrated thermometer?

5. Is the thermometer and sensor close proximity - less than 2 cm?

5. What is the impact when you introduce a constant airflow across the sensor and thermometer?
_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!
Mr.P
Guest







PostPosted: Sat Jan 24, 2009 7:13 am     Reply with quote

Thank you , asmallri and Wayne_ for your suggest. Let me try check again, after that I will update again
atai21



Joined: 30 Dec 2010
Posts: 31

View user's profile Send private message

PostPosted: Thu Dec 30, 2010 2:01 am     Reply with quote

may i know why when i type the driver code into ccs,the error come out say a device is required before this line (the one that i highlight)


//***** Function to alert SHT75 *****

void comstart (void)
{
output_float(sht_data_pin); //data high
output_bit(sht_clk_pin, 0); //clk low
delay_us(1);
output_bit(sht_clk_pin, 1); //clk high
delay_us(1);
output_bit(sht_data_pin, 0); //data low
delay_us(1);
output_bit(sht_clk_pin, 0); //clk low
Ttelmah



Joined: 11 Mar 2010
Posts: 19327

View user's profile Send private message

PostPosted: Thu Dec 30, 2010 3:07 am     Reply with quote

Because you need a device statement.....

Remember CCS, deals with an enormous range of different hardware features for the PIC's. Different instruction sets between each of the 'families', and lot of variants inside these.
The compiler _must_ be told a series of things, _before_ it can compile anything:

1) Processor type
2) Fuses used
3) Clock rate (affects delays etc...).

These must be present, before anything else.
If using serial, or I2C, the definitions for these, should also exist.

Look at the CCS examples. Note how they always have right near the top of the code, these things defined (sometimes by loading another 'include' file).

Best Wishes
atai21



Joined: 30 Dec 2010
Posts: 31

View user's profile Send private message

PostPosted: Thu Dec 30, 2010 3:11 am     Reply with quote

tqvm ttelmah...i will try it first
Ttelmah



Joined: 11 Mar 2010
Posts: 19327

View user's profile Send private message

PostPosted: Thu Dec 30, 2010 3:21 am     Reply with quote

Actually, I suspect the problem is not visible here - are you using MPLAB?.

If so, make sure that the _include files_ LCD.c, and sht15.c, _are not_ in the project.

If MPLAB 'sees' a .c file, in the project, it will try to compile this file.
So what happens, if that it will attempt to compile the SHT15 file "on it's own", rather than 'included' in the main file (where the definitions are present).

Just leave it out of the project. It'll be included, by the include statement, and the error will vanish!....

Best Wishes
atai21



Joined: 30 Dec 2010
Posts: 31

View user's profile Send private message

PostPosted: Thu Dec 30, 2010 3:25 am     Reply with quote

i'm using ccs compiler not MPLAB

tq
Ttelmah



Joined: 11 Mar 2010
Posts: 19327

View user's profile Send private message

PostPosted: Thu Dec 30, 2010 4:03 am     Reply with quote

A lot of people use MPLAB, in place of the IDE for CCS, with the CCS compiler 'attached'. Hence my comments.
As posted, your code should work, unless you are trying to compile SHT15, on it's own...

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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