Ds18b20 ошибка crc

Сообщения без ответов | Активные темы

Форум РадиоКот • Просмотр темы — CRC в DS18B20

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:08:56 

Друг Кота

Карма: 6

Рейтинг сообщений: 11

Зарегистрирован: Сб мар 07, 2009 20:44:36
Сообщений: 4435

Рейтинг сообщения: 0

Доброго времени суток. Прошу разъяснить мне, что такое CRC в далласовском датчике температуре DS18b20. Он, как я понял, определяет достоверность передаваемых данных. т.е. он защищает от опасности передачи ошибочных данных.
Но я не очень хорошо понимаю, как он работает..
Вот кусок про него из даташита:

Цитата:

CRC GENERATION
CRC bytes are provided as part of the DS18B20’s 64-bit ROM code and in the 9th byte of the scratchpad
memory. The ROM code CRC is calculated from the first 56 bits of the ROM code and is contained in the
most significant byte of the ROM. The scratchpad CRC is calculated from the data stored in the
scratchpad, and therefore it changes when the data in the scratchpad changes. The CRCs provide the bus
master with a method of data validation when data is read from the DS18B20. To verify that data has
been read correctly, the bus master must re-calculate the CRC from the received data and then compare
this value to either the ROM code CRC (for ROM reads) or to the scratchpad CRC (for scratchpad reads).
If the calculated CRC matches the read CRC, the data has been received error free. The comparison of
CRC values and the decision to continue with an operation are determined entirely by the bus master.
There is no circuitry inside the DS18B20 that prevents a command sequence from proceeding if the
DS18B20 CRC (ROM or scratchpad) does not match the value generated by the bus master.
The equivalent polynomial function of the CRC (ROM or scratchpad) is:
CRC = X8 + X5 + X4 + 1
The bus master can re-calculate the CRC and compare it to the CRC values from the DS18B20 using the
polynomial generator shown in Figure 9. This circuit consists of a shift register and XOR gates, and the
shift register bits are initialized to 0. Starting with the least significant bit of the ROM code or the least
significant bit of byte 0 in the scratchpad, one bit at a time should shifted into the shift register. After
shifting in the 56th bit from the ROM or the most significant bit of byte 7 from the scratchpad, the
polynomial generator will contain the re-calculated CRC. Next, the 8-bit ROM code or scratchpad CRC
from the DS18B20 must be shifted into the circuit. At this point, if the re-calculated CRC was correct, the
shift register will contain all 0s. Additional information about the Dallas 1-Wire cyclic redundancy check is available in Application Note 27: Understanding and Using Cyclic Redundancy Checks with Dallas
Semiconductor Touch Memory Products.


_________________
Не умеешь — не берись, но не взявшись не научишься…

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

ARV

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:25:18 

Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97

Рейтинг сообщений: 2031

Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 17884
Откуда: Новочеркасск

Рейтинг сообщения: 0

Медали: 2

Получил миской по аватаре (1)

Мявтор 3-й степени (1)

CRC вычисляется над всеми данными в пакете (адрес девайса или содержимое блокнотной памяти) по описанному алгоритму. в пакете данных последний байт — собственно значение CRC предыдущих байтов. если рассчитанное значение совпадает с принятым — данные не исказились.

можно и проще: вести подсчет CRC по алгоритму для всех байтов, включая последний байт контрольной суммы. если искажений не было, получится 0.


_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется…

скушно, бабоньки!

Вернуться наверх
Реклама

Arlleex

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:34:02 

Карма: 6

Рейтинг сообщений: 11

Зарегистрирован: Сб мар 07, 2009 20:44:36
Сообщений: 4435

Рейтинг сообщения: 0

т.е. вот у нас пакет:
хххх(CRC)
принимаем его мастером:
х
х
х
х
а в конце (CRC).
приняли байт CRC — рассчитали свое значение исходя из принятых xxxx и сопоставили с байтом CRC?
Если контрольная сумма 0, то все верно, если не 0, то данные принялись ошибочно?


_________________
Не умеешь — не берись, но не взявшись не научишься…

Вернуться наверх

ARV

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:37:16 

Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97

Рейтинг сообщений: 2031

Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 17884
Откуда: Новочеркасск

Рейтинг сообщения: 0

Медали: 2

Получил миской по аватаре (1)

Мявтор 3-й степени (1)

нет, идет пакет: A, B, C, D, E, F, CRC
так вот, вы считаете контрольную сумму A+B+C+D+F, и она должна быть равна CRC. либо вы считаете A+B+C+D+E+F+CRC и это должно быть равно 0. естественно, тут не простое сложение, а вычисление по алгоритму


_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется…

скушно, бабоньки!

Вернуться наверх
Реклама

Выгодные LED-драйверы для решения любых задач

КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения.

Подобрать LED-драйвер>>

Arlleex

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:44:34 

Карма: 6

Рейтинг сообщений: 11

Зарегистрирован: Сб мар 07, 2009 20:44:36
Сообщений: 4435

Рейтинг сообщения: 0

Так, вроди бы ясно становится.
А этот CRC есть в ROM-памяти и в блокнотной памяти. В блокнотной все данные складываются и получается там же девятым байтом CRC. И все это передаем по 1-Wire. А для чего в ROM и как там все передается?
Я правильно понимаю, что в ROM CRC нужен для достоверности передачи 8 байт ROM?


_________________
Не умеешь — не берись, но не взявшись не научишься…

Вернуться наверх
Реклама

Реклама

LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку

На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон.

Подробнее>>

ARV

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:46:01 

Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97

Рейтинг сообщений: 2031

Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 17884
Откуда: Новочеркасск

Рейтинг сообщения: 0

Медали: 2

Получил миской по аватаре (1)

Мявтор 3-й степени (1)

Stalker46 писал(а):

Я правильно понимаю, что в ROM CRC нужен для достоверности передачи 8 байт ROM?

да.


_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется…

скушно, бабоньки!

Вернуться наверх

Arlleex

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 10:54:59 

Карма: 6

Рейтинг сообщений: 11

Зарегистрирован: Сб мар 07, 2009 20:44:36
Сообщений: 4435

Рейтинг сообщения: 0

Все, большое спасибо, думаю, с этим вопросов больше нет.


_________________
Не умеешь — не берись, но не взявшись не научишься…

Вернуться наверх

Arlleex

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 11:08:36 

Карма: 6

Рейтинг сообщений: 11

Зарегистрирован: Сб мар 07, 2009 20:44:36
Сообщений: 4435

Рейтинг сообщения: 0

Формула, по которой считать, я так понял, следующая:
CRC = X8 + X5 + X4 + 1
Но что в ней за X?


_________________
Не умеешь — не берись, но не взявшись не научишься…

Вернуться наверх

ARV

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 11:12:06 

Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97

Рейтинг сообщений: 2031

Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 17884
Откуда: Новочеркасск

Рейтинг сообщения: 0

Медали: 2

Получил миской по аватаре (1)

Мявтор 3-й степени (1)

почитайте об алгоритме подсчета CRC — есть апноут особый на эту тему. кстати, в нем есть и функции на Си и др. для этого — возможно, станет понятнее, если посмотрите на код…

и вообще, есть готовые функции, например, в WinAVR — зачем лезть в дебри?


_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется…

скушно, бабоньки!

Вернуться наверх

Arlleex

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 11:16:59 

Карма: 6

Рейтинг сообщений: 11

Зарегистрирован: Сб мар 07, 2009 20:44:36
Сообщений: 4435

Рейтинг сообщения: 0

С WinAVR не работал, но посмотрю, спасибо за информацию :)


_________________
Не умеешь — не берись, но не взявшись не научишься…

Вернуться наверх

ChipKiller

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 11:43:11 

Сверлит текстолит когтями
Аватар пользователя

Карма: 4

Рейтинг сообщений: 30

Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163

Рейтинг сообщения: 0

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Ср июн 08, 2011 12:18:24 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1310

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7122
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

Вернуться наверх

TheShadow

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Чт июн 09, 2011 13:09:19 

Зарегистрирован: Чт июн 09, 2011 12:49:36
Сообщений: 2
Откуда: Тольятти

Рейтинг сообщения: 0

Здравствуйте все!
У меня вопрос к сведущим людям также насчет расчета CRC8. Вот функция нахождения CRC из фирменной библиотеки от Atmel для 1-wire (1-wire-avr-lib, файл OWIcrc.c):

Код:

unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{
    unsigned char bitsLeft;
    unsigned char temp;

    for (bitsLeft = 8; bitsLeft > 0; bitsLeft—)
    {
        temp = ((seed ^ inData) & 0x01);
        if (temp == 0)
        {
            seed >>= 1;
        }
        else
        {
            seed ^= 0x18;
            seed >>= 1;
            seed |= 0x80;
        }
        inData >>= 1;
    }
    return seed;   
}

Почему здесь как байт данных inData, так и байт контрольной суммы seed периодически сдвигаются вправо, то есть обработка битов начинается с младшего, хотя в указанных выше в этой теме апноутах приводится схема аппаратной реализации, где все начинается со старшего бита.
А также, почему здесь в качестве полинома присутствует 0х18, а не 0х31, который, как я понимаю, соответствует x^8+x^5+x^4+1. Или я неправильно понимаю?
Заранее спасибо.

Вернуться наверх

Мастер Ломастер

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Чт июн 09, 2011 13:27:44 

Поставщик валерьянки для Кота

Карма: 1

Рейтинг сообщений: 5

Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город

Рейтинг сообщения: 0

вот код из WinAVR-овской библиотеки, он проверен:

Код:

   uint8_t
    _crc_ibutton_update(uint8_t crc, uint8_t data)
    {
   uint8_t i;

   crc = crc ^ data;
   for (i = 0; i < 8; i++)
   {
       if (crc & 0x01)
           crc = (crc >> 1) ^ 0x8C;
       else
           crc >>= 1;
   }

   return crc;
    }


_________________
битва с дураками проиграна, победители торжествуют. слава победителям!

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Чт июн 09, 2011 13:39:03 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1310

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7122
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

обработка действительно идет с младшего бита. по поводу 0x8c, 0x18, 0x31 — они просто сдвинуты в зависимости от способа и места деления. В вами приведенном исходнике младший бит обрабатывается отдельно, а остальные ксорятся «ошметком» от полинома. Где-то так. Тут была тема, где еще более углубленно рассматривался CRC как таковой. Если интересует.


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

TheShadow

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Чт июн 09, 2011 23:20:44 

Зарегистрирован: Чт июн 09, 2011 12:49:36
Сообщений: 2
Откуда: Тольятти

Рейтинг сообщения: 0

Мастер Ломастер
Да, примеры у меня есть. Но вот вникнуть не очень получалось в них.

uldemir
Спасибо вам, погляжу еще.

Вернуться наверх

Laplaskin

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Вс окт 06, 2013 17:30:21 

Зарегистрирован: Пн апр 23, 2012 17:25:39
Сообщений: 4

Рейтинг сообщения: 0

Здравствуйте! Помогите разобраться с расчетом CRC на бумаге..
Пытаюсь почитать CRC последовательности ROM (D4C3B2A1) код семейства 28. Насколько я понимаю, сама последовательность должна выглядеть так: 28A1B2C3D4. В протеусе CRC получается 8F

CRC-калькулятор выдает такой жерезультат.

Вручную получается 1F почему-то..
как считаю: к 28A1B2C3D4 добавляю 8 нулей и делю на 100110001, 1F — остаток.
интересно еще, почему в симуляторе нельзя поставить код устройства больше 4 байт, по даташиту ведь 6 байт кода.. в общем пробовал и с двумя нулевыми байтами считать, все равно отличается результат.
Считаю как написано в книжке Ross N. Williams.
с другими последовательностями то же самое — симулятор с калькулятором солидарны, а у меня не выходит.. подскажите, где ошибка?

Вернуться наверх

Gerik_PP

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Вс апр 24, 2016 02:34:06 

Открыл глаза
Аватар пользователя

Зарегистрирован: Вт ноя 07, 2006 14:14:16
Сообщений: 59
Откуда: пос. Правдинский

Рейтинг сообщения: 0

Мастер Ломастер писал(а):

вот код из WinAVR-овской библиотеки, он проверен:

Код:

   uint8_t
    _crc_ibutton_update(uint8_t crc, uint8_t data)
    {
   uint8_t i;

   crc = crc ^ data;
   for (i = 0; i < 8; i++)
   {
       if (crc & 0x01)
           crc = (crc >> 1) ^ 0x8C;
       else
           crc >>= 1;
   }

   return crc;
    }

Спасибо большое! Очень помог, работает! :))

Вернуться наверх

watchmaker

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Вт фев 21, 2017 21:51:57 

Это не хвост, это антенна

Карма: 34

Рейтинг сообщений: 237

Зарегистрирован: Вс ноя 15, 2009 23:13:59
Сообщений: 1414
Откуда: Харьков

Рейтинг сообщения: 0

Вопрос по этому же датчику. Непериодически (раз десять в день при измерениях раз в минуту) он выдаёт некорректное значение температуры (например -48*), причём это значение не отсеивается по CRC, т. е. CRC соответствует неверным данным. С чем это может быть связано?


_________________
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге…

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC в DS18B20

СообщениеДобавлено: Вт фев 21, 2017 21:55:10 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1310

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7122
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

с ошибкой в программе


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

Кто сейчас на форуме

Сейчас этот форум просматривают: Never not try и гости: 16

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

PROBLEM DESCRIPTION

A clear and concise description of what the problem is.
on ESP32 precompiled build I got randomly CRC errors. I try to fix this on the hardware side, but also the software side may need an enhancement. I assume that there are magnetic problems though the motors that even a shielded cable does not help. Already tried 3.3V and 5V and different GPIO without getting rid of the hardware problem.

My problem is, that the status message just leave out the sensor, also if the problem to read the sensor in nearly all cases works the second time. For me it would help if the status reports the last value or at least try 3 times before skipping the sensor. There are 3 DS18B20 on onewire. Cable length is about 2m.

REQUESTED INFORMATION

Make sure your have performed every step and checked the applicable boxes before submitting your issue. Thank you!

  • [ x] Read the Contributing Guide and Policy and the Code of Conduct
  • [ x] Searched the problem in issues
  • [ x] Searched the problem in discussions
  • [ x] Searched the problem in the docs
  • [x ] Searched the problem in the chat
  • [ x] Device used (e.g., Sonoff Basic): ESP32 mini
  • [ x] Tasmota binary firmware version number used: _9.2.1.2
    • [x ] Pre-compiled
    • Self-compiled
  • Flashing tools used: _____
  • Provide the output of command: Backlog Template; Module; GPIO 255:
  Configuration output here:

  • If using rules, provide the output of this command: Backlog Rule1; Rule2; Rule3:
  • Provide the output of this command: Status 0:
  STATUS 0 output here:
