16f876a & ds18b20 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » 16f876a & ds18b20 (не правильно отображается Т)
16f876a & ds18b20
hopi Дата: Чт, 03.02.2011, 15:31  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 09.12.2008

Статус: Offline

Здраствуйте.Вытащил кусочек программы из более большой программы,т.к. нужно считывать температуру с датчика.
По программе все более менее понятно!Косяк наверное в процедуре опроса датчика.
Понятно откуда берется "-" и 65535($ffff) , или быть может 18b20 ничего не "отдает" ???

Sign = "-"
TempC = ($FFFF - R_Temp + 1)/16

но почему темп не отображается????

Подскажите что не так.Заранее спасибо.
ЖК в Протеусе7.7 выдает:
-0.00 в дес.вид
1111111111111111 в дв. виде

Вот исходник:

DQ VAR PORTC.0 ' 18B20 Data Pin

R_Temp VAR WORD ' RAW Temperature
TempC VAR WORD ' Integer part of temp in deg C
TempC1 VAR WORD ' Decimal part
ColdBit VAR R_Temp.Bit11 ' Sign-Bit for +/- Temp. (1 - minus, 0 - plus)
Sign VAR BYTE ' +/- sign
TRISC = %11111111 ' Set PORTÑ to all input
LCDOUT $FE, 1

main:
LCDOUT $FE, $80, 5, Sign, DEC2 TempC, ".", DEC1 TempC1, 3, 4
LCDOUT $FE,$c0, bin R_Temp
gosub calctemp
GOTO main
calctemp:

OWOUT DQ, 1, [$CC, $44] ' Skip ROM & start conversion
OWOUT DQ, 1, [$CC, $BE] ' Skip ROM & read temperature
OWIN DQ, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]
gosub selsign

return
selsign:
IF ColdBit = 1 THEN ' Below "0" deg C
Sign = "-"
TempC = ($FFFF - R_Temp + 1)/16
TempC1 = ($FFFF - R_Temp + 1)//16
TempC1 = TempC1*625/1000
ELSE
Sign = "+"
TempC = R_Temp/16
TempC1 = R_Temp//16
TempC1 = TempC1*625/1000
enDIF
RETURN
END

ЯНДЕКС Дата: 03.02.2011
Matrix252005 Дата: Чт, 03.02.2011, 16:15  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток.
hopi, попробуйте так:

if ColdBit1 <> 1 then ' расчет положительного значения
tempcel1 = temptemp1 / 16 ' расчет целого числа t
tempdes1 = (temptemp1 // 16) * 10 / 16 ' расчет дес числа t
else ' расчет отрицательного значения
tempcel1 = 65535 - temptemp1
tempdat1 = tempcel1 + 1
tempcel1 = tempdat1 / 16
tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16
endif

Замените все после "selsign:" и подставьте свои переменные


THE TRUTH IS OUT THERE.

С уважением, Николай.

Сообщение отредактировал Matrix252005 - Чт, 03.02.2011, 16:21
hopi Дата: Чт, 03.02.2011, 16:54  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 09.12.2008

Статус: Offline

Николай, получилось вот так,если я Вас правильно понял НО! в протеусе опять тоже самое, только без "-"
И САМОЕ ИНТЕРЕСНОЕ что после 3х мин эмуляции показания начинают бегать ОТ и ДО(тоже самое было и в первом варианте программы)

ColdBit1 VAR temptemp1.bit11 ' Sign-Bit for +/- Temp. (1 - minus, 0 - plus)
Sign VAR BYTE
tempcel1 var word
tempdes1 var word
tempdat1 var word
temptemp1 var word
TRISC = %11111111 ' Set PORTÑ to all input
LCDOUT $FE, 1
main:
LCDOUT $FE, $80, 5, Sign, DEC2 TempCel1, ".", DEC1 Tempdes1, 3, 4
LCDOUT $FE,$c0, bin temptemp1
gosub calctemp
GOTO main
calctemp:
OWOUT DQ, 1, [$CC, $44] ' Skip ROM & start conversion
OWOUT DQ, 1, [$CC, $BE] ' Skip ROM & read temperature
OWIN DQ, 2, [temptemp1.Lowbyte, temptemp1.Highbyte]
gosub selsign
return
selsign:

if ColdBit1 <> 1 then
tempcel1 = temptemp1 / 16
tempdes1 = (temptemp1 // 16) * 10 / 16
else
tempcel1 = 65535 - temptemp1
tempdat1 = tempcel1 + 1
tempcel1 = tempdat1 / 16
tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16
endif
return
end

Matrix252005 Дата: Чт, 03.02.2011, 17:01  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Вы не могли бы выложить весь проект??? (схему + исходник)

THE TRUTH IS OUT THERE.

С уважением, Николай.
Matrix252005 Дата: Чт, 03.02.2011, 17:14  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

hopi, посмотрите и проверьте...
Прикрепления: TMP.dsn(30Kb) · TMP.bas(2Kb) · TMP.hex(3Kb)


THE TRUTH IS OUT THERE.

С уважением, Николай.
hopi Дата: Чт, 03.02.2011, 17:32  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 09.12.2008

Статус: Offline

Вот программа с предложенным изменением. Приложение - скриншот работы схемы в протеусе.

@ DEVICE PIC16F876a,HS_OSC
DEFINE OSC 8 ' Oscillator freq. 8 MHz
DEFINE LCD_DREG PORTB ' LCD Data port
DEFINE LCD_DBIT 0 ' Starting Data bit
DEFINE LCD_RSREG PORTB ' LCD Register Select port
DEFINE LCD_RSBIT 4 ' LCD Register Select bit
DEFINE LCD_EREG PORTB ' LCD Enable port
DEFINE LCD_EBIT 5 ' LCD Enable bit
DEFINE LCD_BITS 4 ' LCD bus size
PAUSE 100 ' Wait for LCD to startup

DQ VAR PORTC.0 ' Outside 18B20 Data Pin

'R_Temp VAR WORD ' RAW Temperature
'TempC VAR WORD ' Integer part of temp in deg C
'TempC1 VAR WORD ' Decimal part
'ColdBit VAR R_Temp.Bit11
ColdBit1 VAR temptemp1.bit11 ' Sign-Bit for +/- Temp. (1 - minus, 0 - plus)
Sign VAR BYTE
tempcel1 var word
tempdes1 var word
tempdat1 var word
temptemp1 var word
TRISC = %11111111 ' Set PORTÑ to all input
LCDOUT $FE, 1
main:
LCDOUT $FE, $80, 5, Sign, DEC2 TempCel1, ".", DEC1 Tempdes1, 3, 4
LCDOUT $FE,$c0, bin temptemp1
gosub calctemp
GOTO main
calctemp:
OWOUT DQ, 1, [$CC, $44] ' Skip ROM & start conversion
OWOUT DQ, 1, [$CC, $BE] ' Skip ROM & read temperature
OWIN DQ, 2, [temptemp1.Lowbyte, temptemp1.Highbyte]
gosub selsign
return
selsign:

if ColdBit1 <> 1 then
tempcel1 = temptemp1 / 16
tempdes1 = (temptemp1 // 16) * 10 / 16
else
tempcel1 = 65535 - temptemp1
tempdat1 = tempcel1 + 1
tempcel1 = tempdat1 / 16
tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16
endif
return
end

Добавлено (03.02.2011, 17.32.14)
---------------------------------------------
схема не вставляется

Matrix252005 Дата: Чт, 03.02.2011, 17:33  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

А где файл "DSN"??? Какой Вы используете экран??? Вы пробовали то, что я Вам скинул???

THE TRUTH IS OUT THERE.

С уважением, Николай.
hopi Дата: Чт, 03.02.2011, 17:41  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 09.12.2008

Статус: Offline

Николай! Ваш вариант работает!!!!!!!
Иду разбираться)))
СПАСИБО

Сообщение отредактировал hopi - Чт, 03.02.2011, 17:43
Matrix252005 Дата: Чт, 03.02.2011, 17:42  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

То что Вам нужно???

THE TRUTH IS OUT THERE.

С уважением, Николай.
hopi Дата: Чт, 03.02.2011, 17:45  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 09.12.2008

Статус: Offline

Пока что этого хватит. Посмотрим как на готовом устройстве будет работать cool
Matrix252005 Дата: Чт, 03.02.2011, 17:46  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Должно быть все good

THE TRUTH IS OUT THERE.

С уважением, Николай.
rvstar Дата: Пт, 04.02.2011, 23:32  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 60
Репутация: 2   ±
Замечания:   ±
На сайте с 09.10.2007

Статус: Offline

Попробуйте вытащить отсюда. программа под 876А, 100 % рабочая, сделано несколько сотен проектов

Добавлено (04.02.2011, 23.32.51)
---------------------------------------------
P.S. На сигнальную ногу датчика надо подвесить подтягивающий резистор 4К7

Прикрепления: water_counter-P.pbp(5Kb)
hopi Дата: Пн, 07.02.2011, 11:58  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 09.12.2008

Статус: Offline

обязательно гляну.спасибо
Форум Picbasic.ru » Программирование МК » PicBasicPro » 16f876a & ds18b20 (не правильно отображается Т)
Страница 1 из 11
Поиск: