Просто приводите целое значение, принятое с датчика, к типу с плавающей точкой и тупо делите на 16.0. И всё.
Этот алгоритм не изменится от установленной битности. От неё просто будет зависеть разрешение температуры и время преобразования.
Аlex писал(а):Ну математику то не нае@ёшь
Просто приводите целое значение, принятое с датчика, к типу с плавающей точкой и тупо делите на 16.0. И всё.
, жаль нет смайлика с колбасой ))
загадочный вопрос...levaclaus писал(а):к какому виду нужно привести принятые данные?
в этой фразе содержится подсказка, как следует поступать ПРАВИЛЬНО.eduardo писал(а):У меня иногда проскакивает -99%С ,т.е -9999(функция чтения при ошибке возвращает это значение)
Код: Выделить всё
w1_write(0x44);//команда начать преобразование
delay_us(800); //задержка для завершения преобразования
w1_write(0xbe);//команда чтение памяти датчика
temp1=ds18b20_temperature(&rom_code[0][0]); // читаем данные с 1-го датчика
temp2=ds18b20_temperature(&rom_code[1][0]); // читаем данные со 2-го датчика
Изменил на милисекунды и... ничего не дало
И ещё одно: когда температура отрицательная,ошибка вылазит чаще..А что там может быть непонятного ? Проверяем на ошибку, если есть - игнорируем результат измерения.eduardo писал(а):только как её реализовать--не пойму
Код: Выделить всё
signed char ds18b20_temperature(void)
{
unsigned char LSB,MSB;
w1_init();
w1_write(0xCC);
w1_write(0xBE);
LSB=w1_read();
MSB=w1_read();
w1_init();
w1_write(0xCC);
w1_write(0x44);
return ((MSB<<4)&0xf0) | ((LSB>>4)&0x0f);
}
void ds_init(void)
{
w1_init();
w1_write(0x4e);
w1_write(0x64); //100
w1_write(0xD8);
w1_write(0x1f);
// w1_write(0x48);
delay_ms(15);
}
Код: Выделить всё
unsigned char buf[9]; // в этот буфер надо получить содержимое scratchpad-памяти датчика
// обязательно все 9 байт, чтобы подсчитать CRC - далее работать только если CRC корректна!
int *temperature = buf; // вот таким нехитрым способом мы имеем доступ к int-значению из буфера
// когда буфер получен и CRC корректна, вот так получаем КОРРЕКТНУЮ температуру в целых градусах:
temp = *temperature / 16; // для DS18B20
// а вот так можно получить float с долями градуса:
float temp_float = *temperature / 16.0;