Возник вопрос по сабжу (решил быстренько слепить термометр на 7-сегментном индикаторе). Если с целыми положительными температурами вопросов не возникло (сдвинул результат преобразования на 4 бита вправо) и получил градусы. То с отрицательными появились непонятки. Обычно на форумах вижу преобразование из отрицательных значений через побитовую инверсию с добавлением единицы к результату. Вроде как работает в протеусе, хотя при некоторых значениях получается на 1 больше почему то. Но главная непоянтка с долями градуса.
а там вроде старший байт заполнен раскопированным битом знака обзовем unsigned char h_raw а младший байт (unsigned char l_raw) это само значение signed c младшим битом ценой в 0.5C по сути это означает что если загрузить это в signed int16 и разделить на 2 то знак будет знаком, а модуль будет модулем. а младший выдвинутый бит если задвинуть с младшей стороны в char и умножить на 5 - дробной частью.
а если хотим модуль на коленке без abs() и прочей высшей математики , а с простейшей аля asm, то примерно так думаю сойдет:
Код:
unsigned char h_raw, l_raw, sign, tempmodule,tempdecimals; sign=h_raw & 01 ; // 0 -> +C 1 -> -C tempdecimals=(l_raw & 01)* 5 ; // xxx.0C or xxx.5C if(sign) l_raw= 0xFF - l_raw ; //below zero C. so, negative to absolute value conversion tempmodule=l_raw >> 1 ; //integer part С
ну понятно что там всего 2 или 3 переменные (регистра) нужны, остальные для наглядности исключительно..
не проверял, если накосячил скандачка спросони ... вобщем настоящий кот поленится пинать
Как вариант. Проверяется принятый результат, знак запоминается. Если отрицательный, конвертируется. Умножается на 10 и сдвигом делится на 16. К полученному результату прибавляется значение флага C для правильного округления. Спойлер
Код:
; Считанные данные находятся в R11:R12 ; ZH=0 LCD_CONVERT: CBI ACSR,MINUS ; очистить признак минусового результата
Короче, психонул и решил начать с ..протеуса. Думаю, а вдруг это он мне мозг выносит? Решил выплёвывать в терминал получаемые два байта скратчпада температуры.
У него ж точность ±1.5℃ в расширенном диапазоне температур, а воспроизводимость ±0.5℃. Зачем вообще пытаться из этого УГ пытаться получить температуру? Возьмите уж NTC…
Добавлено after 1 minute 27 seconds: Mursik, а это точно B, а не S?
_________________ Windows must die! And the users of this crap should either become smarter or become janitors.
Продолбался с протеусом (v9), плюнул, стал из даташита ту таблицу тупо в программе подсовывать вместо полученного с датчика значения - получил заданные значения. Стало быть моделька в протеусе врёт. На опцию "granularity" в настойках модель не реагирует - выдаёт сильно грубый шаг.
Первое действие temp=(~temp)+1 разделяем старшую часть и младшие 4 бита (включено 12 разрядное преобразование) temp_h = temp >> 4 temp_l = temp & 0x000f далее декодирование целой части в код сегментов целых Записать коды сегментов "минус" и "запятая" в соответствующие знакоместа дисплея Получить значение дробной части в целых числах исходя из веса разрядов в ранее выделенной младшей тетраде данных бит 3 = 5000 бит 2 = 2500 бит 1 = 1250 бит 0 = 625 далее обработать получившийся результат для вывода в раздел индикатора, выделенный для дробной части. Воть как то так ...
Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
Добавлено: Ср дек 24, 2025 12:16:31
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4596 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Блин, вы серьёзно ? Если на Сях, то всё очень просто. Тупо берём и считываем с датчика 2 байта в знаковую переменную. И всё, получаем температуру с необходимым разрешением и знаком. Для перевода в градусы, просто делим значение на 16 (для "B", разрешение 0.0625) или на 2 (для "S", разрешение 0.5). Всё.
Для перевода в градусы, просто делим значение на 16 (для "B", разрешение 0.0625) или на 2 (для "S", разрешение 0.5). Всё.
Беда такого деления в плавучем результате. Если куда printf() плевать оно конечно само разгребет, но если ручками на 7-сегментный индикатор раскладывать, тут тут геморно с флоат воевать
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения