DS18B20 проблемы... Наверно туплю...
|
|
Володимир |
Дата: Пт, 31.01.2014, 23:19 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
69
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Для доцент2: на работе имеется поверенный термометр с точностью 0,1 - проверял 5 датчиков - все показывали +- 0,2 градуса. С одной партии. Было 15 штук - но надоело мерить и мне точности 0,5 градуса достаточно. Измерял температуру воздуха в пределах, если не изменяет память, где-то 19 - 70 градусов.
|
|
|
|
Володимир |
Дата: Сб, 01.02.2014, 18:05 | Сообщение # 19 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
69
Замечания:
±
На сайте с 22.04.2010
Статус:
Offline
|
Цитата brown ( ) Если с округлением до десятой, то я делаю так: А, дошло, нужно инвертировать четыре младшие бита добавить еденицу и умножить на 0.0625, только не вижу логики разрабодчиков датчка, зачем добавлять еденицу, если можно просто обойтись простым инвертированием.
|
|
|
|
anatol |
Дата: Сб, 01.02.2014, 19:32 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Володимир, разработчики действовали строго по инструкции Если серьезно - посмотрите формы представления двоичных чисел, в том числе десятичные дроби. И, вообще, есть такая штука - Булева алгебра. А теперь сноски http://ru.wikipedia.org/wiki/Булева_алгебра http://ru.wikipedia.org/wiki/Двоичная_система_счисления http://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)
|
|
|
|
Володимир |
Дата: Сб, 01.02.2014, 19:46 | Сообщение # 21 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
69
Замечания:
±
На сайте с 22.04.2010
Статус:
Offline
|
Цитата anatol ( ) Теперь все понятно, просто никогда не задавался вопросом как числа с плавающей точкой записываються в двоичном коде. Спасибо за подсказку.
|
|
|
|
ibragimnk |
Дата: Чт, 28.05.2015, 14:08 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 26.03.2012
Статус:
Offline
|
Подскажите пожалуйста, взялся за разработку проекта, не столько ради самого проекта, а сколько ради обучения. Основу программы взял отсюда http://www.picbasic.ru/forum/5-528-1 автор mikhail09p (инкубатор 9902502) Попытался переделать под свой проект, вроде опрос датчика не трогал, однако температуру не выводит. На второй индикатор пока внимания обращать не надо, это я попытался сделать универсальную программу под анод-катодные индикаторы переключением перемычки сс. С этим я еще буду разбираться. А вот почему не идет температура никак не могу "въехать". Проект в архиве.
|
|
|
|
Matrix252005 |
Дата: Чт, 28.05.2015, 14:33 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 26.03.2012
Статус:
Offline
|
Большое спасибо за оперативность, буду разбирать.
|
|
|
|
Matrix252005 |
Дата: Чт, 28.05.2015, 14:46 | Сообщение # 25 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Я сейчас выложу архив, чтобы Вам было понятнее!!!
Я вернул некоторые строки и убрал резисторы в протеусе...
Пробуйте, будут вопросы, попробую ответить...
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
ibragimnk |
Дата: Пт, 29.05.2015, 06:08 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 26.03.2012
Статус:
Offline
|
Спасибо за помощь. Еще один вопрос по температуре: как удалить незначащие нули? Когда температура ниже 10 градусов впереди выскакивает ноль. В общем то было бы не страшно, но когда пробую вывести минус получается 8 вместо минуса. По логике проекта минус не обязателен, так как этот проект будет регулировать работу насоса в домашней отопительной системе. Двигатель насоса трехскоростной и автомат должен переключать скорости насоса в зависимости от температуры. Но если делать, то делать правильно. И второй вопрос: Когда меняешь индикатор с катода на анод сигналы подаваемые на индикатор должны инвертироваться, по крайней мере я так думаю. Однако при установке перемычки на индикаторе с общим анодом нормальных цифр не появляется. Что я мог упустить в данном случае?
|
|
|
|
AndrF |
Дата: Пт, 29.05.2015, 08:47 | Сообщение # 27 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
145
Замечания:
±
На сайте с 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, то есть: Все примитивно до ужаса, не так ли? .
Сообщение отредактировал
AndrF - Пт, 29.05.2015, 09:07
|
|
|
|
ibragimnk |
Дата: Пн, 01.06.2015, 05:41 | Сообщение # 28 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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.
Как привести типы в протоне я не знаю. Но можно сделать и так:
Сообщение отредактировал
AndrF - Пн, 01.06.2015, 11:47
|
|
|
|
ibragimnk |
Дата: Пн, 01.06.2015, 14:44 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 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
|
|
|
|