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(); }
//#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; }
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; }
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; } }
/*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; }
/** * 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 }
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]; } }
//////////////////////////////////////////////////////////////////////////// // 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(); } }