DS18B20 проблемы... Наверно туплю...
|
|
Klim |
Дата: Сб, 02.10.2010, 00:27 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Я дико извиняюсь, наверно тут уже всех задолбал своими вопросами, но все же прошу помощи... Вот простая схемка. Считываю температуру, отображаю на LCD. К сожалению, ничего не отображается. Подскажите, где я протупил?
|
|
|
|
Klim |
Дата: Вс, 03.10.2010, 20:25 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Разобрался - заработало. На всякий случай выкладываю исходники: Запутался только, как выводить отрицательные значения... Голова ночью уже совсем не соображает.Добавлено (03.10.2010, 20.25.04) --------------------------------------------- Разобрался и с этим.
Сообщение отредактировал
Klim - Сб, 02.10.2010, 02:26
|
|
|
|
доцент2 |
Дата: Пн, 25.02.2013, 22:02 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
в продолжение темы. проблема в том, что DS18B20 в железе врет (медицинский градусник показывает 39,4 а DS18B20 показывает 38,2) разница в 1,2 градуса. В протеусе работает нормально с точностью 0,1. может датчик надо калибровать? или код преобразования не верный? вот часть текста: Dim Rezul_Temp As Word ' результат измерения температуры Dim Cel_Temp As Word ' целая часть Dim Dat_Temp As Word ' Dim Des_Temp As Word ' десятки Dim Temperatuta_znak As Byte Dim control_izmer As Byte
MAIN: '+++++++++++++++++++++ измерение температуры +++++++++++++++++++++++++++++++++++ GoSub init_DS18S20 OWrite PORTA.0, 1, [$CC,$4E, 0, 0, $7F]' для 9 битного преобразования 1F, для 11 битного - 3F, для 12 битного - 7F GoSub init_DS18S20 OWrite PORTA.0, 1, [$CC, $44] ' Start (посылаем импульс сброса измерительного устройства) Repeat DelayMS 25 ORead PORTA.0,4,[control_izmer] 'проверяем, не закончился ли процесс измерения Until control_izmer>0 OWrite PORTA.0, 1, [$CC, $BE] 'команда на считывание памяти (первые два байта) '+++++++++++++++++++ процедура пересчета температуры +++++++++++++ '+++++++++++++++ DS18B20 ++++++++++++++++++++ '+++++++++++++++ 12-ти битовое представление температуры ++++++++++++ '++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORead PORTA.0, 2, [Rezul_Temp.LowByte, Rezul_Temp.HighByte] '++++++++++++++++++ точночть до 0.1 ++++++++++++++++++++++++++ Temperatuta_znak=Rezul_Temp.12 ' определяем знак температуры, если 0 то "+", 1 то "-" If Temperatuta_znak <> 1 Then Cel_Temp =Rezul_Temp/16 Des_Temp=(Rezul_Temp//16)*10/16 Else Cel_Temp=65535-Rezul_Temp Dat_Temp=Cel_Temp+1 Cel_Temp=Dat_Temp/16 Des_Temp=((Dat_Temp+1)//16)*10/16 EndIf
'++++++++++++++++++ инициализация измерителя ++++++++++++++ init_DS18S20: Output PORTA.0 ' установить Pin на выход PORTA.0=0 ' OneWire line Low PauseUs 500 ' рауза 500 µS Input PORTA.0 ' установить Pin на вход PauseUs 100 ' рауза 100 µS Return
вывод на дисплей писать не стал, но там так: сначала выводим целую часть Cel_Temp , потом запятую, потом десятки после запятой Des_Temp.
|
|
|
|
ivan_fd |
Дата: Пн, 25.02.2013, 23:17 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Микросхема откалибрована на заводе. Заявленная точность по даташиту составляет ±0.5°. А 0.1 - это не точность, а разрешающая способность.
Что касается, что он врет, а как далеко он от платы и что Вы меряете, температуру тела???
Я всегда для преобразования использую такой код:
Код Temp_calc: ' '****************************************************************************************************** If Temp_read.11 = 1 Then ' Sign = "-" Temp_read = ~Temp_read + 1 Else Sign = "+" EndIf 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 Return
|
|
|
|
доцент2 |
Дата: Пн, 25.02.2013, 23:48 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
и мой и Ваш код дают в железе одинаковые результаты. из того, что есть под рукой это медицинский градусник. по сравнению с ним показания датчика меньше примерно на один градус. проверял и температуру тела и в стакане с теплой водой. датчик с платой соединен проводами длиной 30 см. если можно приведите пример кода для разрешения в 1 и 0,5 градуса.
Сообщение отредактировал
доцент2 - Пн, 25.02.2013, 23:57
|
|
|
|
ivan_fd |
Дата: Вт, 26.02.2013, 12:42 | Сообщение # 6 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Разрешающую способность можно выставить только 9, 10, 11, или 12 бит. Соответсвенно 0.0625, 0.125, 0.25 и 0.5°.
Выставляется просто - пишем в Configuration register 4 байт SCRATCHPAD нужные данные.
Я почему использую код преобразования, который дал выше. Потому, что он (если верить Протеусу) нормально показывает отрицательные температуры, если разрешающая способность 12бит.
Ставил старый советский термометр (спиртовой), показания были одинаковы.
|
|
|
|
доцент2 |
Дата: Вт, 26.02.2013, 14:06 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
с установкой разрешающей способности мне понятно, просто видел различные варианты преобразования для различного разрешения. сегодня выставил датчик за окно и сравнил показания со спиртовым термометром - показания совпадают. вопрос! почему при измерении температуры тела преобразование врет на 1 градус в меньшую сторону. в помещении проверить не чем, но кажется тоже врет на -1градус.
|
|
|
|
ivan_fd |
Дата: Вт, 26.02.2013, 18:08 | Сообщение # 8 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Какая разница где мерять, на улице, или в помещении. А измерять температуру тела, я думаю, что не меряет точно, потому, что нету нормального контакта с телом. Да и не для этого он.
|
|
|
|
доцент2 |
Дата: Вт, 26.02.2013, 20:52 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
на уличном термометре было между 0 и 1 градусом. преобразование показало 0,6 градусов. у меня такое ощущение, что преобразование врет на целых положительных числах на 1 градус. я мерил не только температуру тела, но и ради интереса градусник и датчик опускал в стакан с теплой водой - ошибка была та же примерно на 1 градус.
|
|
|
|
anatol |
Дата: Вт, 26.02.2013, 21:05 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
У соседа термометр попроси. В кипящую воду засунь. Хреновый датчик - замени. Что бодягу тянуть. Программой здесь не пахнет.
|
|
|
|
доцент2 |
Дата: Вт, 26.02.2013, 22:14 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
поясните такой момент: при различном разрешении преобразования 9, 10, 11 и 12 бит, какое разрешение результата измерения будет им соответствовать 1, 0,5, 0,125 и 0,0625? я так полагаю для 9 бит - 1градус для 10 бит - 0,5 для 11 бит - 0,125 для 12 бит - 0,0625 верно?
Сообщение отредактировал
доцент2 - Вт, 26.02.2013, 22:42
|
|
|
|
ivan_fd |
Дата: Вт, 26.02.2013, 23:19 | Сообщение # 12 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата (ivan_fd) Соответсвенно 0.0625, 0.125, 0.25 и 0.5°.
|
|
|
|
доцент2 |
Дата: Вт, 26.02.2013, 23:21 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
не совсем понятно. для 12 бит будет соответствовать 0,5?
|
|
|
|
ivan_fd |
Дата: Вт, 26.02.2013, 23:29 | Сообщение # 14 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Наоборот, просто так написал.
|
|
|
|
доцент2 |
Дата: Вт, 26.02.2013, 23:55 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
теперь понятно
|
|
|
|