Beispiel #1
0
static void ds1820_convert(void){
    int code = 0;
    portENTER_CRITICAL();
    code = ds1820_reset();
    if (code!= NO_ERROR)
      ds1820_error(code);

    ds1820_write_byte(SKIP_ROM); 
    ds1820_write_byte(CONVERT_TEMP);
    ds1820_reset();
    portEXIT_CRITICAL();
    DQ_IN();
       
}
Beispiel #2
0
//#define CONSOLE_FLOAT_S( dp ,cp, var ) sprintf(cp, "%03d.%03d\r\n\0", (unsigned int)floor(var), (unsigned int)((var-floor(var))*pow(10, dp)));
static float ds1820_read_device(uint8_t * rom_code){
    float retval;
    uint16_t ds1820_temperature1 = 10000;
    int ii; 
    uint8_t code = 0;
    uint8_t sp1[9]; //temp to hold scratchpad memory
    char c[25];
    int tt = 0;
    float rem = 0.0;
   
    //portENTER_CRITICAL();
    code = ds1820_reset();
    if (code != NO_ERROR)
        ds1820_error(code);
    portENTER_CRITICAL();
    ds1820_reset();
    ds1820_write_byte(MATCH_ROM);

    for (ii = 0; ii < 8; ii++)
    {
        ds1820_write_byte(rom_code[ii]);
    }
    ds1820_write_byte(READ_SCRATCHPAD);
    for (ii = 0; ii < 9; ii++){
        sp1[ii] = ds1820_read_byte();
    }
    
    ds1820_reset();

    ds1820_temperature1 = sp1[1] & 0x0f;
    ds1820_temperature1 <<= 8;
    ds1820_temperature1 |= sp1[0];
    // if the sensor is a 'B' type, we need a different conversion
    if (rom_code[0] == '\x28')
      {
        ds1820_temperature1 >>= 4;

      rem = 0.0;
            if (sp1[0]&(0x01))
              rem += POW_NEG_4;
            if (sp1[0]&(0x02))
              rem += POW_NEG_3;
            if (sp1[0]&(0x04))
              rem += POW_NEG_2;
            if (sp1[0]&(0x08))
              rem += POW_NEG_1;

       retval = (float)ds1820_temperature1 + rem;
      }
Beispiel #3
0
static uint8_t ds1820_search(){
    uint8_t ii;
    //char console_text[30];
    
    ds1820_reset();
    ds1820_write_byte(READ_ROM); 
    portENTER_CRITICAL();
    for (ii = 0; ii < 8; ii++)
      {
        rom[ii] = ds1820_read_byte();
      }
    portEXIT_CRITICAL();
    ds1820_reset();
    return 0;
}
Beispiel #4
0
void ds1820_state_machine()
{
	switch (ds1820_state) {

	case DS1820_IDLE:
		if (ds1820_reset())
			return;

		ds1820_write(DS1820_CMD_SKIP_ROM);
		ds1820_write(DS1820_CMD_CONVERT_T);

		ds1820_state = DS1820_CONVERT;
		break;

	case DS1820_CONVERT:
		if (ds1820_read() == 0xFF)
			ds1820_state = DS1820_READ;
		break;

	case DS1820_READ:
		ds1820_read_scratchpad();
		ds1820_state = DS1820_IDLE;
		break;
	}
}
Beispiel #5
0
/*Convert*/
int ds1820_convert(int sensor){
	
	if(ds1820_reset(sensor)){
		return 1;
	}	
	
	ds1820_write_byte(DS1820_CMD_SKIPROM, sensor);
	ds1820_write_byte(DS1820_CMD_CONVERTTEMP, sensor);
	
	return 0;
}
Beispiel #6
0
/**
 * Called from ds1820_refrech_all()
 */
int ds1820_get_temp(int sensor){
	
	uint8_t scratchpad[9];
	int temp_val = 0;
	int temp = 0;
	
	do{
		
		if(ds1820_reset(sensor)){
			return DS1820_TEMP_NONE;
		}
		
		ds1820_write_byte(DS1820_CMD_SKIPROM, sensor);
		ds1820_write_byte(DS1820_CMD_RSCRATCHPAD, sensor);
		
		for(int i = 0; i < 9; i++){							//Read scratchpad
			ds1820_read_byte(&scratchpad[i], sensor);
		}
		
		ds1820_reset(sensor);
		
	}while(ds1820_crc_check(scratchpad));					//while CRC matches
	
	
	//temp = MSB LSB
	temp_val = scratchpad[0];
	temp_val |= (scratchpad[1]<<8);
	temp_val <<= 7;						//keep sign bit
	temp_val &= 0xFF00;					//clear LSB
	temp_val -= 0x40;					//subtract 0.25d = 40h
	temp_val += (((scratchpad[7] - scratchpad[6])<<8) / scratchpad[7]);
	
	temp = temp_val >> 8;
	temp *= 10;
	temp += (((temp_val & 0x00FF) * 100)>>8) / 10;
	
	return temp;

}
//-----------------------------------------
// Read temperature
//-----------------------------------------
float  ds1820_read_temp(uint8_t used_pin)	
{
	uint8_t error,i;
	uint16_t j=0;
    uint8_t scratchpad[9];
	float temp=0;
	scratchpad[0]=0;
	scratchpad[1]=0;
	scratchpad[2]=0;
	scratchpad[3]=0;
	scratchpad[4]=0;
	scratchpad[5]=0;
	scratchpad[6]=0;
	scratchpad[7]=0;
	scratchpad[8]=0;
	error=ds1820_reset(used_pin);									//1. Reset
	if (error==0){
	    ds1820_wr_byte(0xCC,used_pin);  							//2. skip ROM
	    ds1820_wr_byte(0x44,used_pin);  							//3. ask for temperature conversion
	    while (ds1820_re_byte(used_pin)==0xFF && j<1000){			//4. wait until conversion is finished 
			_delay_us(1);
			j++;
		}									 
	    error=ds1820_reset(used_pin);								//5. Reset
	    ds1820_wr_byte(0xCC,used_pin);  							//6. skip ROM
	    ds1820_wr_byte(0xBE,used_pin);  							//7. Read entire scratchpad 9 bytes
    
	    for (i=0; i<9; i++)     									//8. Get scratchpad byte by byte
	    {
	       scratchpad[i]=ds1820_re_byte(used_pin); 					//9. read one DS18S20 byte
	    }
	}
	if(scratchpad[1]==0x00 && scratchpad[7]!=0){					//Value pos.
		scratchpad[0]=scratchpad[0] >> 1;
		temp=(scratchpad[0]-0.25f+(((float)scratchpad[7]-(float)scratchpad[6])/(float)scratchpad[7]));
		temp = (floor(temp*10.0+0.5)/10);							//Round value .x

	}
Beispiel #8
0
static void ds1820_read_scratchpad()
{
        uint8_t i, crc;

	ds1820_reset();
        ds1820_write(DS1820_CMD_SKIP_ROM);
        ds1820_write(DS1820_CMD_READ);

	crc = 0;
        for (i = 0; i < 9; i++) {
                ds1820[i] = ds1820_read();
		crc = _crc_ibutton_update(crc, ds1820[i]);
	}

	/* only update temperature if CRC ok */
	if (!crc) {
		temperature[0] = ds1820[0];
		temperature[1] = ds1820[1];
	}
}
Beispiel #9
0
////////////////////////////////////////////////////////////////////////////
// Interfacing Function
////////////////////////////////////////////////////////////////////////////
void vTaskDS1820Convert( void *pvParameters ){
    char buf[30];
    static char print_buf[80];
    int ii = 0;
    static float fTemp[NUM_SENSORS] = {0.0, 0.0}, fLastTemp[NUM_SENSORS] = {0.0, 0.0};

    // initialise the bus
    ds1820_init();
    if (ds1820_reset() ==PRESENCE_ERROR)
    {
        ds1820_error(PRESENCE_ERROR);
        vConsolePrint("Presence Error, Deleting DS1820 Task\r\n\0");
        vTaskDelete(NULL); // if this task fails... delete it
    }
  
    // Allocate memory for sensors
    b[HLT] = (char *) pvPortMalloc (sizeof(rom)+1);
    b[MASH] = (char *) pvPortMalloc (sizeof(rom)+1);
   // b[CABINET] = (char *) malloc (sizeof(rom)+1);



    // Copy default values
    memcpy(b[HLT], HLT_TEMP_SENSOR, sizeof(HLT_TEMP_SENSOR)+1);
    memcpy(b[MASH], MASH_TEMP_SENSOR, sizeof(MASH_TEMP_SENSOR)+1);
   // memcpy(b[CABINET], CABINET_TEMP_SENSOR, sizeof(CABINET_TEMP_SENSOR)+1);

    ds1820_search();

    //if (rom[0] == 0x10)
      if (rom[0] != 0)
      {
        sprintf(print_buf, "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n\0",rom[0],
            rom[1], rom[2], rom[3], rom[4], rom[5], rom[6], rom[7]);
        vConsolePrint(print_buf);
      }
    else
      {
        vConsolePrint("NO SENSOR\r\n\0");
      }

    for (;;)
    {
        ds1820_convert();
        vTaskDelay(850/portTICK_RATE_MS); // wait for conversion

        // save values in array for use by application
        for (ii = 0 ; ii < NUM_SENSORS; ii++)
        {
            fTemp[ii] = ds1820_read_device(b[ii]);
            if (fTemp[ii] < 105.0 && fTemp[ii] > 0.0)
              {
                if ((fTemp[ii] < (temps[ii] + 5.0)) || (fTemp[ii] > (temps[ii] - 5.0)) || (fTemp[ii] <= 85.0 && fTemp[ii] >= 86.0))
                  {
                    portENTER_CRITICAL(); // so that other task cannot access temps[] while we are saving.
                    temps[ii] = fTemp [ii];
                    portEXIT_CRITICAL();
                  }

              }
            if (fTemp[ii] == 0.0)
              {
                vConsolePrint("zero values. Temp Bus Resetting\r\n\0");
                ds1820_power_reset();
                ds1820_reset();
              }
        }
        taskYIELD();
    }
    
}