CRC в DS18B20

Обсуждаем цифровые устройства...
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: CRC в DS18B20

Сообщение watchmaker »

Ошибка в программе проявлялась бы постоянно, а тут когда попало и как правило в диапазоне температур 0..+8*С. Посылаю запрос ещё раз - данные правильные.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: CRC в DS18B20

Сообщение uldemir »

Ну значит или где-то память бьётся или считываете не то, всё одно - это, вероятнее всего, программная ошибка. При отсутствии питания датчик выдаёт +85, при недостатке питания завышает измеренную температуру. Возможно, вы не выдерживаете интервал измерения и считываете показания за рано. Вы после посылки команды на преобразование ведете проверку готовности датчика? или просто делаете таймоут?

Увы, у меня самого были программы, в которых я был "апсалютно уверен". Но тем не менее, при всплывании проблемы, оказывалось, что сам накосячил (Было так, что на шине не работал восьмой датчик - оказалось, в одном месте банк памяти не переключал. На малых кристаллах проблема не всплывала, так как там тех банков попросту не было и так и так писалось куда нужно, а при переносе на более крупный кристал - проблема всплыла).
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: CRC в DS18B20

Сообщение Albert_V »

Проверка по контрольной сумме - не панацея.
Просто, при проверке по CRC будет меньше ошибок, но это не спасёт от "проскока" ошибочных данных.
Постарайтесь найти и устранить причину получения ложных данных.
Это может быть как программная, так и аппаратная ошибка (включая прокладку провода для DS параллельно с силовыми кабелями).
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: CRC в DS18B20

Сообщение BOB51 »

watchmaker писал(а):Ошибка в программе проявлялась бы постоянно, а тут когда попало и как правило в диапазоне температур 0..+8*С. Посылаю запрос ещё раз - данные правильные.
Интервал между опросами держать надо.
8)
Реклама
Эиком - электронные компоненты и радиодетали
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: CRC в DS18B20

Сообщение watchmaker »

При отсутствии питания датчик выдаёт +85, при недостатке питания завышает измеренную температуру. Возможно, вы не выдерживаете интервал измерения и считываете показания за рано. Вы после посылки команды на преобразование ведете проверку готовности датчика? или просто делаете таймоут?
Насчёт +85 знаю - видел это на другом устройстве, когда был плохой контакт в разъёме под датчик. Тут же вся цепь запаяна и не имеет разъёмов. Таймаут ровно 1 секунда - этого должно хватать всегда. Если бы не хватало - ошибки летели бы с большой частотой, а не несколько раз в день при одном измерении в минуту, причём ошибка всегда одна и та же - к измеренной температуре добавляется +48. Подозреваю всё-таки битую память в датчике...
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Реклама
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: CRC в DS18B20

Сообщение ROMan2947 »

Здравствуйте!!!набросал функцию вычисления СRC8 для DS18b20 по 56 битам,прошу протестить и вынести вердикт))с калькуляторами чет не разобрался...не знаю чему верить)

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

int main()
{
	uint64_t DATA = 0xB8C53028;
	char polynomial_CRC8 = 0x8C;
	uint64_t intermediate = 0;
	char counter = 0;

	while (counter <= 55)
	{
		if (DATA & 1)

		{
			DATA >>= 1;
			intermediate = (DATA^polynomial_CRC8) & 0xFF;
			DATA >>= 8;
			DATA <<= 8;
			DATA |= intermediate;
			counter++;
		}
		else
		{
			DATA >>= 1;
			counter++;
		}
	}

	printf("0x%X",DATA);
	
	getch();
}
Реклама
Ответить

Вернуться в «Цифровая техника»