14:44:29.033 MQT: hm/status/ESP_F50A98/STATUS1 = {"StatusPRM":{"Baudrate":115200,"SerialConfig":"8N1","GroupTopic":"tasmotas","OtaUrl":"http://ota.tasmota.com/tasmota32/release/tasmota32.bin","RestartReason":"Vbat power on reset","Uptime":"0T00:18:24","StartupUTC":"2021-04-26T12:26:05","Sleep":50,"CfgHolder":4617,"BootCount":158,"BCResetTime":"2021-03-22T13:28:42","SaveCount":2404}}
14:44:29.042 MQT: hm/status/ESP_F50A98/STATUS2 = {"StatusFWR":{"Version":"9.3.1.2(tasmota)","BuildDateTime":"2021-03-24T14:02:03","Core":"1_0_5","SDK":"v3.3.4-432-g7a85334d8","CpuFrequency":80,"Hardware":"ESP32","CR":"456/699"}}
14:44:29.049 MQT: hm/status/ESP_F50A98/STATUS3 = {"StatusLOG":{"SerialLog":4,"WebLog":4,"MqttLog":0,"SysLog":0,"LogHost":"","LogPort":514,"SSId":["BodeNet_Keller",""],"TelePeriod":30,"Resolution":"558180C0","SetOption":["0000C009","2805C8000100060000005A0A000000000000","40042080","00006000","00000000"]}}
14:44:29.069 MQT: hm/status/ESP_F50A98/STATUS4 = {"StatusMEM":{"ProgramSize":1276,"Free":1984,"Heap":218,"PsrMax":0,"PsrFree":0,"ProgramFlashSize":4096,"FlashSize":4096,"FlashFrequency":40,"FlashMode":3,"Features":["00000809","9FDAC787","00152001","B7FFBFCF","01DA9BC4","60360DC7","00084052","20200000","00000005"],"Drivers":"1,2,3,4,5,7,8,9,10,11,12,14,17,20,21,24,26,27,29,34,50","Sensors":"1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,28,31,34,37,39,40,42,43,51,52,55,56,58,59,64,66,67,74,85"}}
14:44:29.083 MQT: hm/status/ESP_F50A98/STATUS5 = {"StatusNET":{"Hostname":"ESP_F50A98-2712","IPAddress":"192.168.178.70","Gateway":"192.168.178.1","Subnetmask":"255.255.255.0","DNSServer":"192.168.178.1","Mac":"7C:9E:BD:F5:0A:98","Webserver":2,"WifiConfig":4,"WifiPower":17.0}}
14:44:29.092 MQT: hm/status/ESP_F50A98/STATUS6 = {"StatusMQT":{"MqttHost":"elocm.synology.me","MqttPort":1883,"MqttClientMask":"DVES_%06X","MqttClient":"DVES_F50A98","MqttUser":"ESP_F50A98","MqttCount":1,"MAX_PACKET_SIZE":1200,"KEEPALIVE":30,"SOCKET_TIMEOUT":4}}
14:44:29.103 MQT: hm/status/ESP_F50A98/STATUS7 = {"StatusTIM":{"UTC":"2021-04-26T12:44:29","Local":"2021-04-26T14:44:29","StartDST":"2021-03-28T02:00:00","EndDST":"2021-10-31T03:00:00","Timezone":99,"Sunrise":"06:37","Sunset":"20:57"}}
14:44:29.155 MQT: hm/status/ESP_F50A98/STATUS10 = {"StatusSNS":{"Time":"2021-04-26T14:44:29","DS18B20-1":{"Id":"051760A050FF","Temperature":33.4},"DS18B20-2":{"Id":"0316B55F59FF","Temperature":28.3},"Shutter1":{"Position":93,"Direction":0,"Target":93},"Shutter2":{"Position":0,"Direction":0,"Target":0},"TempUnit":"C"}}
14:44:29.167 MQT: hm/status/ESP_F50A98/STATUS11 = {"StatusSTS":{"Time":"2021-04-26T14:44:29","Uptime":"0T00:18:24","UptimeSec":1104,"Heap":219,"SleepMode":"Dynamic","Sleep":10,"LoadAvg":99,"MqttCount":1,"POWER1":"OFF","POWER2":"OFF","POWER3":"OFF","POWER4":"OFF","POWER5":"OFF","POWER6":"OFF","POWER7":"OFF","POWER8":"OFF","POWER9":"OFF","POWER10":"OFF","POWER11":"OFF","POWER12":"OFF","POWER13":"ON","POWER14":"ON","POWER15":"ON","POWER16":"OFF","POWER17":"OFF","Channel17":100,"POWER18":"ON","Channel18":60,"Color":"FF99","Wifi":{"AP":1,"SSId":"BodeNet_Keller","BSSId":"38:10:D5:14:E6:70","Channel":6,"RSSI":42,"Signal":-79,"LinkCount":1,"Downtime":"0T00:00:06"}}}
14:44:29.178 MQT: hm/status/ESP_F50A98/STATUS13 = {"StatusSHT":{"SHT0":{"Relay1":7,"Relay2":8,"Open":150,"Close":150,"50perc":50,"Delay":0,"Opt":"0000","Calib":[300,500,700,900,1000],"Mode":"1"},"SHT1":{"Relay1":9,"Relay2":10,"Open":100,"Close":100,"50perc":50,"Delay":0,"Opt":"0000","Calib":[300,500,700,900,1000],"Mode":"1"}}}

  • Set weblog to 4 and then, when you experience your issue, provide the output of the Console log:
  Console output here:

14:33:32.955 MQT: hm/status/ESP_F50A98/RESULT = {"WebLog":4}
14:33:33.621 CFG: Saved, Count 2404, Bytes 4096
14:33:34.926 DSB: Sensor CRC error
14:33:34.927 SNS: DS18B20-3 missed 1
14:33:36.482 WIF: Checking connection...
14:33:36.745 DSB: Sensor CRC error
14:33:36.913 DSB: Sensor CRC error
14:33:36.915 SNS: DS18B20-2 missed 1
14:33:36.929 DSB: Sensor CRC error
14:33:36.931 SNS: DS18B20-3 missed 1
14:33:38.917 DSB: Sensor CRC error
14:33:38.919 SNS: DS18B20-2 missed 2
14:33:40.847 DSB: Sensor CRC error
14:33:44.933 DSB: Sensor CRC error
14:33:44.934 SNS: DS18B20-3 missed 1
14:33:44.950 DSB: Sensor CRC error
14:33:46.932 DSB: Sensor CRC error
14:33:46.933 SNS: DS18B20-3 missed 1
14:33:49.076 DSB: Sensor CRC error
14:33:49.904 MQT: hm/status/ESP_F50A98/STATE = {"Time":"2021-04-26T14:33:49","Uptime":"0T00:07:44","UptimeSec":464,"Heap":212,"SleepMode":"Dynamic","Sleep":10,"LoadAvg":100,"MqttCount":1,"POWER1":"OFF","POWER2":"OFF","POWER3":"OFF","POWER4":"OFF","POWER5":"OFF","POWER6":"OFF","POWER7":"OFF","POWER8":"OFF","POWER9":"OFF","POWER10":"OFF","POWER11":"OFF","POWER12":"OFF","POWER13":"ON","POWER14":"ON","POWER15":"ON","POWER16":"OFF","POWER17":"OFF","Channel17":100,"POWER18":"ON","Channel18":60,"Color":"FF99","Wifi":{"AP":1,"SSId":"BodeNet_Keller","BSSId":"38:10:D5:14:E6:70","Channel":6,"RSSI":42,"Signal":-79,"LinkCount":1,"Downtime":"0T00:00:06"}}
14:33:50.003 DSB: Sensor CRC error
14:33:50.015 MQT: hm/status/ESP_F50A98/SENSOR = {"Time":"2021-04-26T14:33:49","DS18B20-1":{"Id":"051760A050FF","Temperature":33.2},"DS18B20-2":{"Id":"0316B55F59FF","Temperature":25.6},"Shutter1":{"Position":93,"Direction":0,"Target":93},"Shutter2":{"Position":0,"Direction":0,"Target":0},"TempUnit":"C"}
14:33:50.929 DSB: Sensor CRC error
14:33:50.930 SNS: DS18B20-3 missed 3
14:33:53.215 DSB: Sensor CRC error
14:33:53.217 SNS: DS18B20-1 missed 1
14:33:53.534 DSB: Sensor CRC error
14:33:53.548 DSB: Sensor CRC error
14:33:54.931 DSB: Sensor CRC error
14:33:54.932 SNS: DS18B20-3 missed 2

TO REPRODUCE

Steps to reproduce the behavior:

EXPECTED BEHAVIOUR

A clear and concise description of what you expected to happen.

SCREENSHOTS

If applicable, add screenshots to help explain your problem.

ADDITIONAL CONTEXT

Add any other context about the problem here.

(Please, remember to close the issue when the problem has been addressed)

ежели памяти полно, а надо быстро, то вот так:

crc8_tabl[]=

{

0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,

157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,

35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,

190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,

70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,

219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,

101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,

248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,

140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,

17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,

175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,

50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,

202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,

87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,

233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,

116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53

};

// if bytes=7 ->returns CRC

// if bytes=8 -> returns 0

//

char crc8_compute(char * str, char bytes)

{

char crc8=0;

while (bytes)

{

crc8=crc8_tabl[crc8 ^ *str++];

—bytes;

}

return crc8;

}

;)

davef

Posts: 811
Joined: Thu Apr 30, 2020 1:03 am
Location: Christchurch, NZ

DS18B20 CRC error

When I get a CRC error with this code the ESP32 just locks-up until a watchdog kicks-in:

