Подскажите формулу
|
|
vanish |
Дата: Чт, 07.07.2011, 23:48 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
55
Замечания:
±
На сайте с 08.04.2010
Статус:
Offline
|
Приветствую всех. Господа, подскажите , пожалуйста формулу преобразования температуры в десятичный вид с датчика DS18b20. Просмотрел несколько исходников, везде разные формулы. Закономерности , честно говоря, не уловил. Хочется понять. Спасибо.
|
|
|
|
anatol |
Дата: Пт, 08.07.2011, 10:21 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Все есть в даташите. А как обрабатывать - ? - по потребности.
|
|
|
|
terrarus |
Дата: Пт, 08.07.2011, 11:59 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Нанашем форуме есть статья - РАБОТА С ДАТЧИКОМ DS18B20 http://www.picbasic.ru/publ/rabota_s_datchikom_ds18b20/2-1-0-60
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
vanish |
Дата: Пт, 08.07.2011, 21:16 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
55
Замечания:
±
На сайте с 08.04.2010
Статус:
Offline
|
Мужики, я эту статью взял за основу. Только немного переделал под ЛЭД дисплей. Потребовалось использовать команду DIG. Эта команда не работает с переменными типа Float. поменял типа переменных на DWORD. В итоге получилось в протеусе, что термометр работает нормально до 15 градусов.Начиная с 16 и выше единицы прибавляются нормально, а десятки гуляют в вольном направлении.
|
|
|
|
ADMIN |
Дата: Сб, 09.07.2011, 02:21 | Сообщение # 5 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Так если используешь Float, то тогда dig и не нужна. Dig используют для отделения целой части от дроби. А float и так можно выводить.
|
|
|
|
vanish |
Дата: Сб, 09.07.2011, 09:20 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
55
Замечания:
±
На сайте с 08.04.2010
Статус:
Offline
|
Вероятно я чтото недопонимаю. У меня лед индикаторы 2 разряда , я же не могу сразу отправить на них двузначное число , его надо разложить на составные . Или я ошибаюсь ?
|
|
|
|
ADMIN |
Дата: Сб, 09.07.2011, 09:34 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну да. Не уловил про ЛЕД. А зачем тогда для двух разрядного переменную типа dword? Одного байта хватит.
|
|
|
|
vanish |
Дата: Сб, 09.07.2011, 15:18 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
55
Замечания:
±
На сайте с 08.04.2010
Статус:
Offline
|
Так и сделал как вы сказали. Все равно после 15 градусов счет начинается с нуля, затем опять до 15 градусов, потом опять с нуля. Интересно почему?
|
|
|
|
ADMIN |
Дата: Сб, 09.07.2011, 15:31 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
это в протеусе? или в реальности. Включи пошаговую отладку и посмотри, что где не так. Если не тайна, можешь здесь код привести, да и схему не помешает
|
|
|
|
ivan_fd |
Дата: Сб, 09.07.2011, 15:33 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Может код обработки покажете, будет легче понять. А так это просто гадание.
|
|
|
|
vanish |
Дата: Сб, 09.07.2011, 17:25 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
55
Замечания:
±
На сайте с 08.04.2010
Статус:
Offline
|
Тут прикрепил файлы протеуса.Переименуйте файл в rar. Вот код. Я использую статическую индикацию Device = 16F628 Xtal = 4 All_Digital=true
TRISB=%10000000 TRISA=%11111111 Symbol DQ =PORTB.7 Symbol Data1 =PORTB.0 Symbol clock1 =PORTB.1 Symbol Data2 =PORTB.2 Symbol clock2 =PORTB.3 Dim R_TEMP As Dword Dim TEMP As Byte
Dim TEMPIND As Byte Dim C As Bit Dim a1 As Dword Dim a2 As Dword Dim NUMB1 As Byte Dim NUMB2 As Byte
main: GoSub TERMO_CONVERT
GoSub CONVDES a1=NUMB1 SHOut Data1,clock1,lsbfirst,[a1] DelayMS 50
GoSub CONVEDIN a2=NUMB2 SHOut Data2,clock2,lsbfirst,[a2] DelayMS 50
GoTo main
CONVDES: LookUp a1 ,[%00000011,%10011111,%00100101,%00001100,%10011001,%01001001,%01000001,%00011111,%00000001,%00001001],NUMB1 Return CONVEDIN: LookUp a2 ,[%00000011,%10011111,%00100101,%00001100,%10011001,%01001001,%01000001,%00011111,%00000001,%00001001],NUMB2 Return
TERMO_CONVERT: OWrite DQ,1,[$CC,$44] Repeat DelayMS 25 ORead DQ,4,[C] Until C>0 OWrite DQ,1,[$CC,$BE] ORead DQ,2,[R_TEMP.LowByte,R_TEMP.HighByte] TEMP = R_TEMP TEMPIND = TEMP / 16 If R_TEMP > 64654 Then TEMPIND = TEMP / 16 - 4096 a1 = Dig TEMPIND, 1 a2 = Dig TEMPIND, 0 Return
Сообщение отредактировал
vanish - Сб, 09.07.2011, 17:26
|
|
|
|
ADMIN |
Дата: Сб, 09.07.2011, 17:31 | Сообщение # 12 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
сделай a1 и a2 байтами. мы же говорили об этом. Для хранения одного числа от 0 до 9 нужно не более байта
|
|
|
|
ivan_fd |
Дата: Сб, 09.07.2011, 18:06 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Изучайте, все, что исправил и дописал пометил восклицательными знаками и звездочками.
Ну и со статической индикацией Вам нужно разобратся.
|
|
|
|
ADMIN |
Дата: Сб, 09.07.2011, 18:46 | Сообщение # 14 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
ivan_fd, а что за строчка float0 = LookUpL Float1, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9] подробней можно?
И кстати....
я бы сократил так:
вместо Code
GoSub CONVDES a1=NUMB1 SHOut Data1,clock1,LsbFirst,[a1] DelayMS 50
GoSub CONVEDIN a2=NUMB2 SHOut Data2,clock2,LsbFirst,[a2] DelayMS 50
GoTo main
CONVDES: LookUp a1 ,[%00000011,%10011111,%00100101,%00001100,%10011001,%01001001,%01000001,%00011111,%00000001,%00001001],NUMB1 Return CONVEDIN: LookUp a2 ,[%00000011,%10011111,%00100101,%00001100,%10011001,%01001001,%01000001,%00011111,%00000001,%00001001],NUMB2 Return
написал бы
Code
temp_var = a1 GoSub CONVDES DelayMS 50 temp_var = a2 GoSub CONVDES
CONVDES: LookUp temp_var ,[%00000011,%10011111,%00100101,%00001100,%10011001,%01001001,%01000001,%00011111,%00000001,%00001001],NUMB1 SHOut Data1,clock1,LsbFirst,[temp_var] Return
|
|
|
|
ivan_fd |
Дата: Сб, 09.07.2011, 19:13 | Сообщение # 15 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (ADMIN) ivan_fd, а что за строчка float0 = LookUpL Float1, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9] подробней можно?
Код придумал не я. Здесь мы вычисляем число после запятой, дробную часть. Но в данном случаи оно не нужно, так как vanish, берет только целую часть.
Quote (ADMIN) я бы сократил так:
Конечно так лучше, еще можно отправлять на сдвиговые регистры(их нужно объеденить) сразу две цифры, сэкономим две ноги контроллера.
Сообщение отредактировал
ivan_fd - Сб, 09.07.2011, 19:16
|
|
|
|