Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 2«12
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с датчиком DS18B20 (Не преобразует)
Работа с датчиком DS18B20
Legioner Дата: Пн, 27.11.2017, 05:42  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Новенький
Сообщений: 15
Репутация: 0   ±
Замечания:   ±
На сайте с 22.08.2015

Статус: Offline

Доброго дня ребята так все же помогите разобраться как отследить неисправность датчика ds18b20 на неисправность и вывести надпись обрыв на дисплей. 
есть проект который работает в железе хочу добавить определение неисправности датчиков. Код прилагаю, сильно не пинайте.

Код
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
xvovanx Дата: Пн, 27.11.2017, 09:16  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 308
Репутация: 16   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Legioner ()
... как отследить неисправность датчика ds18b20 на неисправность и вывести надпись обрыв на дисплей. 
...я понимаю что надо добавить что то в код но не могу понять что.

Я делал так, если температура запредельная- значит ошибка
Прикрепления: 7903407.png(7Kb)
Legioner Дата: Пн, 27.11.2017, 09:21  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Новенький
Сообщений: 15
Репутация: 0   ±
Замечания:   ±
На сайте с 22.08.2015

Статус: Offline

xvovanx, Уважаемый ещё один вопрос как получить флаг ошибки датчика, из даташита вычитал что нужно получить его командой [ECh], но как это реализовать не понимаю.
Но ваш вариант проработаю!! Спасибо.
brown Дата: Пн, 27.11.2017, 12:38  |                                                                                                                Сообщение # 19
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 338
Репутация: 11   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Не претендую на оригинальность, потому что кусок кода определения наличия датчика был у кого то позаимствован:

Код
Start_Convert:
'------------- Presence sensor ---------------------------
    Low DQ_1
    DelayUS 500
    Input DQ_1
    DelayUS 70
    If DQ_1=0 Then
        Sensor = 0
        DelayUS 250
        OWrite   DQ_1, 1, [$CC, $44]' Skip ROM search & do temp conversion
    Else
        Sensor = 1  ' no sensor
        Return
    EndIf


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
xvovanx Дата: Пн, 27.11.2017, 22:01  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 308
Репутация: 16   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Legioner ()
как получить флаг ошибки датчика

В примере NO_PRES_bit это и будет флаг ошибки, добавляем в запрос еще один аргумент. NO_PRES это подпрограмма вывода ошибки на дисплей.

P.S. пример откопал у себя в архиве, код не мой, говори спасибо Mixas-у wink
Прикрепления: 5858210.png(30Kb)

Сообщение отредактировал xvovanx - Пн, 27.11.2017, 22:04
Legioner Дата: Вт, 28.11.2017, 15:55  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Новенький
Сообщений: 15
Репутация: 0   ±
Замечания:   ±
На сайте с 22.08.2015

Статус: Offline

Вчера по шаманил с бубном вот что у меня получилось, может коряво но в протеусе работает, в железе ещё не проверял.

Код
Temp:
output Comm_Pin1
LOW Comm_Pin1
pauseus 1200
input Comm_Pin1
pauseus 120
if Comm_Pin1 = 1 then
    Avar_dat1 = 0                   
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
else
    Avar_dat1 = 1
    return
    endif


Добавлено (28.11.2017, 15:55)
---------------------------------------------
А в железе все же иначе. Это рабочая в железе.

Код
Temp: 
output Comm_Pin1 
LOW Comm_Pin1
pauseus 1200
input Comm_Pin1
pauseus 120
if Comm_Pin1 = 0 then
    Avar_dat1 = 0                    
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 
else
    Avar_dat1 = 1
    return
    endif

Сообщение отредактировал Legioner - Вт, 28.11.2017, 15:56
xvovanx Дата: Вт, 28.11.2017, 17:52  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 308
Репутация: 16   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Legioner ()
Вчера по шаманил с бубном вот что у меня получилось

Нормалёк.
P.S. ну, для полного счастья, дальше осталось еще поплясать с бубном и с несколькими датчиками на одной шине, так сказать пошаманить с ID датчиков biggrin

Сообщение отредактировал xvovanx - Вт, 28.11.2017, 17:53
Legioner Дата: Вт, 28.11.2017, 19:32  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Новенький
Сообщений: 15
Репутация: 0   ±
Замечания:   ±
На сайте с 22.08.2015

Статус: Offline

xvovanx,  :) это интересно, надо читать как получить адреса датчиков что бы их по одной шине опрашивать.
xvovanx Дата: Вт, 28.11.2017, 23:43  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 308
Репутация: 16   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Legioner ()
надо читать как получить адреса датчиков что бы их по одной шине опрашивать

Там ничего сложного нет. Изначально поочередно подключаем датчики и делаем запрос их ID кода. Узнав таким образом ID всех датчиков, прописываем эти ID в команды. Тот датчик, чей код совпал, отвечает, остальные молчат и так перебираем опросами все датчики. Вот пара примеров с подробными комментариями, в одном устройстве подключал сразу 3 датчика на один вход.
Прикрепления: _DS18B20__1-Wir.bas(3Kb) · 2x_DS18B20__1-W.bas(4Kb)
Legioner Дата: Ср, 29.11.2017, 13:51  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Новенький
Сообщений: 15
Репутация: 0   ±
Замечания:   ±
На сайте с 22.08.2015

Статус: Offline

xvovanx, Спасибо вам огроменное!!!!! Блин вы просто человечище!!!!!
xvovanx Дата: Ср, 29.11.2017, 17:56  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 308
Репутация: 16   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Legioner ()
xvovanx, Спасибо вам огроменное!!!!! Блин вы просто человечище!!!!!

Для таких громких высказываний есть тихий плюсик в репутации wink
Прикрепления: 0677604.png(27Kb)

Сообщение отредактировал xvovanx - Ср, 29.11.2017, 17:57
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с датчиком DS18B20 (Не преобразует)
Страница 2 из 2«12
Поиск: