Страница 1 из 1
ds18b20, Как задействовать функцию Alarm search?
Добавлено: Чт янв 13, 2011 11:46:02
Magicanin
Доброго времени суток Котам, Кошкам и Котятам
Пишу на Bascom как ни странно...
Нужен кусочек кода с применением команды 1wwrite &HEC. Никак немогу вразуметь где его вставить и как им пользоваться. Даташит не соотносится с Bascom, как только не пробовал. Может есть у кого наработки или предложения, весь googl перерыл, вплоть до китайских сайтов.
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Чт янв 13, 2011 12:09:59
ChipKiller
чтобы воспользоваться командой ALARM SEARCH [ECh] - нужно сначала задать необходимый диапазон температур. Для этого:
1 делаем сброс
2 передаем команду пропуск ПЗУ - SKIP ROM [CCh]
3 передаем команду запись WRITE SCRATCHPAD [4Eh] и пишем 3 байта, где 1 байт -Верхняя граница температуры, 2-ой байт - нижняя граница и 3-ий байт - регистр конфигурации.
.... и только после этого в ALARM SEARCH [ECh] есть смысл
Magicanin писал(а):Даташит не соотносится с Bascom
Даташит не соотносится ни с каким языком и если выбрали Bascom - это Ваше лично дело, но внимательного чтения Datasheetа никто не отменял.
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Чт янв 13, 2011 12:17:29
Magicanin
Программа моего устройства полностью готова (почти 700 строк)
Все задано и изменяемо.
Вот только не знаю как прочитать флаг с кажной DS'ки
Осталась только функия управления периферией
В даташите написано что эта функция аналогична поиску ROM и на этом все пояснения.
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Чт янв 13, 2011 13:25:41
ChipKiller
... что бы получить нормальный ответ - нужно задать нормальный вопрос ( я же не экстрасенс

) . Как я понял на одной линии висит несколько DS18b20.
Magicanin писал(а):Вот только не знаю как прочитать флаг с кажной DS'ки
флаг устанавливается аппаратно, после подачи команды CONVERT T [44h]
Magicanin писал(а):В даташите написано что эта функция аналогична поиску ROM и на этом все пояснения.
...а больше наверное и не нужно

Как DS18b20 может сообщить мастер-устройству на запрос ALARM SEARCH [ECh], что у него установлен бит тревоги? ... конечно только своим ROM-кодом (ведь если у нескольких датчиков установлен бит тревоги, то они ответят одновременно и на шине будет конфликт) именно поэтому
функция аналогична поиску ROM
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Чт янв 13, 2011 22:13:37
Magicanin
Может не экстрасенс но раз написано что "с каждой DS'ки" логично что она не одна.
Так же логично что она отвечает ROM'ом. Но поиск ROM'ов ведется командами 1wsearchfirst(), 1wsearchnext(). По другому не умеем.
Так же из даташита известно, флаг (0 or 1) устанавливается восьмым битом ригистров TH и TL.
В ответ на команду &hEC всегда 'FF'
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Чт янв 13, 2011 22:26:55
Magicanin
Насколько я понял Убийца Чипов

не знаком с Bascom-AVR, а даташиты по ангельски мы и сами читать умеем.
Теория понятная, как в коде написать - вот в чем вопрос.
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Пн авг 01, 2011 16:24:11
Pasipaka
Добрый день. Можно ли вопрос немного в сторону?
Моя проблема:
по команде searchrom F0 не отзываются Ds1820 сенсоры.
У меня на проводе 2 дачтика.
По сбросу они отзываются. При подаче команды searchrom F0, в ответ получаю: FF FF FF FF FF FF FF FE !!! Т.е. пакет, в котором все 1 за иссключением самого младшего бита - 0.
См. осцилограммы.
На команду readrom 33 датчики отзываются вместе и по отдельности каждый.
Что же не так?
Как много времени я убил... Уже думаю, что считаю ром каждого по отдельности и затем зашью в ПО, что не есть гуд. И тогда сразу буду к каждому обращаться, минуя их поиск.
Re: ds18b20, Как задействовать функцию Alarm search?
Добавлено: Вт авг 02, 2011 03:45:16
Magicanin
В моем случае на проводе 9 датчиков ds18b20, с ds1820 дел не имел.
Чтобы не запутаться я им присвоил порядковые номера и сохраняю в EEPROM контроллера в меню инициализации. При смене датчика запоминаю его снова. Как-то по-другому мне в голову не приходило.
Код: Выделить всё
Sub Init
Cls
Do
W = 1wirecount()
Dsid(1) = 1wsearchfirst()
If W > 0 Then
Locate 1 , 3 : Lcd "CeЅcop oІЅapy¶eЅ "
Locate 2 , 3
For L = 1 To 8
Lcd Hex(dsid(l))
Next
Locate 3 , 4 : Lcd "CoxpaЅёїД єaє:"
Wait 1
Do
If Left_ = 0 Then
Waitms 300
Incr P
If P > 9 Then P = 1
Elseif Right_ = 0 Then
Waitms 300
Decr P
If P < 1 Then P = 9
End If
Locate 4 , 2
If P = 1 Then Lcd " y»ёеa "
If P = 2 Then Lcd " ґapa¶ "
If P = 3 Then Lcd " ѕoґpeІ "
If P = 4 Then Lcd " єopёгop "
If P = 5 Then Lcd " ·a» "
If P = 6 Then Lcd "1№ є-p ѕoгaАa "
If P = 7 Then Lcd "1№ є-p oІpaїєa "
If P = 8 Then Lcd "2№ є-p ѕoгaАa "
If P = 9 Then Lcd "2№ є-p oІpaїєa "
Loop Until Menu_ = 0
L = P - 1
L = L * 8 'вычисление ячейки памяти
For M = 1 To 8
K = M + L
Value = Dsid(m)
Writeeeprom Value , K
Next M
Scw(1) = 30
Scw(2) = 35
Scw(3) = &B00111111
1wreset
1wverify Dsid(1)
1wwrite &H4E
For M = 1 To 3
1wwrite Scw(m)
Next M
Waitms 10
1wverify Dsid(1)
1wwrite &H48
1wreset
Locate 3 , 4 : Lcd "CoxpaЅeЅo єaє:"
Wait 2
Cls
Else
Locate 2 , 2 : Lcd "©cїaЅoіёїe ceЅcop"
End If
Loop
End Sub
...
...
Sub Style1
Locate 1 , 1 : Lcd "Teјѕepaїypa іЅeБЅЗЗ:"
Locate 2 , 1
Call Gettemperature(1)
Lcd "©»ёеa " ; Temp_sign ; X10 ; "," ; X01 ; Chr(3) ; " " 'текущая темп-ра
Locate 3 , 1
Call Gettemperature(2)
Lcd "Ўapa¶ " ; Temp_sign ; X10 ; "," ; X01 ; Chr(3) ; " " 'текущая темп-ра
End Sub
...
...
Sub Gettemperature(byval Numds As Byte)
L = Numds - 1
L = L * 8
For M = 1 To 8
K = M + L
Readeeprom Value , K
Dsid(m) = Value
Next M
1wverify Dsid(1)
If Err = 1 Then
'Lcd "Err " 'Err = 1 if something is wrong
X10 = 999
X01 = 9
Temperature = 999
'Call Write_eeprom(20 , 0 )
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(2) 'read bytes into array
Temperature = Makeint(sc(1) , Sc(2)) 'складываем старший с младшим байты
Temperature = Temperature * 10
Temperature = Temperature / 16
'If Temperature > 999 Then Temperature = 999
If Sc(2) > 127 Then 'если отрицательная температура
Minus = 1
Temp_sign = "-"
Temperature = Not Temperature 'инвертируем
Temperature = Temperature + 1 'добавляем еденичку (такая уж процедура...)
Else
Minus = 0
Temp_sign = "+"
End If
X10 = Temperature / 10
N_temp = X10 * 10
X01 = Temperature - N_temp
End If
End Sub
...