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

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

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

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

	DS=0;
	DSIO=1;
При таком раскладе, линия в ноль не опустится.
Да и в DS_TX таже петрушка.

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

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

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

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

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

Добавлено: Пн июн 22, 2015 14:31: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 лежит температура.

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

Добавлено: Пн июн 22, 2015 14:45:18
ARV
Аlex писал(а):Немного поправлю, если Вы не против :

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

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

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

Добавлено: Пн июн 22, 2015 14:51:25
Аlex
ARV писал(а):однако warning - не error все-таки :)))
:))) Согласен. Но варниниги, мне например, глаза режут 8)
Да и мало ли, кто-нибудь воткнёт этот кусок кода себе в программу, и будет глядя на варнинги вспоминать Вас - мол пришёл кто-то и показав язык с пятачком напостил кривой код :)))

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

Добавлено: Пн июн 22, 2015 15:27:19
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 и т.д.

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

Добавлено: Вт июн 23, 2015 08:02:15
-=Vovka=-
Bkmz писал(а):11111111 = -0.0
:)))

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

Добавлено: Вт июн 23, 2015 11:00:57
Bkmz
-=Vovka=- писал(а):
Bkmz писал(а):11111111 = -0.0
:)))
А что удивительного? Это значит температура в диапазоне от 0 до -0.4

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

Добавлено: Вт июн 23, 2015 11:04:23
Gudd-Head
Допкод как раз и придумали чтобы избавиться от проблемы "+0" и "-0".

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

Добавлено: Вт июн 23, 2015 11:10:07
Bkmz
Gudd-Head писал(а):Допкод как раз и придумали чтобы избавиться от проблемы "+0" и "-0".
Получается в Протеусе ошибка? И -0.0 это на самом деле все же -0.5? Похоже придется зимы ждать что бы сравнить с нормальным градусником :))
p.s. сравнил с обычным градусником в плюсе совпадают, затолкал в морозилку. Жду результата.

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

Добавлено: Вт июн 23, 2015 11:12:55
Gudd-Head
Bkmz писал(а):Получается в Протеусе ошибка?
С быдлокодом может быть всё что угодно.
Bkmz писал(а):Похоже придется зимы ждать что бы сравнить с нормальным градусником
Морозилки нету, что ли?

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

Добавлено: Вт июн 23, 2015 14:12:56
Bkmz
Вот результаты испытаний. Обычный градусник -19. Домашняя метеостанция -19,2. DS18S20 -17,5. Если верить даташиту, а не протеусу, то будет -18,0. И это ближе к правильному значению. А в итоге получается, что он все же на 1 градус завышает в данном диапазоне.

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

Добавлено: Вт июн 23, 2015 14:29:11
-=Vovka=-
А какое разрешение датчика выставлено?

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

Добавлено: Вт июн 23, 2015 14:45:07
BOB51
Bkmz писал(а):Вот результаты испытаний. Обычный градусник -19. Домашняя метеостанция -19,2. DS18S20 -17,5. Если верить даташиту, а не протеусу, то будет -18,0. И это ближе к правильному значению. А в итоге получается, что он все же на 1 градус завышает в данном диапазоне.
А личку почитать?
8)

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

Добавлено: Вт июн 23, 2015 14:46:55
Bkmz
-=Vovka=- писал(а):А какое разрешение датчика выставлено?
По умолчанию.
BOB51 писал(а):А личку почитать?
Прочитал. Спасибо.

Все же переделаю я код с вышеописанными рекомендациями и именно по документации. И проведу еще раз испытания.

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

Добавлено: Вт июн 23, 2015 14:47:26
Аlex
BOB51 писал(а):А личку почитать?
8)
А тут написать ? 8)

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

Добавлено: Вт июн 23, 2015 14:50:05
Gudd-Head
BOB51 почему-то любит всё через личку разруливать 8)

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

Добавлено: Вт июн 23, 2015 15:15:05
Аlex
Видимо, какие-то сверхсекреты, о которых не должен знать никто 8)

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

Добавлено: Ср июн 24, 2015 19:13:09
BOB51
Никаких секретов - от модераторов же "по шеямс" и получаю за повторы прописных истин. :shock: :facepalm:
Сначала полное значение данных (включая дробную часть) приводим к положительному значению (инверсия обеих байтов данных и плюс 1), а затем обрабатываем как кому удобнее раздельно целую и дробную части.

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

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