Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с датчиком DS18B20 (Не преобразует)
Работа с датчиком DS18B20
MasterPic Дата: Сб, 21.05.2011, 17:38  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Здравствуйте все! Столкнулся с таким явлением: выполняю стандартную процедуру опроса датчика ds18b20 (взята из примеров на сайте rentron.com и других источников). Вот кусок кода опроса датчика и преобразования его ответа в читабельный вид:
Code

OWRITE Comm_Pin, 1, [$CC,$44] ;посылаем команды на начало преобразования температуры
OWRITE Comm_Pin, 4, [TempOk] 'ждем окончания преобразования
IF TempOk = 1 THEN
OWRITE Comm_Pin, 1, [$CC,$BE] 'если окончено, то
OREAD Comm_Pin, 2, [TEMP.LOWBYTE, TEMP.HIGHBYTE];считываем температуру
'************************Расчет реальной температуры из полученных данных***
IF cold_bit=1 THEN 'если бит полярности температуры =1, то
TempC = (~TEMP + 1)/16 'подсчитаем отрицательную температуру
IF ModeOne =1 THEN 'при отрицательной температуре в основном
FOR i = 1 TO 30 'режиме - показываем минус - как заставку
GOSUB Dis 'попеременно с показанием значения температуры
NEXT
ENDIF
ELSE 'если бит полярности температуры =0, то
TempC = TEMP/16 'подсчитаем положительную температуру
ENDIF
ENDIF

В протеусе работает нормально, показывает температуру.
Но в реальности я получаю только показания 85 градусов (это значение, установленное по умолчанию при включении датчика)
Какие могут быть предположения, что не так?
И еще попутный вопрос: как можно сократить время преобразования за счет сокращения точности? мне хватит точности в 0.5 градуса, а то и меньше.
Я посылаю команду такого вида:
OWRITE Comm_Pin, 1, [$CC,$4E,0,0,%00011111] - здесь я указываю датчику, что мне требуется точность в 9 бит (1 градус). В протеусе я вижу, что значение регистра Config датчика меняется, но значение температуры отправляется с точностью 0.0625.
Спасибо за внимание

Сообщение отредактировал MasterPic - Пн, 23.05.2011, 14:27
ЯНДЕКС Дата: 21.05.2011
ivan_fd Дата: Сб, 21.05.2011, 20:30  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Скорее всего вы не правильно его инициализируете. Посмотрите
мой код. Нужно было знать температуру в холодильнике, сделал быстренько на макетке.

В нем изменил точность на 0.5, как Вы и хотели. Все работает.
А дело было, скорее всего, что после того как Вы записали [$CC,$4E,0,0,%00011111] , не подали импульс сброса.

Прикрепления: LCD.rar(16Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
MasterPic Дата: Вс, 22.05.2011, 07:05  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Quote (ivan_fd)
А дело было, скорее всего, что после того как Вы записали [$CC,$4E,0,0,%00011111] , не подали импульс сброса.

А у вас и в реальности работает?
Дело в том, что в протеусе и уменя работает нормально. А строчку

Code

OWRITE Comm_Pin, 1, [$CC,$4E,0,0,%00011111]
я до этого не вставлял, тоже не работало. А что, разве через Owrite и Oread не работают? Или некорректно работают? Все равно гдето собака порылась. Не пойму где. На рентроне так указано, без записи этой строчки
ivan_fd Дата: Вс, 22.05.2011, 11:58  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Да работает в реальности, на макетке.

Только у меня была точность по умолчанию, 12 бит. Сейчас прошил под 9 бит, все пашет. Видно на фото.

Добавлено (22.05.2011, 11.53.05)
---------------------------------------------

Quote (MasterPic)
А что, разве через Owrite и Oread не работают? Или некорректно работают?

Почему не работают, работают. Просто я этот вариант делал раньше для одного проекта, отладил хорошо, потому и использую.
Да и Owrite и Oread, немного больше времени занимают.

Добавлено (22.05.2011, 11.58.46)
---------------------------------------------
Может весь код выставите, что бы понять?


Меня все время преследуют умные мысли...но я быстрее!!!
Сообщение отредактировал ivan_fd - Вс, 22.05.2011, 11:47
MasterPic Дата: Вс, 22.05.2011, 18:54  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Да термостат обыкновенный. Тестю в гараж. Ему в районе +15 нужно держать. Вот код. Это с учетом изменений. Посмотрел, на bascom также, импульс сброса передается, да и в даташите на 18B20 написано, что сброс надо давать:
Code

EDATA 15, 0 ;Установленная температура при первом включении - 15 градусов, гистерезис = 0
DEVICE 16F870 ;выбор микроконтроллера
XTAL=4 ;выбор осциллятора
DECLARE REMINDERS Off
ALL_DIGITAL = true
CONFIG CP_ALL, DEBUG_OFF, WRTE_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, PWRTE_ON, WDT_OFF, HS_OSC   

;*****************Блок определения глобальных переменных*******************
DIM SetTemp AS BYTE ;переменная для установки температуры
DIM TEMP AS WORD ;переменная для приема двоичного кода температуры
DIM TempC AS BYTE ;промежуточное значение температуры
DIM cold_bit AS TEMP.11 ;бит, отвечающий за полярность температуры
DIM DigitDisp AS BYTE ;Для результата табличного преобразования
DIM TempStat AS BYTE ;реальное значение температуры
DIM TimeDelCount AS BYTE ;переменная для цикла отображения времени
DIM TemperDelCount AS BYTE ;для цикла отображения температуры
DIM flag AS BYTE ;эта переменная для переключения режимов работы
DIM i AS BYTE ;переменная для цикла отображения заставки "--"
DIM Hyster AS BYTE ;переменная, хранящая значение гистерезиса
DIM A AS BYTE ;Установленная t - гистерезис
DIM B AS BYTE ;Установленная t + гистерезис
DIM coun AS BYTE ;Переменная для счетчика времени для возврата на гл. экран
DIM dot AS BYTE ;Переменная для отображения точки - индикатор нагрузки
DIM ModeOne AS flag.0 ;Первый режим - отображение текущей температуры
DIM ModeTwo AS flag.1 ;Второй режим - отображение установки температуры
DIM ModeThree AS flag.2 ;Режим установки гистерезиса

DIM flpress AS BIT ;Флаг, указывающий на то, что была нажата кнопка   
;переключения режимов "Меню"
DIM Chflag AS BYTE
DIM ChangeT AS Chflag.0
DIM ChangeH AS Chflag.1
SYMBOL T0IF = INTCON.2 ;бит-флаг, сигнализирующий о прерывании по таймеру 0
SYMBOL GIE = INTCON.7 ;бит глобального разрешения прерываний
SYMBOL ButtTemp = PORTB.4 ;кнопка меню
SYMBOL ButtTime = PORTB.5 ;кнопка увеличения значений и включения термостата   
SYMBOL Comm_Pin = PORTA.4 ;вход/выход данных датчика
SYMBOL Power = PORTB.3 ;выход управления нагрузкой
SYMBOL led = PORTB.2 ' светодиод
SYMBOL TMR1IE = PIE1.0 ' TMR1 Overflow Interrupt Enable
SYMBOL TMR1ON = T1CON.0 ' Timer1 ON
SYMBOL TMR1IF = PIR1.0 ' TMR1 Overflow Interrupt Flag
SYMBOL PEIE = INTCON.6 ; Peripheral Interrupt Enable
SYMBOL Start = 0
SYMBOL Finish = 1
SYMBOL PortOut = PORTC
SYMBOL DigH = PORTB.0
SYMBOL DigL = PORTB.1
;****************************Начальная инициализация****************************

PORTB = %00110000
PORTC = %00000000 ;Обнулим порты
PORTA = %00000000
TRISA = %11111111 ;Порт А 5,6,7 - на ввод - кнопки
TRISB = %00110000
TRISC = %00000000 ;порт Б - на выход - управление сегментами индикатора
OPTION_REG = %10000111 ;Подтягивающие резисторы на Порт Б- отключим
;таймер 0 - от внутреннего источника, предделитель x 256
TMR1L = $DC ' Значение младшего регистра TMR1
TMR1H = $0B ' Значение старшего регистра TMR1
T1CON = %00110000
TMR1IE = 1 ' Разрешение прерывания при переполнении TMR1 с частотой 2,000000 Гц
ON_INTERRUPT GOTO MYINT ;При аппаратном прерывании - переход на обработчик MYINT
INTCON = %11000000    ;Разрешаем прерывания от TMR1
GOTO MAIN    ;Переход на начало программы

; ***************Обработчик прерывания***********************************

MYINT:   
CONTEXT SAVE   
IF TMR1IF = 1 THEN
IF flpress = 1 THEN ;если была нажата кнопка, запускаем счетчик
INC coun ;который отсчитывает ~ 10 секунд и переводит прибор в
IF coun = 20 THEN ;основной режим - режим отображения температуры
coun = 0
flpress = 0 ;очищаем флаг нажатия кнопки
flag = 1 ;переменная flag отвечает за режим работы - возвращаем
ENDIF
ENDIF   
IF flag <> 1 THEN
TOGGLE led
ENDIF   
TMR1L = $DF ' Значение младшего регистра TMR1
TMR1H = $0B ' Значение старшего регистра TMR1
TMR1IF = 0 ;сбросить флаг прерывания от tmr1
ENDIF

CONTEXT RESTORE ;возврат из П/П прерывания

;*************************НАЧАЛО ПРОГРАММЫ***********************************
MAIN:   
;**********************инициализация переменных******************************
OWRITE Comm_Pin, 1, [$CC,$4E,0,0,%00011111] ;посылаем команды, чтобы указать датчику
GOSUB resetPulse ' что преобразовывать температуру надо с точностью 9 бит
flpress = 0   
flag = %00000001 ;установим режим - отображение температуры
Chflag = 0
SetTemp = EREAD 0 ;считаем записанное ранее значение температуры
Hyster = EREAD 1 ;значение гистерезиса
TMR1ON = 1
;**********************запуск циклического выполнения************************   
FOR i = 0 TO 2
DigL = 0
DigH = 0
PortOut=1   
GOSUB Dlay
PortOut=64
GOSUB Dlay
PortOut=8   
GOSUB Dlay
PortOut=64   
GOSUB Dlay
DigH = 1
DigL = 1   
NEXT
loop:   
;*********************Проверка нажатия кнопки "Меню"************************

IF ButtTime = 0 THEN ;проверяем, нажата ли кнопка "Меню" и если нажата
WHILE ButtTime = 0
GOSUB Dis ;запускаем отображение заставки
WEND
flpress = 1 ;ставим флаг нажатия кнопки и
coun = 0 ;обнуляем переменную coun для начала отсчета 10-секундного
;интервала, после чего программа вернется в основной
;режим работы - отображение температуры
flag = flag << 1 ; раз была нажата кнопка "Меню", значит нужно перейти   
; в следующий экран
IF flag > 4 THEN ;всего 3 режима работы, поэтому позиция бита режима
flag = 1 ;работы не должна превышать 3   
flpress = 0 ;сбросим флаг нажатой кнопки,   
coun = 0 ;потому, что мы вернулись в основной режим
ENDIF
ENDIF   

;**************************Считывание температуры***************************   

IF ButtTemp = 0 THEN IfPressButt
GOSUB resetPulse   
OWRITE Comm_Pin, 1, [$CC,$44] ;посылаем команды на
GOSUB resetPulse
OWRITE Comm_Pin, 1, [$CC,$BE] ;преобразование температуры   
OREAD Comm_Pin, 2, [TEMP.LOWBYTE, TEMP.HIGHBYTE];считываем температуру

;************************Расчет реальной температуры из полученных данных***
IF cold_bit=1 THEN ;если бит полярности температуры =1, то
TempC = (~TEMP + 1)/16 ;подсчитаем отрицательную температуру
IF ModeOne =1 THEN ;при отрицательной температуре в основном
FOR i = 1 TO 30 ;режиме - показываем минус - как заставку
GOSUB Dis ;попеременно с показанием значения температуры
NEXT
ENDIF
ELSE ;если бит полярности температуры =0, то   
TempC = TEMP/16 ;подсчитаем положительную температуру
ENDIF

;*************************Определение гистерезиса работы термостата********

A = SetTemp - Hyster ;вычислим гистерезис срабатывания - минимум
B = SetTemp + Hyster ;вычислим гистерезис срабатывания - максимум
IF flag = 1 THEN   
IF TempC < A THEN ;и если установленная t больше реальной   
;с учетом гистерезиса
Power = Start ;то включаем нагрузку
led = 1 ;и запятую в младшей цифре показаний   
ELSEIF cold_bit = 1 THEN ;или если t - отрицательная
Power = Start ;то включаем нагрузку
led = 1 ;и светодиод
ELSEIF TempC >= B AND TempC < 60 THEN ;а если реальная t больше установленной
Power = Finish ;то выключаем нагрузку
led = 0 ;и светодиод
ELSEIF TempC > 60 THEN
Power = Finish ;то выключаем нагрузку
TOGGLE led ;и запятую
GOSUB Dis
GOTO loop
ENDIF
ELSE
Power = Finish ;то выключаем нагрузку
ENDIF

IF ModeOne = 1 THEN ;если флаг режима отображения = 1,
GOSUB DisplayTemp ;то просто показываем реальную температуру   
ELSEIF ModeTwo = 1 THEN ;если включен режим 2,
GOSUB DispLoopTemp ;отображаем установку температуры
ELSEIF ModeThree = 1 THEN ;при 3 режиме   
GOSUB DisplayHyst ;показываем установку гистерезиса
ENDIF
IF ButtTemp = 1 THEN
IF ChangeT = 1 THEN   
EWRITE 0, [SetTemp] ;после этого запишем установленное значение температуры
ChangeT = 0   
ENDIF

IF ChangeH = 1 THEN   
EWRITE 1, [Hyster] ;запишем установленное значение гистерезиса
ChangeH = 0   
ENDIF
ENDIF
GOTO loop ;начинаем сначала

;***************************Подпрограмма обработки нажатия кнопок*************

IfPressButt:
IF ModeOne=1 THEN ;При основном режиме программа не будет реагировать   
GOSUB DisplayTemp ;на нажатия - просто отображаем температуру
ELSEIF ModeTwo = 1 THEN ;если включен режим установки температуры,
IF ButtTemp = 0 THEN ;то при нажатой кнопке ButTime
INC SetTemp ;увеличиваем значение температуры на 1 градус
IF SetTemp > 40 THEN SetTemp = 0 ;не будем устанавливать t > 40
ChangeT = 1
ENDIF

FOR TemperDelCount = 1 TO 20 ;для того,чтобы на индикаторе цифры не мелькали
GOSUB DispLoopTemp ;создаем небольшую задержку, в течение которой будет
NEXT ;отображаться значение устанавливаемой температуры   

ELSEIF ModeThree = 1 THEN ;Если включен режим установки гистерезиса, то

IF ButtTemp = 0 THEN ;при нажатой кнопке ButTime
INC Hyster ;увеличиваем значение гистерезиса на 1
IF Hyster > 9 THEN Hyster = 0 ;не будем устанавливать h > 9
ChangeH = 1
ENDIF

FOR TemperDelCount = 1 TO 20 ;Также небольшая задержка   
GOSUB DisplayHyst ;для отображения значения гистерезиса
NEXT   
ENDIF

flpress = 1 ;Устанавливаем флаг нажатия, если он был вдруг сброшен. Таким образом,
;при нажатии любой из кнопок 10-секундный интервал формируется заново
coun =0 ;сбросим счетчик 10-секундного интервала
GOTO loop ;начинаем цикл сначала   

;******************П/П отображения установленной температуры****************

DispLoopTemp:   
DigitDisp = SetTemp DIG 1;загружаем в переменную DigitDisp цифру из 2   
IF DigitDisp <> 0 THEN ;позиции 16-ричного значения устанавливаемой температуры
DigL = 1 ;выключаем младший разряд индикатора
DigH = 0 ;включаем старший разряд индикатора
GOSUB LOOK
ELSE
GOSUB SubDel ;переходим на П/П конвертации числа из переменной   
ENDIF ;DigitDisp в код 7-сегментного индикатора
DigitDisp = SetTemp DIG 0;то же самое для младшей цифры
DigH = 1 ;выключаем старший разряд индикатора
DigL = 0 ;включаем младший разряд индикатора   
GOSUB LOOK   
RETURN   

;***********************отображение действительной температуры**************

DisplayTemp:   
DigitDisp = TempC DIG 1 ;загружаем в переменную DigitDisp цифру из 4   
IF DigitDisp <> 0 THEN ;позиции 16-ричного значения реальной температуры
DigL = 1 ;выключаем младший разряд индикатора
DigH = 0 ;включаем старший разряд индикатора
GOSUB LOOK
ELSE
GOSUB SubDel ;переходим на П/П конвертации числа из переменной   
ENDIF ;DigitDisp в код 7-сегментного индикатора
DigitDisp = TempC DIG 0 ;то же самое для младшей цифры
DigH = 1 ;выключаем старший разряд индикатора
DigL = 0 ;включаем младший разряд индикатора

GOSUB LOOK ;переходим на П/П конвертации числа из переменной   
;DigitDisp в код 7-сегментного индикатора
;если dot = 128(%1000000) то загорается точка
RETURN   

;***************************Подпрограмма отображения заставки***************   

Dis:
PortOut = 64 ;код символа "-"
DigL = 1 ;выключаем младший разряд индикатора
DigH = 0 ;включаем старший разряд индикатора
GOSUB SubDel ;задержка
PortOut = 64 ;код символа "-"
DigH = 1 ;выключаем старший разряд индикатора
DigL = 0 ;включаем младший разряд индикатора   
GOSUB SubDel ;задержка   
RETURN

;*************************Подпрограмма отображения установки гистерезиса****

DisplayHyst:
PortOut = 118
DigL = 1 ;выключаем младший разряд индикатора
DigH = 0 ;включаем старший разряд индикатора
GOSUB SubDel ;задержка
DigitDisp = Hyster ;загружаем в DigitDisp значение гистерезиса
DigH = 1 ;выключаем старший разряд индикатора
DigL = 0 ;включаем младший разряд индикатора   
GOSUB LOOK ;переходим на П/П конвертации числа из переменной   
;DigitDisp в код 7-сегментного индикатора
RETURN
;*****************Подпрограмма конвертации числа в 7-сегментный код**********
LOOK:
;здесь в порт Б передается кодированное значение цифр, удобное для восприятия
;таблица для индикаторов с общим катодом   
PortOut= LOOKUP DigitDisp,[63,6,91,79,102,109,125,7,127,111]

;[192,249,164,176,153,146,130,248,128,144]- Это данные для работы с индикатором с общим анодом

;[63,6,91,79,102,109,125,7,127,111] - Это данные для работы с индикатором с общим катодом   
SubDel:
DELAYMS 5 ; задержка для показа цифры
PortOut=0 ; Очистим дисплей
RETURN ; возврат   

Dlay:
DELAYMS 167
RETURN

resetPulse:
LOW Comm_Pin 'Импульс сброса
DELAYUS 500 ' на время более 480 мкСек
INPUT Comm_Pin ' Установим на ввод, чтобы принять ответ от датчика
DELAYUS 100 ' Ответ длительностью около 60 мкСек
IF Comm_Pin = 0 THEN   
DELAYUS 400
ENDIF
RETURN
END   

Сообщение отредактировал MasterPic - Вс, 22.05.2011, 18:55
ivan_fd Дата: Пн, 23.05.2011, 00:02  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Первое, что бросается в глаза. После подачи команды старта температурного преобразования,

OWRITE Comm_Pin, 1, [$CC,$44] ;посылаем команды на
нужно ждать пока датчик преобразует температуру, а Вы сразу посылаете импульс сброса. Потому Вам приходит всегда 85 градусов.
Для 9 битного режима, это минимум 93.75 мс.


Меня все время преследуют умные мысли...но я быстрее!!!
demanik Дата: Пн, 23.05.2011, 00:28  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

У вас частота указана 4 а в фюзах стоит HS_OSC. Нужно XT_OSC.
Может и в этом причина.


Попробуй всё и вся... может быть пол...

MasterPic Дата: Пн, 23.05.2011, 02:28  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Quote (ivan_fd)
Первое, что бросается в глаза. После подачи команды старта температурного преобразования, OWRITE Comm_Pin, 1, [$CC,$44] ;посылаем команды на нужно ждать пока датчик преобразует температуру, а Вы сразу посылаете импульс сброса. Потому Вам приходит всегда 85 градусов. Для 9 битного режима, это минимум 93.75 мс.

Да это здесь так стоит. До этого я делал на 628A и делал измерение раз в секунду. Получается, датчик не преобразует температуру. Я его спалил нечаянно, сейчас на 870 делаю.

Quote (demanik)
У вас частота указана 4 а в фюзах стоит HS_OSC. Нужно XT_OSC. Может и в этом причина.

сейчас в реальности еще не проверял, потому что плату приходится под 870 разводить, но на 628 я делал на INT_OSC_NO_CLOCKOUT, то есть, я это учитывал. А сейчас еще в реальности не проверял. Скорей всего с такой конфигурацией проц не запустился бы, спасибо за замечание
ivan_fd Дата: Пн, 23.05.2011, 11:57  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 911
Репутация: 50   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (MasterPic)
Да это здесь так стоит. До этого я делал на 628A и делал измерение раз в секунду. Получается, датчик не преобразует температуру. Я его спалил нечаянно, сейчас на 870 делаю.

Если Вы делали на 628, что мешало залить тот код, что я Вам дал выше?
Я с 18в20 игрался и не раз сунул их не тем боком. А они все работали и работали.


Меня все время преследуют умные мысли...но я быстрее!!!
MasterPic Дата: Пн, 23.05.2011, 14:29  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Я прочитал ваш ответ уже после того, как спалил процессор. Читается нормально, а вот записываться и стираться никак не хочет. Я так понял, по MCLRE что-то прошло и все... sob
Володимир Дата: Пт, 15.07.2011, 22:54  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 85
Репутация: 3   ±
Замечания:   ±
На сайте с 22.04.2010

Статус: Offline

Здравствуйте, у меня два датчика температуры, используя код написаний ниже все работает. Подскажите как можно менять динамически номер вывода порта (DQ1,DQ2) чтобы не выполнять два раза один и тот же код для сокращения программы. Пробовал вместо DQ1,DQ2 ставить переменную "Dim DQ3 As Byte" а потом с помощю команд DQ3 = DQ1 DQ3 = DQ2 присваивать ей номера выводов, но в результате температура не считывается и на экран выводится ноль.

Подскижите, как сделать правильно.

Symbol DQ1 = PORTC.1 ' Подключить DS18S20 к выводу PORTc.1
Symbol DQ2 = PORTC.2 ' Подключить DS18S20 к выводу PORTc.2

Конфігурація датчика температури 1
OWrite DQ1, 1, START2, [$CC, $44] ' Послать датчику DS18S20 команду старта измерения температуры
While ORead DQ1, 4, START2 != 0 ' Если сигнал присутствия не получен перейти к метке NO_PRES:
Wend ' Выйти из цикла если получен сигнал "Присутствие"
OWrite DQ1, 1, START2, [$CC, $BE] ' Послать датчику DS18S20 команду чтения из ОЗУ датчика значения температуры
ORead DQ1, 2, START2, [C, C, C, C, temp2, C, C, C, C] 'Читать значение температуры
If temp2.5<>0 Or temp2.6<>0 Then
OWrite DQ1, 1, START2, [$CC, $4E, $0, $0, $0, $0, $9F] ' Конфігурація датчика DS18S20
OWrite DQ1, 1, START2, [$CC, $48] ' Конфігурація датчика DS18S20
EndIf
START2:

Конфігурація датчика температури 2
OWrite DQ2, 1, START3, [$CC, $44] ' Послать датчику DS18S20 команду старта измерения температуры
While ORead DQ2, 4, START3 != 0 ' Если сигнал присутствия не получен перейти к метке NO_PRES:
Wend ' Выйти из цикла если получен сигнал "Присутствие"
OWrite DQ2, 1, START3, [$CC, $BE] ' Послать датчику DS18S20 команду чтения из ОЗУ датчика значения температуры
ORead DQ2, 2, START3, [C, C, C, C, temp2, C, C, C, C] 'Читать значение температуры
If temp2.5<>0 Or temp2.6<>0 Then
OWrite DQ2, 1, START3, [$CC, $4E, $0, $0, $0, $0, $9F] ' Конфігурація датчика DS18S20
OWrite DQ2, 1, START3, [$CC, $48] ' Конфігурація датчика DS18S20
EndIf
START3:

Сообщение отредактировал Володимир - Пт, 15.07.2011, 23:05
mikrobot Дата: Вт, 29.01.2013, 10:04  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Новенький
Сообщений: 1
Репутация: 0   ±
Замечания:   ±
На сайте с 05.01.2013

Статус: Offline

Народ, такой вопрос, на LCD в протоне без проблем вывожу! А вот с SHIFTOUT через регистры на LED косяк! вот код!!!

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 1
DEFINE LCD_LINES 2

temperature VAR WORD
DQ VAR PORTB.3     
DS var PORTB.1
SH var PORTB.0
ST var PORTB.2
S1 var byte
S2 var byte
x1 var byte 
x2  var byte
SS  var byte

mainloop:
        OWOUT DQ, 1, [$CC, $44]

        pause 200

        OWOUT DQ, 1, [$CC, $BE]
        OWIN DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE]

        temperature = temperature */ 1600
        LCDOUT $fe, 1, DEC (temperature / 100), ".", dec2 temperature

        temperature = (temperature */ 461) + 3200
        LCDOUT $fe, $c0, DEC (temperature / 100), ".", DEC2 temperature, " F"

