Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: ivan_fd  
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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

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

THE TRUTH IS OUT THERE.

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

Статус: Offline

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


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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 636
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

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

THE TRUTH IS OUT THERE.

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

Статус: Offline

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

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

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

Статус: Offline

обязательно гляну.спасибо
Legioner Дата: Пн, 27.11.2017, 05:15  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 39
Репутация: 0   ±
Замечания:   ±
На сайте с 22.08.2015

Статус: Offline

доброго дня, имеется проект на двух датчиках ds18b20 и pic16f876 все работает нормально, решил организовать что бы при одном из отключенном датчике на дисплей выводилась надпись "обрыв".
но при экспериментах выяснился такой факт. При отключении первого датчика на дисплее отображается температура обоих датчиков 0,1 а при отключении второго датчика на дисплей выводится значение 4095. прошу подсказки и указание на мои кривые руки. За код сильно не пинайте я только учусь. Отрывок из кода прилагаю.

Код
DEFINE OSC 8              'Назначение частоты генератора 8 МГц
define LCD_DREG PORTB     'Порт данных ЖКИ
define LCD_DBIT 0         'Вывод порта Бит данных ЖКИ
define LCD_RSREG PORTB    'Управление линией RS
define LCD_RSBIT 4        'Вывод порта линией RS
define LCD_EREG PORTB     'Управление линией E
define LCD_EBIT 5         'Вывод порта линией E
define LCD_BITS 4         'Разрядность шины данных
define LCD_LINES 2        'Количество строк ЖКИ
define LCD_COMMANDUS 2000 'Задержка перед посылкой данных
define LCD_DATAUS 50      'Задержка перед посылкой данных
define I2C_SDA PORTC.4    'Подключение часов к порту С
define I2C_SCL PORTC.3    'Подключение часов к порту С
'*******************************************************************************
TRISB = %11000000   'Установка порта В c 0 по 5 в состояние выхода а с 6 по 7 как вход
TRISC = %11111100   'Установка порта C в состояние выхода
'*******************************************************************************
TempDat1   VAR  WORD  ' RAW Temperature readings                    *
TempCel1   VAR  WORD  ' Переменная для температура целое значение дачик №1     *
TempDes1   VAR  WORD  ' Переменная для температура десят значение дачик №1     *
TempTemp1  VAR  WORD  ' Переменная для температура временное значение дачик №1 *
Busy1      VAR BIT         ' Busy Status-Bit                    *
Comm_Pin1  VAR   portB.6     ' Переменная к какому выходу подключен датчик №1   *
ColdBit1   VAR  TempTemp1.Bit11' Отрицательное значение температуры датчика №1 *   
'*******************************************************************************
TempDat2   VAR  WORD   ' RAW Temperature readings                    *
TempCel2   VAR  WORD   ' Переменная для температура целое значение дачик №2    *
TempDes2   VAR  WORD   ' Переменная для температура десят значение дачик №2    *
TempTemp2  VAR  WORD   ' Переменная для температура временное значение дачик №2*
Busy2      VAR BIT         ' Busy Status-Bit                    *
Comm_Pin2  VAR   portB.7     ' Переменная к какому выходу подключен датчик №2   *
ColdBit2   VAR  TempTemp1.Bit11' Отрицательное значение температуры датчика №2 *
'******************************************************************************* 
main:
ind = 1
gosub Temp                    'Перейти в подпрограмму Тemperatura                    'Задержка 20 мс
gosub Temp1                   'Перейти в подпрограмму Temperatura1 
ind = 0 
lcdout $FE,1
lcdout $FE,$0C,"Temp: ",dec tempcel1,",",dec tempdes1,"  ",dec tempcel2,",",dec tempdes2
pause 500 
'*******************************************************************************
Temp:                    'Начало подпрограммы Temperatura   
OWOUT Comm_Pin1, 1, [$CC, $44]                    
Wait_Up:                    
    OWIN Comm_Pin1, 4, [Busy1]                    '*
   if busy1 = 0 then                    
   goto wait_Up                    
   endif                    '*
    OWOUT Comm_Pin1, 1, [$CC, $BE]                    
    OWIN  Comm_Pin1, 2, [TempTemp1.Lowbyte, TempTemp1.Highbyte]                    
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                    
'*******************************************************************************  
Temp1:                    'Начало подпрограммы Temperatura1 
OWOUT Comm_Pin2, 1, [$CC, $44]                    '*  
Wait_Up1:                    
    OWIN Comm_Pin2, 4, [Busy2]                    '*
   if busy2 = 0 then                    
   goto wait_Up1                    
   endif                    '*
    OWOUT Comm_Pin2, 1, [$CC, $BE]                    
    OWIN  Comm_Pin2, 2, [TempTemp2.Lowbyte, TempTemp2.Highbyte]             
if ColdBit2 <> 1 then                    
    tempcel2 = temptemp2 / 16                    
    tempdes2 = (temptemp2 // 16) * 10 / 16                    
else                    
    tempcel2 = 65535 - temptemp1                    
    tempdat2 = tempcel2 + 1                    
    tempcel2 = tempdat2 / 16                    
    tempdes2 = ((tempdat2 + 1) // 16) * 10 / 16                    
endif                    
RETURN

Добавлено (27.11.2017, 05:15)
---------------------------------------------
Ребята здесь есть кто живой???

Прикрепления: 8155690.jpg (124.5 Kb) · 7365340.jpg (126.4 Kb)
xvovanx Дата: Пн, 27.11.2017, 09:22  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 332
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Legioner ()
Ребята здесь есть кто живой???

Ответил в другой теме про DS18B20
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: