Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Модератор форума: demanik, ivan_fd  
DS18B20 проблемы... Наверно туплю...
Володимир Дата: Пт, 31.01.2014, 23:19  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Подскажите по какому алгоритму вычесляется дробная часть для отричательный температур, для плюсовых все понятно, младшие четыре бита умножаем на 0.0625, а как быть с отрицательными температурами, изучая таблицу номер два этой мурзилки http://www.e-voron.dp.ua/files/pdf/maxim/ds18b20-rus.pdf не могу понять логику.
brown Дата: Пт, 31.01.2014, 23:38  |                                                                                                                Сообщение # 17
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Если с округлением до десятой, то я делаю так:
If (R_Temp & $000f)=0 Then
Flo =0
Else
Flo = (~R_Temp.LowByte & $0f)+1    '
EndIf
Flo = LookUpL Flo, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9]


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
Сообщение отредактировал brown - Пт, 31.01.2014, 23:56
mikhail09p Дата: Сб, 01.02.2014, 01:12  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Для доцент2: на работе имеется поверенный термометр с точностью 0,1 - проверял 5 датчиков - все показывали +- 0,2 градуса. С одной партии.
Было 15 штук - но надоело мерить и мне точности 0,5 градуса достаточно. Измерял температуру воздуха в пределах, если не изменяет память, где-то 19 - 70 градусов.
Володимир Дата: Сб, 01.02.2014, 18:05  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Цитата brown ()
Если с округлением до десятой, то я делаю так:
А, дошло, нужно инвертировать четыре младшие бита добавить еденицу и умножить на 0.0625, только не вижу логики разрабодчиков датчка, зачем добавлять еденицу, если можно просто обойтись простым инвертированием.
anatol Дата: Сб, 01.02.2014, 19:32  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Володимир, разработчики действовали строго по инструкции smile
Если серьезно - посмотрите формы представления двоичных чисел, в том числе десятичные дроби.
И, вообще, есть такая штука - Булева алгебра.
А теперь сноски
http://ru.wikipedia.org/wiki/Булева_алгебра
http://ru.wikipedia.org/wiki/Двоичная_система_счисления
http://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)
Володимир Дата: Сб, 01.02.2014, 19:46  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 69
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Цитата anatol ()
Володимир, разработчики действовали строго по инструкции smileЕсли серьезно - посмотрите формы представления двоичных чисел, в том числе десятичные дроби.
И, вообще, есть такая штука - Булева алгебра.
А теперь сноски
http://ru.wikipedia.org/wiki/Булева_алгебра
http://ru.wikipedia.org/wiki/Двоичная_система_счисления
http://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)
Теперь все понятно, просто никогда не задавался вопросом как числа с плавающей точкой записываються в двоичном коде. Спасибо за подсказку.
ЯНДЕКС Дата: 01.02.2014
ibragimnk Дата: Чт, 28.05.2015, 14:08  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 26.03.2012

Статус: Offline

Подскажите пожалуйста, взялся за разработку проекта, не столько ради самого проекта, а сколько ради обучения. Основу программы взял отсюда http://www.picbasic.ru/forum/5-528-1  автор mikhail09p (инкубатор 9902502) Попытался переделать под свой проект, вроде опрос датчика не трогал, однако температуру не выводит. На второй индикатор пока внимания обращать не надо, это я попытался сделать универсальную программу под анод-катодные индикаторы переключением перемычки сс. С этим я еще буду разбираться. А вот почему не идет температура никак не могу "въехать". Проект в архиве.
Прикрепления: Thermo783A.rar (92.6 Kb)
Matrix252005 Дата: Чт, 28.05.2015, 14:33  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

ibragimnk, во-первых, в самом протеусе, установите частоту, на которой работает Ваш МК (в протеусе по умолчанию 1МГц !!!!)
Во-вторых, сильно не вникал в код, но заремил кое что (исходный код от Михаила не смотрел!!!)

If Sec >= 300 Then              ' если счётчик равен или больше 300 то
Sec = 0                         ' обнулить счётчик и считать значение температуры с датчика
OWrite DQ, 1, [$CC,$44]  ' Послать датчику DS18B20 команду старта измерения температуры  
'    Repeat               ' Начать внутренний цикл
'    GoSub DisplayTime    ' Ждать окончания преобразования пока не придет бит,
                         ' показать текущую температуру
'    ORead DQ, 4,     ' сигнализирующий об окончании преобразования  
'    Until c > 0          ' Выйти из цикла если от DS18B20 поступил бит конца преобразования.  
    OWrite DQ, 1, [$CC,$BE]  ' Послать команду чтения из ОЗУ датчика DS18B20 значения температуры  
    ORead DQ, 2, [Temp_read.LowByte, Temp_read.HighByte]  ' Прочитать значение температуры и записать 
'    GoSub DisplayTime    ' показать текущую температуру
        
    '-----------------------------Процедура преобразования температуры ----------------------------
остальное по тексту...
Заремил еще и эту строку:
'Config INTOSC_OSC_NOCLKOUT , MCLRE_OFF,  WDT_OFF ,  PWRTE_ON , BODEN_OFF , LVP_OFF ,  CP_OFF 

Попробуйте, если не получится, выложу "свой" вариант


THE TRUTH IS OUT THERE.

С уважением, Николай.
ibragimnk Дата: Чт, 28.05.2015, 14:40  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 26.03.2012

Статус: Offline

Большое спасибо за оперативность, буду разбирать.
Matrix252005 Дата: Чт, 28.05.2015, 14:46  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Я сейчас выложу архив, чтобы Вам было понятнее!!!

Я вернул некоторые строки и убрал резисторы в протеусе...

Пробуйте, будут вопросы, попробую ответить...
Прикрепления: Thermo783A_new.rar (88.6 Kb)


THE TRUTH IS OUT THERE.

С уважением, Николай.
ibragimnk Дата: Пт, 29.05.2015, 06:08  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 26.03.2012

Статус: Offline

Спасибо за помощь. Еще один вопрос по температуре: как удалить незначащие нули? Когда температура ниже 10 градусов впереди выскакивает ноль. В общем то было бы не страшно, но когда пробую вывести минус получается 8 вместо минуса. По логике проекта минус не обязателен, так как этот проект будет регулировать работу насоса в домашней отопительной системе. Двигатель насоса трехскоростной и автомат должен переключать скорости насоса в зависимости от температуры. Но если делать, то делать правильно. И второй вопрос: Когда меняешь индикатор с катода на анод сигналы подаваемые на индикатор должны инвертироваться, по крайней мере я так думаю. Однако при установке перемычки на индикаторе с общим анодом нормальных цифр не появляется. Что я мог упустить в данном случае?
AndrF Дата: Пт, 29.05.2015, 08:47  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Хоть код не из протона, а из Swordfish, но может кому пригодится, чтобы понять принцип (как я вижу большинство его не понимает) - вот как я работаю с данными температуры считанными из DS3231:

Код
Dim i As Integer, f As Float

' Читаем температуру (этот кусочек кода, конечно, зависит от используемого датчика,
' соответственно, привожу лишь то что интересно для данного случая)
...
i.Byte1 = ... ' Старший байт температуры (MSB)
i.Byte0 = ... ' Младший байт температуры (LSB)
...

' Поместим значение температуры в переменную типа Float
f = Float( i) / $100

' Вывод температуры на индикатор с 2-мя знаками после запятой
OledPrint(f , 2)

По данному коду видно что чтобы получить температуру в виде плавающего числа достаточно считанное значение привести к Float и полученное число разделить на $100 (для DS3231)

В случае же с DS18B20 делить надо на $10, то есть:

Код
f = Float( i) / $10

Все примитивно до ужаса, не так ли?
.

Сообщение отредактировал AndrF - Пт, 29.05.2015, 09:07
ibragimnk Дата: Пн, 01.06.2015, 05:41  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 26.03.2012

Статус: Offline

Спасибо за ответ, буду разбираться,хотя если честно не понимаю почему делить на $10. Как это работает? И где можно прочитать про именно этот механизм счета?

; --------------------------считать значение температуры-------------------------------------
TempC  = (Temp_read & $0FF0) >> 4
Float1 = Temp_read.LowByte & $0F
Float0 = LookUpL Float1, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9]
TemperC = (TempC * 10) + Float0
TemperC = Float(Temp_read)/$10
GoSub DisplayTime                       ' показать текущую температуру

Типа вот так? Однако или Протон не понимает или я туплю, но Протон данную команду не принимает. К тому же переменной Integer в Протоне нет и Temp_read у меня обозначен как Dim Temp_read   As  Word.

Сообщение отредактировал ibragimnk - Пн, 01.06.2015, 05:58
AndrF Дата: Пн, 01.06.2015, 11:41  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата ibragimnk ()
Спасибо за ответ, буду разбираться,хотя если честно не понимаю почему делить на $10. Как это работает? И где можно прочитать про именно этот механизм счета?

Да вы посмотрите как хранится значение температуры:



На примере же отлично видно, что это переменная типа Integer, содержащая значение температуры умноженное на $10 (производитель мог так сделать для того чтобы обойтись двумя байтами для хранения значения). Соответственно, чтобы получить значение температуры в переменной Float достаточно вначале привести число к Float, а потом разделить на $10.


Цитата
И где можно прочитать про именно этот механизм счета?

Собственно, нигде не встречал, так что мое творчество. Везде почему-то начинают химичить...

Добавлено (01.06.2015, 11:41)
---------------------------------------------
Цитата ibragimnk ()
Типа вот так? Однако или Протон не понимает или я туплю, но Протон данную команду не принимает. К тому же переменной Integer в Протоне нет и Temp_read у меня обозначен как Dim Temp_read   As  Word.

Тут я не скажу. Протон у меня не установлен - давно от него отказался.

Word не пойдет. Попробуйте Sword - вроде это и есть аналог Integer.

Как привести типы в протоне я не знаю. Но можно сделать и так:

Код
f = i
f = f / $10
Прикрепления: 1009766.jpg (105.6 Kb)

Сообщение отредактировал AndrF - Пн, 01.06.2015, 11:47
ibragimnk Дата: Пн, 01.06.2015, 14:44  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 26.03.2012

Статус: Offline

Проблему с незначащими нулями решил несколько извращенным способом, но тем не менее работает:

DisplayTime:    ;--------------------------------- отображение ----------------------------

If cc = 0 Then
GoTo Display_A
EndIf

Display_C:
DigitDisp = TemperC Dig 0               ; цифра после запятой
PORTA.0 = 0: PORTA.1 = 1: PORTA.2 = 1: PORTA.3 = 1   ; включить первую цифру, а остальные выключить
GoSub LOOK                              ; сходить на преобразование в семисегментный код
DelayMS 4                               ; ждать 4 Мс для отображения
PORTB = 0                               ; выключить все сегменты

DigitDisp = TemperC Dig 1               ; цифра едениц
PORTA.0 = 1: PORTA.1 = 0: PORTA.2 = 1: PORTA.3 = 1   ; включить вторую цифру, а остальные выключить
GoSub LOOK                              ; сходить на преобразование в семисегментный код
PORTB = PORTB + t                       ; точка
DelayMS 4                               ; ждать 4 Мс для отображения
PORTB = 0                               ; выключить все сегменты

DigitDisp = TemperC Dig 2               ; цифра десятков
PORTA.0 = 1: PORTA.1 = 1: PORTA.2 = 0: PORTA.3 = 1   ; включить третью цифру, а остальные выключить
GoSub LOOK                              ; сходить на преобразование в семисегментный код
If TemperC < 100 Then                   ; если температура меньше 10
PORTB = 0                                ; то порт В обнулить

EndIf
DelayMS 4                               ; ждать 4 Мс для отображения
PORTB = 0                               ; выключить все сегменты

DigitDisp = TemperC Dig 3                         ; цифра сотен или минус
PORTA.0 = 1: PORTA.1 = 1: PORTA.2 = 1: PORTA.3 = 0   ; включить последнюю цифру, а остальные выключить
GoSub LOOK                                  ; сходить на преобразование в семисегментный код
If TemperC < 1000 Then                      ; если температура меньше 100
PORTB = led                                 ; то показывать минус

EndIf
DelayMS 4                               ; ждать 4 Мс для отображения
PORTB = 0
Return

LOOK:
; таблица для индикаторов с общим катодом
PORTB = LookUpL DigitDisp,[63,6,91,79,102,109,125,7,127,111]
Return

Добавлено (01.06.2015, 14:44)
---------------------------------------------
Еще вопрос к знатокам: в чем разница между индикаторами с общим катодом и общим анодом, кроме инверсии сигналов?
У меня в Протеусе индикатор с катодом показывает нормально, а когда переключаю на анод почему-то индикация не идет. А вот где ошибка пока не вижу. В доступной литературе этот вопрос почему-то не освещен.

Сообщение отредактировал ibragimnk - Пн, 01.06.2015, 13:52
  • Страница 2 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: