pirat777knj писал(а):
Не работает. Пробовал. Компилятор начинает ругаться на отсутствие скобки!
Какой и откуда!?
Ошибки тут нет. Что за компилятор?
Попробуй: "tmp = ~(tmp) + 1;". Или вообще в две строчки:
Код:
tmp = ~tmp;
tmp += 1;
Если ругнется, то в скобки:
Код:
tmp = ~(tmp);
tmp += 1;
pirat777knj писал(а):
Плюс у меня не lcd и функции вывода на него ничем не помогут. Увы и ах. На нем то давно б сделал.
Ну так пример дан не ради вывода на lcd, а для алгоритма преобразования данных. Ведь легко читаемый код, например как получили знак температуры:
Код:
if ((scratchpad[1]&128) == 0){ //проверяем старший разряд
LCD_WriteData('+');
}
else{
LCD_WriteData('-');
…..
}
Просто замени "LCD_WriteData('-');" на свою реализацию вывода информации. Ведь ты будешь как-то различать отриц. температуры?
pirat777knj писал(а):
Основное непонятное: значение доброй части равно 0,0625 на 1 единицу. Отсюда нужно округлять до десятых и откидывать остаток. Потом эти дело записывать в переменную к целому значению. А вот как тогда это сделать?
Так в той ссылке все сказано
Цитата:
//выделяем с помощью битовой маски дробную часть
temperature = (scratchpad[0]&15);
//преобразуем в целое число
temperature = (temperature<<1) + (temperature<<3);// Умножаем на 10
temperature = (temperature>>4);//делим на 16 или умножаем на 0.0625
Вот это: "temperature = (scratchpad[0]&15);" оставит данные дробной части (4 бита).
Дальше идет умножение на 10 и деление на 16. В temperature будет двоичное представление дробной части температуры, причем в целом виде. Открой пдф на DS18B20, посмотри например значение 0.5 град. "+0.5°C 0000 0000 0000 1000", что в Hex будет "0008h". Умножь это на 10 и раздели на 16 = 5.
5 - это дробная часть температуры в целом виде (домноженное на 10).
Не понимаю в чем проблема