Would you please tell me what is the usage of the following 3 line?
And how should i change the register settings in main for 16f877A or 18F452?
Code: Select all
OSCCON=0x71;
ANSEL=0;
ANSELH=0;
Code: Select all
OSCCON=0x71;
ANSEL=0;
ANSELH=0;
Code: Select all
enum {TEMP,HUMI};
#define FALSE 0
#define TRUE 1
#define DATA_T TRISB.F4
#define DATA_P PORTB.F4
#define SCK_T TRISB.F6
#define noACK 0
#define ACK 1
//adr command r/w
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
//LCD pin conf
sbit LCD_RS at RC7_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D4 at RC0_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_RS_Direction at TRISC7_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D4_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;
unsigned char in_string[16]={0},in_i=0,in_stop=FALSE;
////////////////////////////////////////////////////////////////////////////////
void Write_Float(float tmp_var)
{
char tmp_string[16];
FloatToStr(tmp_var,tmp_string);
Uart1_Write_Text(tmp_string);
Uart1_Write('\r');
}
////////////////////////////////////////////////////////////////////////////////
void Write_Int(unsigned int tmp_int)
{
char tmp_string[16];
IntToStr(tmp_int,tmp_string);
Uart1_Write_Text(tmp_string);
Uart1_Write('\r');
}
////////////////////////////////////////////////////////////////////////////////
void Write_LCD(unsigned char row, unsigned char col,float tmp_var)
{
char tmp_string[16];
FloatToStr(tmp_var,tmp_string);
LCD_Out(row,col,tmp_string);
}
////////////////////////////////////////////////////////////////////////////////
void Command(float *var)
{
unsigned char i=0,position,tmp_string[16];
if ((in_string[0]>='0')&& (in_string[0]<='6') )
{
position=in_string[0]-48;
while(in_string[i])
{
tmp_string[i]=in_string[i+2];
i++;
}
if (i>1) var[position]=atof(tmp_string); //if position is followed by float
else Write_Float(var[position]);
}
}
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
char s_write_byte(unsigned char value)
//------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{
if (i & value) DATA_T=1; //masking value with i , write to SENSI-BUS
else DATA_T=0;
SCK_T=1; //clk for SENSI-BUS
asm nop;asm nop;asm nop; //pulswith approx. 5 us
SCK_T=0;
}
DATA_T=1; //release DATA_T-line
SCK_T=1; //clk #9 for ack
error=DATA_P; //check ack (DATA_T will be pulled down by SHT11)
SCK_T=0;
return error; //error=1 in case of no acknowledge
}
//------------------------------------------------------------------------------
char s_read_byte(char ack)
//------------------------------------------------------------------------------
{ unsigned char i, val = 0;
for (i=0x80;i>0;i/=2)
{
SCK_T = 1;
if (DATA_P) val = (val | i);
SCK_T = 0;
}
DATA_T = !ack;
SCK_T = 1;
asm nop;asm nop;asm nop;
SCK_T = 0;
DATA_T = 1;
return val;
}
//----------------------------------------------------------------------------------
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA_T: |_______|
// ___ ___
// SCK_T : ___| |___| |______
{
DATA_T=1;
SCK_T=0; //Initial state
asm nop;
SCK_T=1;
asm nop;
DATA_T=0;
asm nop;
SCK_T=0;
asm nop;asm nop;asm nop;
SCK_T=1;
asm nop;
DATA_T=1;
asm nop;
SCK_T=0;
}
//----------------------------------------------------------------------------------
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA_T-line=1 and at least 9 SCK_T cycles followed by transstart
// _____________________________________________________ ________
// DATA_T: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK_T : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DATA_T=1; SCK_T=0; //Initial state
for(i=0;i<9;i++) //9 SCK_T cycles
{ SCK_T=1;
SCK_T=0;
}
s_transstart(); //transmission start
}
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value,unsigned char mode)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) without checksum
{
unsigned error=0;
unsigned int i;
s_transstart(); //transmission start
switch(mode)
{ //send command to sensor
case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
default : break;
}
for (i=0;i<65535;i++) if(DATA_P==0) break; //wait until sensor has finished the measurement
if(DATA_P) error+=1; // or timeout (~? sec.) is reached
*(p_value+1)=s_read_byte(ACK); //read the first byte (MSB)
*(p_value)=s_read_byte(noACK); //read the second byte (LSB)
return error;
}
/*
void calc_sth11(float *p_h ,float *p_t, float *var)
{
float h, t; // rh: Humidity [Ticks] 12 Bit
// t: Temperature [Ticks] 14 Bit
h=*p_h;
t=*p_t;
t=var[5]+var[6]*t; //calc. temperature from ticks to [°C]
h=(t-25)*(var[3]+var[4]*h)+var[0]+var[1]*h+var[2]*h*h;
if(h>100) h=100; //cut if the value is outside of
if(h<0.1) h=0.1; //the physical possible range
*p_t=t; //return temperature [°C]
*p_h=h; //return humidity[%RH]
}
*/
////////////////////////////////////////////////////////////////////////////////
void main()
{
unsigned int h_raw,t_raw;
unsigned char i,error;
float h_val,t_val,cal[7];
OSCCON=0x71;
ADCON1 = 0;
TRISB=0;
PORTB=0;
TRISC=0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"H");
Lcd_Out(2,1,"T");
PIE1=0x20;
INTCON=0xC0;
while (1)
{
error=FALSE;
error+=s_measure((unsigned char*) &h_raw,HUMI); //measure humidity
error+=s_measure((unsigned char*) &t_raw,TEMP); //measure temperature
if(error) s_connectionreset();
else
{
h_val=h_raw;
t_val=t_raw;
// calc_sth11(&h_val,&t_val,cal); //calculate humidity, temperature
Write_LCD(1,2,h_val);
Write_LCD(2,2,t_val);
}
if (in_stop==TRUE) //interpret commands
{
// Command(cal);
for(i=0;i<16;i++) in_string[i]='\0'; //clear string and flags
in_stop=FALSE;
in_i=0;
}
delay_ms(1000); // to be changed to timer interrupt
}
}
Code: Select all
Lcd_Out(1,1,"H");
Lcd_Out(2,1,"T");
Code: Select all
calc_sth11(&h_val,&t_val,cal);
Code: Select all
Command(cal);
Code: Select all
// calc_sth11(&h_val,&t_val,cal);
// Command(cal);
Code: Select all
void calc_sth11(float *p_h ,float *p_t, float *var)
{
float h, t; // rh: Humidity [Ticks] 12 Bit
// t: Temperature [Ticks] 14 Bit
h=*p_h;
t=*p_t;
//t=var[5]+var[6]*t; //calc. temperature from ticks to [°C]
//h=(t-25)*(var[3]+var[4]*h)+var[0]+var[1]*h+var[2]*h*h;
// if(h>100) h=100; //cut if the value is outside of
//if(h<0.1) h=0.1; //the physical possible range
*p_t=t; //return temperature [°C]
*p_h=h; //return humidity[%RH]
}
Code: Select all
#define DATA_T TRISB.F4
#define DATA_P PORTB.F4
#define SCK_T TRISB.F6
Code: Select all
typedef union
{ unsigned int i;
float f;
} value;
//
enum {TEMP,HUMI};
#define DATA_T TRISB.F4
#define DATA_P PORTB.F4
#define SCK_T TRISB.F6
#define noACK 0
#define ACK 1
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
//LCD pin conf
sbit LCD_RS at RC7_bit;
sbit LCD_EN at RC6_bit;
sbit LCD_D4 at RC0_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_RS_Direction at TRISC7_bit;
sbit LCD_EN_Direction at TRISC6_bit;
sbit LCD_D4_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;
void Write_LCD(unsigned char row, unsigned char col,float tmp_var)
{
char tmp_string[16];
FloatToStr(tmp_var,tmp_string);
LCD_Out(row,col,tmp_string);
}
//----------------------------------------------------------------------------------
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ if (i & value) DATA_T=1; //masking value with i , write to SENSI-BUS
else DATA_T=0;
SCK_T=1; //clk for SENSI-BUS
asm nop;asm nop;asm nop; //pulswith approx. 5 us
SCK_T=0;
}
DATA_T=1; //release DATA-line
SCK_T=1; //clk #9 for ack
error=DATA_P; //check ack (DATA will be pulled down by SHT11)
SCK_T=0;
return error; //error=1 in case of no acknowledge
}
//----------------------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DATA_T=1; //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SCK_T=1; //clk for SENSI-BUS
if (DATA_P) val=(val | i); //read bit
SCK_T=0;
}
DATA_T=!ack; //in case of "ack==1" pull down DATA-Line
SCK_T=1; //clk #9 for ack
asm nop;asm nop;asm nop; //pulswith approx. 5 us
SCK_T=0;
DATA_T=1; //release DATA-line
return val;
}
//----------------------------------------------------------------------------------
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA_T: |_______|
// ___ ___
// SCK_T : ___| |___| |______
{
DATA_T=1; SCK_T=0; //Initial state
asm nop;
SCK_T=1;
asm nop;
DATA_T=0;
asm nop;
SCK_T=0;
asm nop;asm nop;asm nop;
SCK_T=1;
asm nop;
DATA_T=1;
asm nop;
SCK_T=0;
}
//----------------------------------------------------------------------------------
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA_T: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK_T : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DATA_T=1; SCK_T=0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{ SCK_T=1;
SCK_T=0;
}
s_transstart(); //transmission start
}
//----------------------------------------------------------------------------------
char s_softreset(void)
//----------------------------------------------------------------------------------
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //reset communication
error+=s_write_byte(RESET); //send RESET-command to sensor
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //transmission start
error=s_write_byte(STATUS_REG_R); //send command to sensor
*p_value=s_read_byte(ACK); //read status register (8-bit)
*p_checksum=s_read_byte(noACK); //read checksum (8-bit)
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_write_statusreg(unsigned char *p_value)
//----------------------------------------------------------------------------------
// writes the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //transmission start
error+=s_write_byte(STATUS_REG_W);//send command to sensor
error+=s_write_byte(*p_value); //send value of status register
return error; //error>=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned error=0;
unsigned int i;
s_transstart(); //transmission start
switch(mode){ //send command to sensor
case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
default : break;
}
for (i=0;i<65535;i++) if(DATA_P==0) break; //wait until sensor has finished the measurement
if(DATA_P) error+=1; // or timeout (~2 sec.) is reached
*(p_value+1)=s_read_byte(ACK); //read the first byte (MSB)
*(p_value)=s_read_byte(noACK); //read the second byte (LSB)
*p_checksum =s_read_byte(noACK); //read checksum
return error;
}
//----------------------------------------------------------------------------------------
void calc_sth11(float *p_humidity ,float *p_temperature)
//----------------------------------------------------------------------------------------
// calculates temperature [°C] and humidity [%RH]
// input : humi [Ticks] (12 bit)
// temp [Ticks] (14 bit)
// output: humi [%RH]
// temp [°C]
{ const float C1=-4.0; // for 12 Bit
const float C2=+0.0405; // for 12 Bit
const float C3=-0.0000028; // for 12 Bit
const float T1=+0.01; // for 14 Bit @ 5V
const float T2=+0.00008; // for 14 Bit @ 5V
float rh,t,rh_lin,rh_true,t_C;
rh= *p_humidity;
t = *p_temperature;
t_C=t*0.01 - 40; //calc. temperature from ticks to [°C]
rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]
if(rh_true>100)rh_true=100; //cut if the value is outside of
if(rh_true<0.1)rh_true=0.1; //the physical possible range
*p_temperature=t_C; //return temperature [°C]
*p_humidity=rh_true; //return humidity[%RH]
}
//----------------------------------------------------------------------------------
void main()
//----------------------------------------------------------------------------------
// sample program that shows how to use SHT11 functions
// 1. connection reset
// 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)
// 3. calculate humidity [%RH] and temperature [°C]
// 4. calculate dew point [°C]
// 5. print temperature, humidity, dew point
{ value humi_val,temp_val;
unsigned char error,checksum;
OSCCON=0x71;
ADCON1 = 0;
TRISB=0;
PORTB=0;
TRISC=0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"H: ");
Lcd_Out(2,1,"T: ");
PIE1=0x20;
INTCON=0xC0;
s_connectionreset();
while(1)
{ error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature
if(error!=0) s_connectionreset(); //in case of an error: connection reset
else
{ humi_val.f=(float)humi_val.i; //converts integer to float
temp_val.f=(float)temp_val.i; //converts integer to float
//******HEAR IS THE PROBLEM""""""""""""
calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature
Write_LCD(1,4,humi_val.f);
Write_LCD(2,4,temp_val.f);
}
//----------wait approx. 0.8s to avoid heating up SHTxx------------------------------
delay_ms(800); //(be sure that the compiler doesn't eliminate this line!)
//-----------------------------------------------------------------------------------
}
}