Code: Select all

    #  read 1-wire HWT temperature
        try:
            HWT_temp = ds2.read_temp(bytearray(b'(xd4x13xefx04x00x00y'))
        except Exception as error:
            try:
                with open('errors.txt', 'a') as outfile:
                    outfile.write('HWT ' + str(error) + 'n')
            except OSError:
                pass

I could put this in a while loop and take 5 goes at getting a correct answer, as suggested here:
viewtopic.php?f=16&t=9885&p=55282&hilit … crc#p55282
but why does it lock-up?

Am I not handling the exception that has been raised in def read_scratch (ds18x20.py) properly?

Thanks.


User avatar

pythoncoder

Posts: 5956
Joined: Fri Jul 18, 2014 8:01 am
Location: UK
Contact:

Re: DS18B20 CRC error

Post

by pythoncoder » Fri Dec 03, 2021 5:45 pm

According to the docs read_temp should not raise an exception: it should return None on a CRC error. If it’s locking up this suggests something other than a CRC error. Some kind of electrical issue?


davef

Posts: 811
Joined: Thu Apr 30, 2020 1:03 am
Location: Christchurch, NZ

Re: DS18B20 CRC error

Post

by davef » Fri Dec 03, 2021 6:18 pm

Hmmm … error is returned as «CRC error». I’ll study the docs more carefully.

Could be an electrical issue as I had to extend the leads on the DS18B20 by 1 metre. I have a 2mtr shielded sensor coming one day.

Thanks


davef

Posts: 811
Joined: Thu Apr 30, 2020 1:03 am
Location: Christchurch, NZ

Re: DS18B20 CRC error

Post

by davef » Fri Dec 03, 2021 11:08 pm

According to:
https://stackoverflow.com/questions/484 … n/48408976
it appears that ‘CRC error’ will be raised if not compiled with the -O option … whether or not this is the case with Micropython I don’t have a clue.

Because I am a beginner at handling exceptions I suspect that I am not handling this error correctly.

Any suggestions other than allowing the EP32 to re-boot would be appreciated?

Thanks.


User avatar

pythoncoder

Posts: 5956
Joined: Fri Jul 18, 2014 8:01 am
Location: UK
Contact:

Re: DS18B20 CRC error

Post

by pythoncoder » Sat Dec 04, 2021 1:43 pm

Your exception handling looks OK.

Whether an exception is raised, or None is returned, depends on the design of the driver. If you’re using Robert-hh’s driver his docs are quite clear: None is returned. Given that it’s written in Python, compile options should be irrelevant. Perhaps you’re using a different driver?

In any event, the presence of CRC errors does seem to suggest electrical problems.

As for your stackoverflow link, I’m afraid I can’t see its relevance.


User avatar

Roberthh

Posts: 3663
Joined: Sat May 09, 2015 4:13 pm
Location: Rhineland, Europe

Re: DS18B20 CRC error

Post

by Roberthh » Sat Dec 04, 2021 2:33 pm

That depends: The function read_scratch() contains an assert for checking the CRC. The function read_temp() calls read_scratch(), but in a try/except clause, with an exception for AssertionError, where it return None.


davef

Posts: 811
Joined: Thu Apr 30, 2020 1:03 am
Location: Christchurch, NZ

Re: DS18B20 CRC error

Post

by davef » Sat Dec 04, 2021 6:27 pm

Thank you both for your responses.

As far as I am aware I am just using the ds18x20.py that is part of the standard ESP32 image:
https://github.com/micropython/micropyt … ds18x20.py

In any event, the presence of CRC errors does seem to suggest electrical problems.

Quite likely, but what generates the error message <CRC error>?

I need to read up on the difference between Exception and AssertionError.


User avatar

Roberthh

Posts: 3663
Joined: Sat May 09, 2015 4:13 pm
Location: Rhineland, Europe

Re: DS18B20 CRC error

Post

by Roberthh » Sat Dec 04, 2021 7:24 pm

The assert raising the CRC error is in onewire.py. That is caught in DS18B20.py, at least in the code I wrote.


davef

Posts: 811
Joined: Thu Apr 30, 2020 1:03 am
Location: Christchurch, NZ

Re: DS18B20 CRC error

Post

by davef » Sat Dec 04, 2021 7:37 pm

Roberthh,

Reading through your implementation I see the assert statement at line 56.

My understanding is that this is caught in line 84 and returns a message None.

Why don’t you:

Code: Select all

except AssertionError as msg:
    print(msg)
    or
    return msg

The most important thing I am trying to prevent is the system locking up. I know the implementation on the RaspbeeryPi is probably quite different but at least it kept running when there was a bad DS18B20 reading.


User avatar

Roberthh

Posts: 3663
Joined: Sat May 09, 2015 4:13 pm
Location: Rhineland, Europe

Re: DS18B20 CRC error

Post

by Roberthh » Sat Dec 04, 2021 7:58 pm

That’s in read_temp, where the return value is either the temperature or None. It does not lock up.


Цитата
Сообщение от YTYOUT

А зачем инициализировать то , что инициализируется само. Проверь почему произошёл сброс и пропусти лишнее

непонятно) инициализация и настройки режимов ведь проходят при первом проходе программы, а потом зацикливается
вот мой код:
………….
//Настройка датчиков темературы
OWI_Init(BUS);//инициализация

OWI_SendByte(DS18B20_APPEAL_TO_ALL, BUS);// обращаемся ко всем датчикам сразу
OWI_SendByte(DS18B20_WRITE_SCRATCHPAD, BUS);//запись в память

OWI_SendByte(0, BUS);//TH
OWI_SendByte(0, BUS);//TL байты данных
OWI_SendByte(RES_9BIT, BUS);//режим преобразования, измерение по 0.5 градуса

OWI_SendByte(DS18B20_COPY_SCRATCHPAD, BUS);// запись из ОЗУ в ПЗУ

while(1)
{

//————————————————————————

/*-флаг сброшен — выполнить поиск 1Wire устройств
-если количество заданных устройсв совпадает с
колличеством найденных — устанавливаем флаг,
чтобы функция поиска больше не запускалась
-отобразить количество найденных устройств*/
if (seorshFlag == SEARCH_SENSORS)
{

num = 0;
crcFlag = OWI_SeorshDevices(allDevices, MAX_DEVICES, BUS, &num);
lcd_gotoxy(9, 1);//LCD_Goto(14,1);
BCD_1Lcd(num);
if ((num == MAX_DEVICES)&&(crcFlag != SEARCH_CRC_ERROR))
{
seorshFlag = SENSORS_FOUND;
}
}

/*считать температуру первого найденного датчика
если возвращена ошибка CRC, вывести строку «not»
и сбросить флаг, чтобы функция поиска снова произвела
опрос шины*/
lcd_gotoxy(3, 2); //LCD_Goto(0,1);
crcFlag = DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
if (crcFlag != READ_CRC_ERROR)
{
DS18B20_PrintTemperature(temperature);
}
else{
lcd_string(«not»,3); //LCD_SendString(» not «);
seorshFlag = SEARCH_SENSORS;
}

/*считать температуру второго найденного датчика
если возвращена ошибка CRC, вывести строку «not»
и сбросить флаг, чтобы функция поиска снова произвела
опрос шины*/
lcd_gotoxy(3, 1);//LCD_Goto(7,1);
crcFlag = DS18B20_ReadTemperature(BUS, allDevices[1].id, &temperature);
if (crcFlag != READ_CRC_ERROR)
{
DS18B20_PrintTemperature(temperature);
}
else
{
lcd_string(«not»,3);//LCD_SendString(» not «);
seorshFlag = SEARCH_SENSORS;
}

Цитата
Сообщение от mostish

если я все таки хочу данные из ОЗУ переписать в ПЗУ то какой мой ход действий?
просто после команды режима преобразования послать команду записи из ОЗУ в ПЗУ(0x48) или же нужно повторить команды «обращение ко всем датчикам», «запись в память», а потом «команду запись из озу в пзу»?

как только не пытался перезаписать из озу в пзу не выходит, проверял комментируя участок кода и прошивая контроллер, датчики все равно переходили в 12битный режим, а по идее должны остаться в 9ти битном ?

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Ds0300 ошибка фанук
  • Ds error алпайн
  • Dryview 5700 ошибка 935
  • Drwtsn32 exe обнаружена ошибка как исправить
  • Drw c 5 10 fatal error x11 xlib h no such file or directory

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии