meas_to_cel.c
来自「Source code for driving RFM01 fm radio r」· C语言 代码 · 共 60 行
C
60 行
#include "./ds18x20.h"
/*
convert raw value from DS18x20 to Celsius
input is:
- familycode fc (0x10/0x28 see header)
- scratchpad-buffer
output is:
- cel full celsius
- fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits)
- subzero =0 positiv / 1 negativ
always returns DS18X20_OK
TODO invalid-values detection (but should be covered by CRC)
*/
uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp,
uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits)
{
uint16_t meas;
uint8_t i;
meas = sp[0]; // LSB
meas |= ((uint16_t)sp[1])<<8; // MSB
//meas = 0xff5e; meas = 0xfe6f;
// only work on 12bit-base
if( fc == DS18S20_ID ) { // 9 -> 12 bit if 18S20
/* Extended measurements for DS18S20 contributed by Carsten Foss */
meas &= (uint16_t) 0xfffe; // Discard LSB , needed for later extended precicion calc
meas <<= 3; // Convert to 12-bit , now degrees are in 1/16 degrees units
meas += (16 - sp[6]) - 4; // Add the compensation , and remember to subtract 0.25 degree (4/16)
}
// check for negative
if ( meas & 0x8000 ) {
*subzero=1; // mark negative
meas ^= 0xffff; // convert to positive => (twos complement)++
meas++;
}
else *subzero=0;
// clear undefined bits for B != 12bit
if ( fc == DS18B20_ID ) { // check resolution 18B20
i = sp[DS18B20_CONF_REG];
if ( (i & DS18B20_12_BIT) == DS18B20_12_BIT ) ;
else if ( (i & DS18B20_11_BIT) == DS18B20_11_BIT )
meas &= ~(DS18B20_11_BIT_UNDF);
else if ( (i & DS18B20_10_BIT) == DS18B20_10_BIT )
meas &= ~(DS18B20_10_BIT_UNDF);
else { // if ( (i & DS18B20_9_BIT) == DS18B20_9_BIT ) {
meas &= ~(DS18B20_9_BIT_UNDF);
}
}
*cel = (uint8_t)(meas >> 4);
*cel_frac_bits = (uint8_t)(meas & 0x000F);
return DS18X20_OK;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?