Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Подскажите формулу (Преобразование температуры 18в20)
Подскажите формулу
vanish Дата: Чт, 07.07.2011, 23:48  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 63
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2010

Статус: Offline

Приветствую всех. Господа, подскажите , пожалуйста формулу преобразования температуры в десятичный вид с датчика DS18b20. Просмотрел несколько исходников, везде разные формулы. Закономерности , честно говоря, не уловил. Хочется понять. Спасибо.
ЯНДЕКС Дата: 07.07.2011
anatol Дата: Пт, 08.07.2011, 10:21  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 14   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Все есть в даташите. А как обрабатывать - ? - по потребности.
terrarus Дата: Пт, 08.07.2011, 11:59  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 63
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2010

Статус: Offline

Мужики, я эту статью взял за основу. Только немного переделал под ЛЭД дисплей. Потребовалось использовать команду DIG. Эта команда не работает с переменными типа Float. поменял типа переменных на DWORD. В итоге получилось в протеусе, что термометр работает нормально до 15 градусов.Начиная с 16 и выше единицы прибавляются нормально, а десятки гуляют в вольном направлении.
ADMIN Дата: Сб, 09.07.2011, 02:21  |                                                                                                                Сообщение # 5
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Так если используешь Float, то тогда dig и не нужна. Dig используют для отделения целой части от дроби. А float и так можно выводить.
vanish Дата: Сб, 09.07.2011, 09:20  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 63
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2010

Статус: Offline

Вероятно я чтото недопонимаю. У меня лед индикаторы 2 разряда , я же не могу сразу отправить на них двузначное число , его надо разложить на составные . Или я ошибаюсь ?
ADMIN Дата: Сб, 09.07.2011, 09:34  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Ну да. Не уловил про ЛЕД. А зачем тогда для двух разрядного переменную типа dword? Одного байта хватит.
vanish Дата: Сб, 09.07.2011, 15:18  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 63
Репутация: 0   ±
Замечания:   ±
На сайте с 08.04.2010

Статус: Offline

Так и сделал как вы сказали. Все равно после 15 градусов счет начинается с нуля, затем опять до 15 градусов, потом опять с нуля. Интересно почему?
ADMIN Дата: Сб, 09.07.2011, 15:31  |                                                                                                                Сообщение # 9
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

это в протеусе? или в реальности. Включи пошаговую отладку и посмотри, что где не так. Если не тайна, можешь здесь код привести, да и схему не помешает
ivan_fd Дата: Сб, 09.07.2011, 15:33  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Специалист
Сообщений: 899
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Может код обработки покажете, будет легче понять.
А так это просто гадание.


Меня все время преследуют умные мысли...но я быстрее!!!
vanish Дата: Сб, 09.07.2011, 17:25  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 63
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Прикрепления: phpEjMYTj.noext(20Kb)

Сообщение отредактировал vanish - Сб, 09.07.2011, 17:26
ADMIN Дата: Сб, 09.07.2011, 17:31  |                                                                                                                Сообщение # 12
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

сделай a1 и a2 байтами. мы же говорили об этом. Для хранения одного числа от 0 до 9 нужно не более байта
ivan_fd Дата: Сб, 09.07.2011, 18:06  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Специалист
Сообщений: 899
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Изучайте, все, что исправил и дописал пометил восклицательными знаками и звездочками.

Ну и со статической индикацией Вам нужно разобратся.
Прикрепления: Untitled.rar(1Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
ADMIN Дата: Сб, 09.07.2011, 18:46  |                                                                                                                Сообщение # 14
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 899
Репутация: 47   ±
Замечания:   ±
На сайте с 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)
я бы сократил так:


Конечно так лучше, еще можно отправлять на сдвиговые регистры(их нужно объеденить) сразу две цифры, сэкономим две ноги контроллера.
Прикрепления: 7868383.png(12Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
Сообщение отредактировал ivan_fd - Сб, 09.07.2011, 19:16
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Подскажите формулу (Преобразование температуры 18в20)
Страница 1 из 212»
Поиск: