Dallas' DS1820 family temperature sensor. For more details see [https://developer.mbed.org/users/hudakz/code/DS1820/wiki/Homepage]
Dependencies: OneWire
Diff: DS1820.cpp
- Revision:
- 4:adf4e7972d73
- Parent:
- 3:a250babd0a9f
- Child:
- 6:518950e436be
--- a/DS1820.cpp Thu Mar 19 19:11:12 2015 +0000 +++ b/DS1820.cpp Fri Mar 20 10:07:22 2015 +0000 @@ -135,6 +135,39 @@ } /** + * @brief Sets temperature-to-digital conversion resolution + * @note The configuration register allows the user to set the resolution + * of the temperature-to-digital conversion to 9, 10, 11, or 12 bits + * Defaults to 12bit resolution for DS18B20. + * DS18S20 allows only 9bit resolution. + * @param res: Resolution of the temperature-to-digital conversion in bits + * @retval + */ +void DS1820::setResolution(uint8_t res) { + // keep resolution within limits + if(res > 12) + res = 12; + if(res < 9) + res = 9; + if(type_s) + res = 9; + + oneWire.reset(); + oneWire.skip(); + oneWire.write(0xBE); // to read Scratchpad + for(uint8_t i = 0; i < 9; i++) // read Scratchpad bytes + data[i] = oneWire.read(); + + data[4] |= (res - 9) << 5; // update configuration byte (set resolution) + oneWire.reset(); + oneWire.skip(); + oneWire.write(0x4E); // to write into Scratchpad + for(uint8_t i = 2; i < 5; i++) // write three bytes (2nd, 3rd, 4th) into Scratchpad + oneWire.write(data[i]); +} + + +/** * @brief Starts temperature conversion * @note The time to complete the converion depends on the selected resolusion * @param @@ -162,43 +195,46 @@ for(uint8_t i = 0; i < 9; i++) data[i] = oneWire.read(); - // Convert the raw bytes to a 16bit signed fixed point value : - // 1 sign bit, 7 integer bits, 8 fractional bits (two’s compliment - // ie. the LSB of the 16bit binary number represents 1/256th of a unit). - // Finally the 16bit signed fixed point value is converted - // to floating point value by calling the toFloat(value) function. - + // Convert the raw bytes to a 16bit unsigned value uint16_t* p_word = reinterpret_cast < uint16_t * > (&data[0]); #if DEBUG serial.printf("raw = %#x\r\n", *p_word); #endif - if(type_s) { - *p_word = *p_word << 3; // default 9 bit resolution + *p_word = *p_word << 3; // 9 bit resolution, max conversion time = 750ms if(data[7] == 0x10) { // "count remain" gives full 12 bit resolution *p_word = (*p_word & 0xFFF0) + 12 - data[6]; } + // Convert the raw bytes to a 16bit signed fixed point value : + // 1 sign bit, 7 integer bits, 8 fractional bits (two’s compliment + // and the LSB of the 16bit binary number represents 1/256th of a unit). *p_word = *p_word << 4; + // Convert to floating point value return(toFloat(*p_word)); } else { - uint8_t cfg = (data[4] & 0x60); - // at lower res, the low bits are undefined, so let's zero them - + uint8_t cfg = (data[4] & 0x60); // default 12bit resolution, max conversion time = 750ms + + // at lower resolution, the low bits are undefined, so let's clear them if(cfg == 0x00) - *p_word = *p_word &~7; // 9 bit resolution, 93.75 ms + *p_word = *p_word &~7; // 9bit resolution, max conversion time = 93.75ms else if(cfg == 0x20) - *p_word = *p_word &~3; // 10 bit res, 187.5 ms + *p_word = *p_word &~3; // 10bit resolution, max conversion time = 187.5ms else if(cfg == 0x40) - *p_word = *p_word &~1; // 11 bit res, 375 ms - *p_word = *p_word << 4; // default is 12 bit resolution + *p_word = *p_word &~1; // 11bit resolution, max conversion time = 375ms + + // Convert the raw bytes to a 16bit signed fixed point value : + // 1 sign bit, 7 integer bits, 8 fractional bits (two’s compliment + // and the LSB of the 16bit binary number represents 1/256th of a unit). + *p_word = *p_word << 4; + // Convert to floating point value return(toFloat(*p_word)); } } @@ -210,11 +246,10 @@ * @brief Converts a 16bit signed fixed point value to floating point value * @note The 16bit unsigned integer represnts actually * a 16bit signed fixed point value: - * 1 sign bit, 7 integer bits, 8 fractional bits - * (two’s compliment ie. the LSB of the 16bit binary number - * represents 1/256th of a unit). + * 1 sign bit, 7 integer bits, 8 fractional bits (two’s compliment + * and the LSB of the 16bit binary number represents 1/256th of a unit). * @param 16bit unsigned integer - * @retval Floating point temperature value + * @retval Floating point value */ float DS1820::toFloat(uint16_t word) { if(word & 0x8000)