Например TDA7294

Форум РадиоКот • Просмотр темы - DS18b20 мороз с разрешением 0,1 градуса
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт дек 26, 2025 03:56:45

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Вт дек 23, 2025 18:49:52 
Это не хвост, это антенна
Аватар пользователя

Карма: 12
Рейтинг сообщений: 77
Зарегистрирован: Вт мар 28, 2023 21:17:15
Сообщений: 1478
Откуда: Universe
Рейтинг сообщения: 0
Возник вопрос по сабжу (решил быстренько слепить термометр на 7-сегментном индикаторе). Если с целыми положительными температурами вопросов не возникло (сдвинул результат преобразования на 4 бита вправо) и получил градусы.
То с отрицательными появились непонятки.
Обычно на форумах вижу преобразование из отрицательных значений через побитовую инверсию с добавлением единицы к результату. Вроде как работает в протеусе, хотя при некоторых значениях получается на 1 больше почему то.
Но главная непоянтка с долями градуса.

ИИ в гугле советует сделать всё просто:

int16_t raw_temp = (raw_data_byte2 << 8 ) | raw_data_byte1; // Combine bytes
float temp_C = (float)raw_temp / 16.0; // For 12-bit (0.0625)

Получаем результат с плавающей точкой. Но мне не хотелось бы к плавучке приходить из за сложностей потом на разряды индикатора её выдёргивать.

А инверсия побитовая с добавлением единицы у меня почему то даёт не тот результат..

Как правильно тот скратчпад 16 бит преобразовать из отрицательных температур?

:?

_________________
I have a dream...¯\_(ツ)_/¯


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Вт дек 23, 2025 19:57:00 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 26
Зарегистрирован: Ср мар 09, 2016 08:07:41
Сообщений: 301
Рейтинг сообщения: 0
Код:
                  uint16_t temp=ds18b20_read();
                  uint16_t frac= ((temp & (uint16_t)0x0f)*10)/16;
                  temp >>= 4;

frac - дробная часть, tmp - целая часть, для отрицательных температур очищайте знаковые старшие биты.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Вт дек 23, 2025 20:29:44 
Друг Кота
Аватар пользователя

Карма: 197
Рейтинг сообщений: 8594
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Сообщений: 43142
Откуда: Нерезиновая
Рейтинг сообщения: 0
:dont_know:
Лет 15 назад я делал термометр на Tiny2313 и DS18B20-
СпойлерИзображение
Вложение:
Схема термометра.PNG [34.82 KiB]
Скачиваний: 241

Нормально он минус показывает.. :dont_know:
Изображение

СпойлерМодель в протеусе сделана на AT90S2313, "в железе" работает на Tiny2313.
Прошивка позволяет работать с одним и двумя термодатчиками.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 00:09:22 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1494
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15327
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Под ассемблером там проблем нет.
Вроде и под Си ардуиняче чего то было...
:?


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 04:05:39 
Друг Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 889
Зарегистрирован: Пт сен 10, 2021 15:19:36
Сообщений: 6149
Откуда: Протвино
Рейтинг сообщения: 0
а там вроде старший байт заполнен раскопированным битом знака обзовем 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 переменные (регистра) нужны,
остальные для наглядности исключительно..


не проверял, если накосячил скандачка спросони :dont_know: ... вобщем настоящий кот поленится пинать :)


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 06:22:13 
Друг Кота

Карма: 64
Рейтинг сообщений: 1022
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4371
Откуда: Ижевск
Рейтинг сообщения: 0
Как вариант. Проверяется принятый результат, знак запоминается. Если отрицательный, конвертируется. Умножается на 10 и сдвигом делится на 16. К полученному результату прибавляется значение флага C для правильного округления.
Спойлер
Код:
; Считанные данные находятся в R11:R12
; ZH=0
LCD_CONVERT:
   CBI   ACSR,MINUS   ; очистить признак минусового результата
   
   CLR   R10
   
   TST   R11
   BRPL   GO_PLUS
   COM   R11
   COM   R12
      
   ADC   R12,ZH
   ADC   R11,ZH
   SBI   ACSR,MINUS   ; установить признак минусового результата
GO_PLUS:
   RCALL   MULT10
;R10,R11,R12 результат старший-младший
   LSR   R10
   ROR   R11
   ROR   R12

   LSR   R10
   ROR   R11
   ROR   R12

   LSR   R10
   ROR   R11
   ROR   R12

   LSR   R10
   ROR   R11
   ROR   R12
; разделить полученное значение на 16, чтобы
; получить десятичный эквивалент результата
   ADC   R12,ZH
   ADC   R11,ZH
   ADC   R10,ZH      ; округление результата

   RCALL   KALK1
   RET   
;************************************************


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 10:31:01 
Это не хвост, это антенна
Аватар пользователя

Карма: 12
Рейтинг сообщений: 77
Зарегистрирован: Вт мар 28, 2023 21:17:15
Сообщений: 1478
Откуда: Universe
Рейтинг сообщения: 0
Короче, психонул и решил начать с ..протеуса. Думаю, а вдруг это он мне мозг выносит?
Решил выплёвывать в терминал получаемые два байта скратчпада температуры.

Изображение

24,6 - 0x0188
24,5 - 0x0188
24,4 - 0x0180
24,3 - 0x0180
24,2 - 0x0180
24,1 - 0x0180
24,0 - 0x0180

Код:
      write_byte(0xCC);            //skip ROM
      write_byte(0xBE);            //read scratch
      Tmp1 = read_byte();
      Tmp2 = read_byte();
      putc(0xAA);
      putc(0xAA);
      putc(Tmp2);
      putc(Tmp1);
      putc(0xCC);


Короче, выходит моделька DS18b20 дробную часть как то странно выдаёт. :shock:

_________________
I have a dream...¯\_(ツ)_/¯


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 10:47:20 
Грызет канифоль
Аватар пользователя

Карма: 1
Рейтинг сообщений: 18
Зарегистрирован: Пн сен 15, 2025 08:43:23
Сообщений: 283
Рейтинг сообщения: 0
У него ж точность ±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.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 11:08:36 
Друг Кота

Карма: -1
Рейтинг сообщений: 86
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8887
Откуда: .ru
Рейтинг сообщения: 0
а в чём собственно вопрос ?
для начала как обычно смотрим даташит...

Изображение

видим что при отрицательных температурах получаем отрицательное число (единица в первом разряде).

а далее всё как обычно... работа со знаковыми переменными...

//DEC -0...-2.147.483.648 | 0...2.147.483.647
//HEX -80 00 00 00...ff ff ff ff | 0...7f.ff.ff.ff


Вложения:
Screenshot_1.jpg [56.76 KiB]
Скачиваний: 120
Вернуться наверх
 
В сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 11:16:14 
Говорящий с текстолитом

Карма: 11
Рейтинг сообщений: 94
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1669
Откуда: поселок Мелеуз
Рейтинг сообщения: 0
выходит моделька DS18b20 дробную часть как то странно выдаёт. :shock:

Проверил у себя,шаг в свойствах DS18B20 поставил 0,0625,работает норм,вот снижал от 24,5 до 23,9 с шагом 0,0625

Изображение
А здесь снижаю с -0,0625 до -0,625
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 11:33:20 
Это не хвост, это антенна
Аватар пользователя

Карма: 12
Рейтинг сообщений: 77
Зарегистрирован: Вт мар 28, 2023 21:17:15
Сообщений: 1478
Откуда: Universe
Рейтинг сообщения: 0
Продолбался с протеусом (v9), плюнул, стал из даташита ту таблицу тупо в программе подсовывать вместо полученного с датчика значения - получил заданные значения.
Стало быть моделька в протеусе врёт. :cry:
На опцию "granularity" в настойках модель не реагирует - выдаёт сильно грубый шаг.

_________________
I have a dream...¯\_(ツ)_/¯


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 11:56:48 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1494
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15327
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Первое действие
temp=(~temp)+1
разделяем старшую часть и младшие 4 бита (включено 12 разрядное преобразование)
temp_h = temp >> 4
temp_l = temp & 0x000f
далее декодирование целой части в код сегментов целых
Записать коды сегментов "минус" и "запятая" в соответствующие знакоместа дисплея
Получить значение дробной части в целых числах исходя из веса разрядов в ранее выделенной младшей тетраде данных
бит 3 = 5000
бит 2 = 2500
бит 1 = 1250
бит 0 = 625
далее обработать получившийся результат для вывода в раздел индикатора, выделенный для дробной части.
Воть как то так ...
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 12:16:31 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4596
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Блин, вы серьёзно ?
Если на Сях, то всё очень просто. Тупо берём и считываем с датчика 2 байта в знаковую переменную. И всё, получаем температуру с необходимым разрешением и знаком.
Для перевода в градусы, просто делим значение на 16 (для "B", разрешение 0.0625) или на 2 (для "S", разрешение 0.5).
Всё.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 12:34:42 
Это не хвост, это антенна
Аватар пользователя

Карма: 12
Рейтинг сообщений: 77
Зарегистрирован: Вт мар 28, 2023 21:17:15
Сообщений: 1478
Откуда: Universe
Рейтинг сообщения: 0
Для перевода в градусы, просто делим значение на 16 (для "B", разрешение 0.0625) или на 2 (для "S", разрешение 0.5).
Всё.


Беда такого деления в плавучем результате. Если куда printf() плевать оно конечно само разгребет, но если ручками на 7-сегментный индикатор раскладывать, тут тут геморно с флоат воевать :?

_________________
I have a dream...¯\_(ツ)_/¯


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 12:37:19 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1494
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15327
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Алгоритм со времён ассемблера однако.
Где там быстро математику сделать?
Заодно и в сегментный код перекинуть проще.
8)


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: DS18b20 мороз с разрешением 0,1 градуса
СообщениеДобавлено: Ср дек 24, 2025 12:45:56 
Говорящий с текстолитом

Карма: 11
Рейтинг сообщений: 94
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1669
Откуда: поселок Мелеуз
Рейтинг сообщения: 0
Вот в баском,переменные только Т=два байта,остальные один байт,проверил в протеусе.
Код:
Byte0 = 1wread()           ' Читаем нулевой байт
Byte1 = 1wread()           ' Читаем первый байт
Print  HEX(Byte1);HEX(Byte0)
If Byte1 > 248 Then        ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Byte0 = 1+ Byte0
Sign = "-"
End If
T = Byte1*16            ' Сдвигаем  первый байт вправо на 4 бита (2*2*2*2=16)
T1 = Byte0/16           ' Сдвигаем нулевой байт влево на 4 бита (2*2*2*2=16)
t1=t1+t                    'Целая часть
t=Byte0 And 15          'дробная часть
t=10*t                  'умножаем на 10 и делим на 16
t=t/16
print t1;".";t


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y