ss = temperature / 100
x1 = ss dig 0
x2 = ss dig 1

gosub deshifr

shiftout ds,sh,0,[S1,s2]
pulsout st,5

goto mainloop

deshifr:
lookup x1,[$03,$9F,$25,$0D,$99,$49,$41,$1F,$01,$09],S1
lookup x2,[$03,$9F,$25,$0D,$99,$49,$41,$1F,$01,$09],S2
return
end
Matrix252005 Дата: Вт, 29.01.2013, 10:20  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 676
Репутация: 36   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

А причем протон до РВР??? У протона свои операторы и своя ветка!!! Вы на каком языке пишете, Proton IDE или MicroCodeStudio (PBP)???

Если Вы хотите изучать Proton IDE, то ознакомьтесь с этим материалом!!! http://www.terrarus.ucoz.ru/proton_plus_ide/index.html

И так Вы не выведите на 7-ки инфу!!!! Посмотрите на форуме (если не найдете, скинем ссылки), как работать с 7-ками!!!


THE TRUTH IS OUT THERE.

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

Сообщение отредактировал Matrix252005 - Вт, 29.01.2013, 10:21
xvovanx Дата: Пт, 15.08.2014, 22:10  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 280
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Форумчане, добрый вечер!
Никто из Вас не занимался питанием DS18B20 в паразитном режиме? Имеется два провода, хотелось бы подключить два датчика на одну шину. Глянув в даташит, волосы зашевелились- раньше мельком глядел думал просто. Датчику давай еще запитку от +5 через ключевой транзистор, чтоб внутренняя емкость успевала зарядится. Да еще ключ этот закрывай в моменты записи, преобразования, чтоб шину на плюс не вешал. Может кто нибудь придумал что-то хитрое, чтоб упростить, скажем повесить на +5 через 1кОм, чтоб успевал зарядится, да команды чтения, преобразования делать реже с паузами?
ADMIN Дата: Пн, 18.08.2014, 04:31  |                                                                                                                Сообщение # 15
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Ну вот можно почитать. А вообще, я пробовал так подцеплять в гараже. Длина была не более 6 метров, но почему-то датчики практически сразу же упорно выходили из строя. Помню, штуки три перепробовал.:( Поэтому пришлось отказаться от такой схемы.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Работа с датчиком DS18B20 (Не преобразует)
Страница 1 из 11
Поиск: