Страница 41 из 59

Re: Всё по DS18(B/S)20.

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

Re: Всё по DS18(B/S)20.

Добавлено: Вс июн 28, 2015 00:32:11
Bkmz
Для меня вывод один: на больших минусах врет. Ближе к нулю и выше норамльно. В качестве регулятора температуры в холодильнике пойдет

Re: Всё по DS18(B/S)20.

Добавлено: Вс июн 28, 2015 07:18:44
BOB51
Врет не более, чем указано в характеристике. Просто выждать надо минутку-две от момента стабилизации показаний. Да и сам холодильник/морозильник штука с гистерезисом в минимум 4 градуса от точки включения компрессора до достижения максимальной температуры после его отключения.
Плюс зависимость от загрузки рабочего объёма и разница в расположении измерительных головок датчиков.
:beer:
И не забудь про задержку перед повторным включением компрессора - иначе движку аллес капут будет.
8)

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С почему-то :dont_know: Холодновато будет... :) При нагревании растёт.

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 писал(а):теперь температура адекватная
Теперь ещё на отрицательную температуру надо проверить :)))