PIC16F628A + DS1820 - Страница 2 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 2«12
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16F628A + DS1820 (Не работает на железе)
PIC16F628A + DS1820
brown Дата: Ср, 24.02.2010, 23:01  |                                                                                                                Сообщение # 16
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Quote (pic_anton)
ребята а что так всемс нравиться ds1820 ведь программа большая получается не проще взять аналог типа LM50

И МК с АЦП и точность
Quote
Accuracy (+/-) (deg C) 2, 3


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ЯНДЕКС Дата: 24.02.2010
DNM Дата: Вт, 04.10.2011, 23:45  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Quote (holyuser)
Я тоже заметил подобное поведение DS18B20, уже писал об этом в одной из соседних тем -
в режиме "parasite power", с кварцевым резонатором на 4.000 MHz, из десяти датчиков нормально работали шесть. На 3.579 и на 4.096 MHz работали все.
При нормальном питании все 1-wire работали нормально при всех частотах генератора пика.


Всё нормально работает

'******************************************************************
'* проект TERM DS18B20 - 1 *
'*программа управления электронным термометром DS18B20, для 16F628*
'*интервал измеряемых температур от -65.5 до +125 градусов цельсия*
'*результат измерения выводится на двустрочный LSD монитор *
'******************************************************************
porta=0 'очистить порт
portb=0 'очистить порт
TRISB=%00000001 'настроить порт B.0 на прием данных от DS18B20
TRISA=0
CMCON=7
'------------------- модуль переменных --------------------------
busy var bit
ham var word
ham1 var word
isi var word
float var word
x var word
isaret_biti var ham.bit11
eksi_isi con 1
derece con 223
isaret var byte
temp var byte
symbol comm_pin=portb.0
'-----------------------------------------------------------------
clear
pause 200
basla:
'lcdout $FE,1
'lcdout $fe,1," DS18B20 ile ISI"
gosub sensoroku ' подпрограмма управления DS18B20
goto basla
'------------------------
sensoroku:
'$CC - команда пропуска ROM DS18B20
'$44 - команда температурного преобразования
'$BE - команда чтения результата преобразования из памяти
owout comm_pin,1,[$CC,$44 ] 'послать команды DS18B20
bekle:
owin comm_pin,4,[busy]
if busy=0 then bekle 'ждать пока не завершится преобразование результата
owout comm_pin,1,[$CC,$BE ] 'послать команды DS18B20
owin comm_pin,2,[ham.Lowbyte,ham.Highbyte] 'поместить результат в ham
gosub hesapla 'результат получен, перейти к его преобразованию для вывода на LCD
return
'-------------------------
hesapla:
'определяемся со знаком
isaret="+"
if isaret_biti=eksi_isi then
isaret ="-"
temp=($FFFF - ham + 1)*625 'если отрицательная температура
isi=div32 100
goto gec
endif
temp=625*ham
isi=div32 100
gec:
float=(isi//100)/10 'дробная часть результата
isi=isi/100 'целая часть результата
'вывести результат на LSD
Lcdout $fe,1,isaret,DEC isi,".",DEC1 float," ",Derece,"C"
Lcdout $FE,$C0," ", DEC ham
return
end
passer_by Дата: Чт, 03.11.2011, 18:41  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Новенький
Сообщений: 17
Репутация: 0   ±
Замечания:   ±
На сайте с 23.10.2011

Статус: Offline

Quote (DNM)
*интервал измеряемых температур от -65.5 до +125 градусов цельсия*
temp=625*ham

Я, в общем то, начинающий. То же пытаюсь сваять что то типа этого. Но с несколькими датчиками. Не суть. Но вот у меня получается, что произведение - temp=625*ham уже при температуре в 66 градусов приведет к переполнению переменной. То есть прога будет работать, но неверно показывать температуру выше 65 град. Или я что то не догоняю?
terrarus Дата: Чт, 03.11.2011, 21:42  |                                                                                                                Сообщение # 19
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Я что-то опять "не догоняю" (по русски -не понимаю)!?
Quote (passer_by)
интервал измеряемых температур от -65.5 до +125 градусов цельсия

Какие могут быть -65 гдарусов, тем более с .5 после запятой!?

Из даташита на датчик DS18B20: "...цифровой термометр с программируемым разрешением, от 9 до 12–bit, которое может сохраняться в EEPROM памяти прибора. DS18B20 обменивается данными по 1-Wire шине и при этом может быть как единственным устройством на линии так и работать в группе. Все процессы на шине управляются центральным микропроцессором.
Диапазон измерений от –55°C до +125°C и точностью 0.5°C в диапазоне от –10°C до +85°C. В дополнение, DS18B20 может питаться напряжением линии данных (“parasite power”), при отсутствии внешнего источника напряжения.
Каждый DS18B20 имеет уникальный 64-битный последовательный код, который позволяет, общаться с множеством датчиков DS18B20 установленных на одной шине.
Может быть я что-то проспал, а Dallas Semiconductor уже выпустила DS18B20 с
Quote (passer_by)
интервал измеряемых температур от -65.5 до +125 градусов цельсия
?
Или не только я с будуна сегодня?


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Чт, 03.11.2011, 21:46
mikhail09p Дата: Чт, 03.11.2011, 23:02  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Начинающие, обратите внимание на Протон. И сходите Сюда Тут всё намного проще и короче.
passer_by Дата: Пт, 04.11.2011, 05:51  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Новенький
Сообщений: 17
Репутация: 0   ±
Замечания:   ±
На сайте с 23.10.2011

Статус: Offline

Не, я на эту фишку (-65) внимания не обратил. Да просто опечатался товарищ . Я про то, что в положительном интервале (+65) и выше произойдет переполнение переменной. И ни о каких измерениях +125 речи быть не может, при приведенном коде. Наверное надо что то с плавающей запятой городить.
passer_by Дата: Пт, 04.11.2011, 05:56  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Новенький
Сообщений: 17
Репутация: 0   ±
Замечания:   ±
На сайте с 23.10.2011

Статус: Offline

Quote (mikhail09p)
И сходите Сюда Тут всё намного проще и короче.

Угу, только там ни хрена не открывается
Прикрепления: 0518428.jpg(82Kb)

Сообщение отредактировал passer_by - Пт, 04.11.2011, 06:01
ADMIN Дата: Пт, 04.11.2011, 06:22  |                                                                                                                Сообщение # 23
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Quote (passer_by)
Я, в общем то, начинающий. То же пытаюсь сваять что то типа этого. Но с несколькими датчиками. Не суть. Но вот у меня получается, что произведение - temp=625*ham уже при температуре в 66 градусов приведет к переполнению переменной. То есть прога будет работать, но неверно показывать температуру выше 65 град. Или я что то не догоняю?


После произведения
temp=625*ham
стоит команда:
isi=div32 100

Рассмотрим пример - при 125 градусах (это больше 65!)
Цифровой код 125 градусов - 07D0h = 2000

Результатом произведения 625* 2000 будет 1250000
Это число естественно не помещается в переменную типа word (это максимум у PBP)
Команда DIV32 100 - это 32-разрядное деление на 100. в переменной isi после выполнения этой команды будет находиться результат деления 1250000/100 = 12500

Число 12500 - легко умещается в переменную типа Word. Далее - просто - для значения 125 градусов мы получили код - 12500.
По аналогии для 85 градусов мы получим код 8500. И так далее. Дальше - дело техники.
Главное, чтобы между 16-разрядным умножением и командой DIV32 не находилась ни одна команда.
В случае с Proton+ нам эта команда не нужна - ведь он поддерживает 32-разрядные математические операции, а также операции с плавающей запятой.
passer_by Дата: Пт, 04.11.2011, 09:58  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Новенький
Сообщений: 17
Репутация: 0   ±
Замечания:   ±
На сайте с 23.10.2011

Статус: Offline

Спасибо. Буду у себя разбираться wine DIV32 прописано, но вот...
mikhail09p Дата: Пт, 04.11.2011, 18:56  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (passer_by)
Угу, только там ни хрена не открывается


Открывается там то, что УЖЕ СУЩЕСТВУЕТ. То, что не открывается, ещё НЕ написано. Неужели непонятно ? wacko
А того, что есть, вполне достаточно для полноценной работы.

Quote (ADMIN)
В случае с Proton+ нам эта команда не нужна - ведь он поддерживает 32-разрядные математические операции, а также операции с плавающей запятой.

Вот-вот!
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16F628A + DS1820 (Не работает на железе)
Страница 2 из 2«12
Поиск: