示例#1
0
文件: shtxx.c 项目: vdbriel/netnode
//----------------------------------------------------------------------------------
char sht_read_statusreg(void)
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
{ 
  unsigned char error=0;
  unsigned char tmp = 0;
  unsigned char bits = 8;
  sht_crc_init();
  sht_transstart();                   //transmission start
  error=sht_write_byte(STATUS_REG_R); //send command to sensor
  sht_crc_shuffle_byte(STATUS_REG_R);
  StatusReg =sht_read_byte(ACK);      //read status register (8-bit)
  sht_crc_shuffle_byte(StatusReg);
  CheckSum  =sht_read_byte(noACK);    //read checksum (8-bit)
  while( bits--)
  {
	tmp >>=1;
	if( sht_crc & 0b10000000)
		tmp |= 0b10000000;
	sht_crc <<=1;
  }

  if (tmp != CheckSum) {
      SHTdevice_table[CurrentSensorIndex].crc++;
      error++;
  }

  return error;                     //error=1 in case of no response form the sensor
}
示例#2
0
//----------------------------------------------------------------------------------
unsigned char sht_measure(sht_value *p_sht_value, unsigned char *p_checksum, unsigned char mode, unsigned char pin)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
	unsigned char error=0;
	unsigned char i;

	sht_value this_sht_value;
	/* sht_transstart(pin); //transmission start */
	sht_connectionreset(pin);
	switch(mode)
	{ //send command to sensor
		case TEMP : error+=sht_write_byte(MEASURE_TEMP, pin); /*usart_write("TEMP: ");*/ break;
		case HUMI : error+=sht_write_byte(MEASURE_HUMI, pin); /*usart_write("HUMI: ");*/ break;
		default : break;
	}

	for (i=0;i<500;i++) {
		if(SHT_DATA(pin)==0) break; //wait until sensor has finished the measurement
		_delay_ms(1);  	// neccesary since the AVR is so much faster than the old 8051
							// and the 210ms for 14bit measuremnt are only a rough estimate
	}

	if(SHT_DATA(pin)) error+=1; // or timeout is reached 

	this_sht_value.i = 256*sht_read_byte(ACK, pin); //read the first byte (MSB)
	this_sht_value.i +=sht_read_byte(ACK, pin); //read the second byte (LSB)
		
	*p_checksum =sht_read_byte(noACK, pin); //read checksum
	*(p_sht_value)= this_sht_value;
	return error;
}
示例#3
0
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
//----------------------------------------------------------------------------------
char sht_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
{
  unsigned char error=0;
  sht_transstart();                   //transmission start
  error=sht_write_byte(STATUS_REG_R); //send command to sensor
  *p_value=sht_read_byte(ACK);        //read status register (8-bit)
  *p_checksum=sht_read_byte(noACK);   //read checksum (8-bit)
  return error;                     //error=1 in case of no response form the sensor
}
示例#4
0
文件: shtxx.c 项目: vdbriel/netnode
//----------------------------------------------------------------------------------
char sht_measure(unsigned char mode)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{ 
  unsigned error=0;
  unsigned int i;
  unsigned char LSB;
  unsigned char MSB;
  unsigned char tmp = 0;
  unsigned char bits = 8;

  sht_crc_init();
  sht_transstart();                   //transmission start
  switch(mode){                     //send command to sensor
    case TEMP	: error+=sht_write_byte(MEASURE_TEMP); sht_crc_shuffle_byte(MEASURE_TEMP);break;
    case HUMI	: error+=sht_write_byte(MEASURE_HUMI); sht_crc_shuffle_byte(MEASURE_HUMI);break;
    default     : break;	 
  }
  for (i=0;i<40000;i++) {
  	if(DATA_IN==0) {
            break; //wait until sensor has finished the measurement
        }
	Delay100TCYx(4);      //50 us
  }
  
  if(DATA_IN)
  {
      error+=1;                // or timeout (~2 sec.) is reached
  }
  MSB  = sht_read_byte(ACK);    //read the first byte (MSB)
  sht_crc_shuffle_byte(MSB);
  LSB  = sht_read_byte(ACK);    //read the second byte (LSB)
  sht_crc_shuffle_byte(LSB);
  CurrentValue = MSB * 256 + LSB;
  CheckSum = sht_read_byte(noACK);  //read checksum

  	while( bits--)
	{
		tmp >>=1;
		if( sht_crc & 0b10000000)
			tmp |= 0b10000000;
		sht_crc <<=1;
	}

  if (tmp != CheckSum) {
      SHTdevice_table[CurrentSensorIndex].crc++;
      return 1;
  }
  return error;
  
}
示例#5
0
char sht_measure( unsigned char *p_value, unsigned char *p_checksum, unsigned char mode )
{ 
 	unsigned error=0;
  	unsigned long i;

  	sht_transstart();                  	// transmission start

  	switch( mode ) {                    // send command to sensor

    	case SHT_MODE_TEMP: 
			error += sht_write_byte( MEASURE_TEMP ); 
			break;

    	case SHT_MODE_HUMI: 
			error += sht_write_byte( MEASURE_HUMI ); 
			break;

    	default: 
			break;	 
  	}

	// wait until sensor has finished the measurement
	sht_measure_timer = 0;
	while ( sht_measure_timer < SHT_READ_TIMEOUT ) {
		if ( 0 == ( PORTCbits.RC5 ) ) {
			break; 
		}		
	}

  	if ( PORTCbits.RC5 ) {       		// or timeout (~2 sec.) is reached
		error += 1; 
	}

  	*(p_value)  = sht_read_byte( ACK );  	// read the first byte (MSB)
  	*(p_value+1)= sht_read_byte( ACK );  	// read the second byte (LSB)
  	*p_checksum = sht_read_byte( noACK );	// read checksum

  	return error;
}
示例#6
0
//----------------------------------------------------------------------------------
// read measurement
//----------------------------------------------------------------------------------
void sht_measure_read(unsigned char *p_value, unsigned char *p_checksum)
{
	*(p_value+1) = sht_read_byte(ACK); 	// read the first byte (MSB)
	*(p_value) 	 = sht_read_byte(ACK); 	// read the second byte (LSB)
	*p_checksum  = sht_read_byte(noACK); // read checksum
}