Страница 41 из 59
Re: Всё по DS18(B/S)20.
Добавлено: Сб июн 27, 2015 04:55:06
BOB51
А с чем сравниваем-то? Холодильник вроде не прозрачный...

А любое расстояние между головкой контрольного термометра и датчиком уже может дать погрешность. Плюс инерционность до одной минуты ( а то и более ) за счет теплоотвода в виде массы корпуса, кондера, изоляционных материалов и подводящих проводников. И на закусь характеристики разброса параметров из даташита +/-0.5С... Бывает даже между двумя датчиками расхождение. Собственно каждый будет в абсолютной повторяемости измеренное значение держать, но относительно эталона то значение может отличаться в +/- пол градуса.
Ежли датчик запытать охота - попробуй вот эту игрушку сваять
http://radiokot.ru/forum/download/file.php?id=209413
правда датчик там ds18b20 и 12-битовый диапазон при замере (без округления - дробная часть просто внаглую не учитывается при индикации).
И ещё... не забывать о правилах округления...
Даже если индикация только с точностью до целых, всегда есть дробная часть которая и является причиной "бытовых споров" о расхождении с бытовыми термометрами от одного до двух градусов. Особо с отрицательными - минус 4,4 это -4, а -4,5 уже -5. В простейших программах такие требования не учитываются, так что по факту большинство любительских программ дают точность показаний +/-1 градус.

Re: Всё по DS18(B/S)20.
Добавлено: Вс июн 28, 2015 00:32:11
Bkmz
Для меня вывод один: на больших минусах врет. Ближе к нулю и выше норамльно. В качестве регулятора температуры в холодильнике пойдет
Re: Всё по DS18(B/S)20.
Добавлено: Вс июн 28, 2015 07:18:44
BOB51
Врет не более, чем указано в характеристике. Просто выждать надо минутку-две от момента стабилизации показаний. Да и сам холодильник/морозильник штука с гистерезисом в минимум 4 градуса от точки включения компрессора до достижения максимальной температуры после его отключения.
Плюс зависимость от загрузки рабочего объёма и разница в расположении измерительных головок датчиков.
И не забудь про задержку перед повторным включением компрессора - иначе движку аллес капут будет.

Re: Всё по DS18(B/S)20.
Добавлено: Вс июн 28, 2015 07:48:15
-=Vovka=-
На всякий случай уточню: задержка между включениями двигателя минимум 3 минуты, лучше 5
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 11:51:38
Dmitriy Karpov
Народ, неделю мучаю датчик - не сдаётся

, вернее не отвечает. Подскажите, может что не так делаю.
Датчик 18B20 в железной капсуле с метровым хвостом, подключение 3 проводное, подтяжка 4к7.
Пишу на pic16 asm. Приведу сначала все подпрограммы, что я написал. Подпрограммы задержек приводить не буду. Там все как часы

Кварц 4 МГц.
Спойлер
Код: Выделить всё
Wire1_Reset
bcf INTCON, GIE ; запрещаем прерывания
call Wire1_0
call pause_505us
call Wire1_Z
call pause_64us
btfss PORTC, RC2
bsf flags, slave_pres
btfsc PORTC, RC2
bcf flags, slave_pres
call pause_499us
bsf INTCON, GIE ; разрещаем прерывания
return
Wire1_Send_byte ; отправка байта
movlw .8 ; байт должен лежать в W1B
movwf count
bcf INTCON, GIE ; запрещаем прерывания
r1 call Wire1_0
btfsc W1B, 0
call Wire1_Z
rrf W1B
call pause_64us
call Wire1_Z
decfsz count
goto r1
bsf INTCON, GIE ; разрещаем прерывания
return
Wire1_Recieve_byte ; приём байта
movlw .8 ; байт будет лежать в W1B
movwf count
bcf INTCON, GIE ; запрещаем прерывания
r2 call Wire1_0
call Wire1_Z
btfss PORTC, RC2
bcf W1B, 7
btfsc PORTC, RC2
bsf W1B, 7
rrf W1B
call pause_64us
decfsz count
goto r2
bsf INTCON, GIE ; разрещаем прерывания
return
Wire1_0
banksel TRISC
bcf TRISC, RC2 ; в порт уже записан 0 при инициализации
banksel PORTC
return
Wire1_Z
banksel TRISC
bsf TRISC, RC2
banksel PORTC
return
Теперь собственно что я делаю.
Код: Выделить всё
call Wire1_Reset
btfss flags, slave_pres
call DS18B20_ERROR ; индикация; из этой подпрограммы не выходит
movlw 0xCC ; команда "skip rom"
movwf W1B ; так как датчик на шине всего один
call Wire1_Send_byte
movlw 0x44 ; команда "convert t"
movwf W1B
call Wire1_Send_byte
call pause_1s
movlw 0xBE ; команда "read scratchpad"
movwf W1B
call Wire1_Send_byte
call Wire1_Recieve_byte
movf W1B, W
movwf LSB
call Wire1_Recieve_byte
movf W1B, W
movwf MSB
call Wire1_Reset ; нужны только первые 2 байта, останавливаем передачу
В итоге импульс Presence я получаю, когда датчик подключен и получаю сообщение об ошибке, когда не подключен. Все нормально.
Далее пропускаю ром-код и шлю команду "начать преобразование". Жду секунду, считываю только первые 2 байта ОЗУ. Считывается число 127, т. е. все единицы. Очевидно, что команду он не распознал. Либо косяки в подпрограммах, но я уже много раз все перепроверил. Не могу понять в чем дело.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 11:55:45
Gudd-Head
Лол
пропускаю ром-код и шлю команду "начать преобразование". Жду секунду, считываю только первые 2 байта ОЗУ
А второй раз ресет и "скип ром" кидаете перед считыванием ОЗУ?
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:03:13
Dmitriy Karpov
Ну не пинайте сильно. Я еще не разобрался что к чему.
А ресетить надо после преобразования? Там в даташите ресетят, но зачем непонятно. ОЗУ при ресете не стирается?
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:08:30
Gudd-Head
Dmitriy Karpov писал(а):А ресетить надо после преобразования?
Конечно надо. Посмотрите какие там красивые диаграммки состояний и поводите по ним пальчиком. Тогда вы поймёте что к чему надо посылать.
Dmitriy Karpov писал(а):Там в даташите ресетят, но зачем непонятно.
Чтобы легче было засинхриться, видимо. Другие устройства на шине ведь "спят", когда вы с одним общаетесь. Видимо, чтобы их пробудить.
Dmitriy Karpov писал(а): ОЗУ при ресете не стирается?
Только в паразитном (2-х проводном) режиме если передержать ресет. Тайминги есть в ДШ.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:27:32
Dmitriy Karpov
Вроде заработало. Только показывает 12С почему-то

Холодновато будет...

При нагревании растёт.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:35:50
Аlex
Ну, в Москве нынче не жарко. Осень пришла, аднака

Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:38:03
Dmitriy Karpov
Нет, это комнатная. Рядом китайские часы-градусник 23С показывают.
Думаю надо ему что-нить записать в ОЗУ и потом это считать и посмотреть что получится.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:47:59
Аlex
Контрольную сумму проверяете ? Возможно, данные кривые приходят.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:49:10
Gudd-Head
Dmitriy Karpov писал(а):Только показывает 12 °С почему-то
Наверное, это не он показывает, а вы так интерпретируете данные, которые он вам посылает

Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:53:38
Dmitriy Karpov
Оставляю такую вероятность, но я уже процедуры BIN_to_BCD и BCD_to_ASCII много раз проверял и десяток значений подставлял. Выводится все верно.
СRC пока еще не реализовал.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 12:58:34
Gudd-Head
Dmitriy Karpov писал(а):BIN_to_BCD и BCD_to_ASCII
Это хорошо. Только перед этим данные надо немножко подвигать.
Так что более верно для начала вывести в двоичном или HEX-формате и вручную пересчитать что же он присылает.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 13:03:42
Dmitriy Karpov
Да, двигаю
Код: Выделить всё
rrf MSB
rrf LSB
rrf MSB
rrf LSB
rrf MSB
rrf LSB
bcf STATUS, C
rrf LSB ; результат в LSB отправляю на дальнейшие преобразования
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 13:10:22
Gudd-Head
Не силён в ПИКовском АСМе. Я предложил вам для начала смотреть сразу первые два присылаемые байта.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 13:47:37
Dmitriy Karpov
Попробовал записать TH, TL и config и считать. Числа другие, причем в 2 раза меньше записанных (как и температура из LSB, MSB). Походу где-то я сдвигаю лишний раз.
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 14:19:00
Dmitriy Karpov
Ну да, в Wire1_Recieve_byte накосячил. Последний 8 сдвиг в цикле лишний. Надо либо обратно двигать, а лучше в carry писать и сдвигать
Код: Выделить всё
Wire1_Recieve_byte ; приём байта
movlw .8 ; байт будет лежать в W1B
movwf count
bcf INTCON, GIE ; запрещаем прерывания
r2 call Wire1_0
call Wire1_Z
btfss PORTC, RC2
bcf W1B, 7
btfsc PORTC, RC2
bsf W1B, 7
rrf W1B
call pause_64us
decfsz count
goto r2
rlf W1B ;!!!!!!!!!!!!!!!!!!!!!!!!
bsf INTCON, GIE ; разрещаем прерывания
return
В общем проблема решена, теперь температура адекватная.
Спасибо откликнувшимся!
Re: Всё по DS18(B/S)20.
Добавлено: Чт авг 20, 2015 14:20:28
Gudd-Head
Dmitriy Karpov писал(а):теперь температура адекватная
Теперь ещё на отрицательную температуру надо проверить
