CRC в DS18B20
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: CRC в DS18B20
Ошибка в программе проявлялась бы постоянно, а тут когда попало и как правило в диапазоне температур 0..+8*С. Посылаю запрос ещё раз - данные правильные.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
- Реклама
Re: CRC в DS18B20
Ну значит или где-то память бьётся или считываете не то, всё одно - это, вероятнее всего, программная ошибка. При отсутствии питания датчик выдаёт +85, при недостатке питания завышает измеренную температуру. Возможно, вы не выдерживаете интервал измерения и считываете показания за рано. Вы после посылки команды на преобразование ведете проверку готовности датчика? или просто делаете таймоут?
Увы, у меня самого были программы, в которых я был "апсалютно уверен". Но тем не менее, при всплывании проблемы, оказывалось, что сам накосячил (Было так, что на шине не работал восьмой датчик - оказалось, в одном месте банк памяти не переключал. На малых кристаллах проблема не всплывала, так как там тех банков попросту не было и так и так писалось куда нужно, а при переносе на более крупный кристал - проблема всплыла).
Увы, у меня самого были программы, в которых я был "апсалютно уверен". Но тем не менее, при всплывании проблемы, оказывалось, что сам накосячил (Было так, что на шине не работал восьмой датчик - оказалось, в одном месте банк памяти не переключал. На малых кристаллах проблема не всплывала, так как там тех банков попросту не было и так и так писалось куда нужно, а при переносе на более крупный кристал - проблема всплыла).
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: CRC в DS18B20
Проверка по контрольной сумме - не панацея.
Просто, при проверке по CRC будет меньше ошибок, но это не спасёт от "проскока" ошибочных данных.
Постарайтесь найти и устранить причину получения ложных данных.
Это может быть как программная, так и аппаратная ошибка (включая прокладку провода для DS параллельно с силовыми кабелями).
Просто, при проверке по CRC будет меньше ошибок, но это не спасёт от "проскока" ошибочных данных.
Постарайтесь найти и устранить причину получения ложных данных.
Это может быть как программная, так и аппаратная ошибка (включая прокладку провода для DS параллельно с силовыми кабелями).
Re: CRC в DS18B20
Интервал между опросами держать надо.watchmaker писал(а):Ошибка в программе проявлялась бы постоянно, а тут когда попало и как правило в диапазоне температур 0..+8*С. Посылаю запрос ещё раз - данные правильные.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: CRC в DS18B20
Насчёт +85 знаю - видел это на другом устройстве, когда был плохой контакт в разъёме под датчик. Тут же вся цепь запаяна и не имеет разъёмов. Таймаут ровно 1 секунда - этого должно хватать всегда. Если бы не хватало - ошибки летели бы с большой частотой, а не несколько раз в день при одном измерении в минуту, причём ошибка всегда одна и та же - к измеренной температуре добавляется +48. Подозреваю всё-таки битую память в датчике...При отсутствии питания датчик выдаёт +85, при недостатке питания завышает измеренную температуру. Возможно, вы не выдерживаете интервал измерения и считываете показания за рано. Вы после посылки команды на преобразование ведете проверку готовности датчика? или просто делаете таймоут?
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
- Реклама
- ROMan2947
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб янв 23, 2016 00:59:59
- Откуда: Чебоксары
Re: CRC в DS18B20
Здравствуйте!!!набросал функцию вычисления С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();
}

