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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Ещё, небольшие замечания по программе.
1. Для чего Вы в конце каждого тайм-слота переводите шину на выход ? Она должна оставаться в высокоимпедансном состоянии.
2. Ошибочка в DS_RX. :

Код: Выделить всё

	DS=0;
	DSIO=1;
При таком раскладе, линия в ноль не опустится.
Да и в DS_TX таже петрушка.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Аlex писал(а):Там же всё просто. старший бит отвечает за знак, остальное - данные.
Можно делать вообще просто. Перекидывайте оба принятых байта в знаковую int и в ней будет лежать готовая знаковая температура.
там еще проще: в первых двух байтах уже находится значение температуры в формате int - в дополнительном коде! не надо никуда ничего переносить вообще, только скорректировать "дробную часть", если необходимо!

Код: Выделить всё

unsigned char scratchpad[9]; // в этот массив вы считываете из датчика данные
int *temperature = scratchpad; // а здесь автоматически будет получаться температура!!!!
// когда проверите, что все считано верно (CRC корректна), можете использовать температуру напрямую
printf("T=%d", *temperature/2); // деление на 2 - это отбрасывание "дробной части" для DS1820
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

ARV писал(а):там еще проще: в первых двух байтах уже находится значение температуры в формате int - в дополнительном коде!
Ну я это и имел в виду, только сказал другими словами, более понятными новичку. И с указателями не стал грузить человека, а то он окончательно запутался бы :)

Код: Выделить всё

int *temperature = scratchpad; // а здесь автоматически будет получаться температура!!!!
Немного поправлю, если Вы не против :

Код: Выделить всё

int *temperature = (int *)scratchpad;
:)


Я также делаю.

Код: Выделить всё

*((char*)&tmp)= arr[0];
*((char*)&tmp+1)= arr[1];
tmp*=10; 
tmp/=(dev_fam==0x10)?2:16;
В tmp лежит температура.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Аlex писал(а):Немного поправлю, если Вы не против :

Код: Выделить всё

int *temperature = (int *)scratchpad;
:)
я не против :) по-вашему, разумеется, более корректно, однако warning - не error все-таки :))) третий сорт - не брак :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

ARV писал(а):однако warning - не error все-таки :)))
:))) Согласен. Но варниниги, мне например, глаза режут 8)
Да и мало ли, кто-нибудь воткнёт этот кусок кода себе в программу, и будет глядя на варнинги вспоминать Вас - мол пришёл кто-то и показав язык с пятачком напостил кривой код :)))
Реклама
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Аlex писал(а): Для чего Вы в конце каждого тайм-слота переводите шину на выход ? Она должна оставаться в высокоимпедансном состоянии.
Спасибо огромное! Переделал. Все заработало как надо!
Спойлер

Код: Выделить всё

void DS_TX (unsigned char dsd){
	unsigned char b;
	DSIO=0;
	for (b=1; b<9; b++){
		DS=0;
	__delay_us(10);
		if (dsd&0b00000001) DS=1;
		dsd=dsd>>1;
	__delay_us(50);
	DS=1;
		}
	DSIO=1;
}

Код: Выделить всё

unsigned char DS_RX(void){
	unsigned char a, b;
	for (b=0; b<8; b++){
DSIO=0;
	DS=0;
	DSIO=1;
	__delay_us(10);
	a=a>>1;
	if (DS==1) a=a|(1<<7);
	__delay_us(50);
//	DSIO=0;
	}
	return a;	
}
Я бы сказал это было не небольшое замечание, а главное.
С остальным кодом займусь позже.
P.S. проверил на отрицательных температурах, тоже все нормально. Выходит в документациях ошибка. В протеусе верно. А именно: 11111111 = -0.0, 11111110 = -0.5, 11111101 = -1.0, 11111100 = -1,5 и т.д.
Реклама
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

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

Сообщение -=Vovka=- »

Bkmz писал(а):11111111 = -0.0
:)))
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

-=Vovka=- писал(а):
Bkmz писал(а):11111111 = -0.0
:)))
А что удивительного? Это значит температура в диапазоне от 0 до -0.4
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Допкод как раз и придумали чтобы избавиться от проблемы "+0" и "-0".
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Gudd-Head писал(а):Допкод как раз и придумали чтобы избавиться от проблемы "+0" и "-0".
Получается в Протеусе ошибка? И -0.0 это на самом деле все же -0.5? Похоже придется зимы ждать что бы сравнить с нормальным градусником :))
p.s. сравнил с обычным градусником в плюсе совпадают, затолкал в морозилку. Жду результата.
Последний раз редактировалось Bkmz Вт июн 23, 2015 11:15:47, всего редактировалось 1 раз.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Bkmz писал(а):Получается в Протеусе ошибка?
С быдлокодом может быть всё что угодно.
Bkmz писал(а):Похоже придется зимы ждать что бы сравнить с нормальным градусником
Морозилки нету, что ли?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Вот результаты испытаний. Обычный градусник -19. Домашняя метеостанция -19,2. DS18S20 -17,5. Если верить даташиту, а не протеусу, то будет -18,0. И это ближе к правильному значению. А в итоге получается, что он все же на 1 градус завышает в данном диапазоне.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

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

Сообщение -=Vovka=- »

А какое разрешение датчика выставлено?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Bkmz писал(а):Вот результаты испытаний. Обычный градусник -19. Домашняя метеостанция -19,2. DS18S20 -17,5. Если верить даташиту, а не протеусу, то будет -18,0. И это ближе к правильному значению. А в итоге получается, что он все же на 1 градус завышает в данном диапазоне.
А личку почитать?
8)
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

-=Vovka=- писал(а):А какое разрешение датчика выставлено?
По умолчанию.
BOB51 писал(а):А личку почитать?
Прочитал. Спасибо.

Все же переделаю я код с вышеописанными рекомендациями и именно по документации. И проведу еще раз испытания.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

BOB51 писал(а):А личку почитать?
8)
А тут написать ? 8)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

BOB51 почему-то любит всё через личку разруливать 8)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Видимо, какие-то сверхсекреты, о которых не должен знать никто 8)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Никаких секретов - от модераторов же "по шеямс" и получаю за повторы прописных истин. :shock: :facepalm:
Сначала полное значение данных (включая дробную часть) приводим к положительному значению (инверсия обеих байтов данных и плюс 1), а затем обрабатываем как кому удобнее раздельно целую и дробную части.
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Замучил я свой датчик. В морозилке показывает обычно на 1 градус больше (по модулю меньше) , чем обычный и домашняя метеостанция. Хотя были случаи, что он одинаково с метеостанцией показывал. Но бывало и обычный градусник еще меньше показывал. А что касается выше нуля, то там все хорошо.
Ответить

Вернуться в «Периферия»