www.kn34pc.com
https://kn34pc.com/forums/

DS18B20, 1-wire
https://kn34pc.com/forums/viewtopic.php?f=80&t=1243
Страница 1 от 1

Автор:  LZ2WSG [ 27 Яну 2026, 09:53 ]
Заглавие:  DS18B20, 1-wire

1-Wire Communication Through Software

Прикачени файлове:
522Fig01.gif
522Fig01.gif [ 11.79 KiB | Прегледано 6441 пъти ]

Прикачени файлове:
1-wire_t.jpg
1-wire_t.jpg [ 177.22 KiB | Прегледано 6440 пъти ]


Using a UART to Implement a 1-Wire Bus Master

Автор:  LZ2WSG [ 01 Фев 2026, 10:19 ]
Заглавие:  Re: DS18B20, 1-wire

CRC-8 по Dallas:
Код за потвърждение:
uint8_t ds18b20_crc8(uint8_t *data, uint8_t len) {
  uint8_t crc = 0;

  while (len--) {
    uint8_t inbyte = *data++;

    for (uint8_t i = 0; i < 8; i++) {
      uint8_t mix = (crc ^ inbyte) & 0x01;
      crc >>= 1;
         
      if (mix)
        crc ^= 0x8C;  // Dallas CRC-8 polynomial 0x31, reflected for LSB-first
         
      inbyte >>= 1;
    }
  }

и използваме:
Код за потвърждение:
int16_t ds18b20_read(void) {
  int16_t m_temp = 0;
  uint8_t data[9] = {0};

  onewire_reset();
  onewire_write(0xCC);  // skip ROM, address all devices
  onewire_write(0xBE);  // read scratchpad

  for (uint8_t i = 0; i < 9; i++)
    data[i] = onewire_read();

  // data[0] ^= 0x01;  // CRC test

  if (ds18b20_crc8(data, 8) == data[8]) {
    m_temp = ((int16_t)data[1] << 8) | (int16_t)data[0];
    m_temp *= 5;
    m_temp /= 8;
  }
  else
    m_temp = -999;  // CRC error

  return m_temp;
}

При анализ на CRC и налична грешка: температурата е -99,9 градуса (невъзможна температура, ако се променя писането в дисплея, може да е примерно: ----).

Един DS18, без адрес. Температура по логическия анализатор: 0x019C * 5 / 8 = 257,5 или 25,75 oC
CRC проверката може да се извърши и от таблица - по-бързо е. Но горният вариант също е подходящ.

Прикачени файлове:
ds18_crc.jpg
ds18_crc.jpg [ 332.72 KiB | Прегледано 6332 пъти ]

Автор:  LZ2WSG [ 01 Фев 2026, 10:26 ]
Заглавие:  Re: DS18B20, 1-wire

Тест на CRC, един DS18, на около 10 см от микроконтроелра, на стационарно захранване:
Код за потвърждение:
    if (temp_ds == -999)  // CRC test
      while (1)
        __NOP();

При първата грешка трябваше да спре с показания -99,9 градуса. 3 дни е ОК - няма CRC error.

С дълги проводници, с големи смущения по трасето и др. CRC е добре да се проверява винаги. Струва микроконтролерно "време" и код в паметта обаче.
Възможни реакции на кода: 1. да се игнорират измерванията с грешка, 2: грешка, грешка, грешка няколко опита, печат error и стоп. 3: друго

Автор:  LZ2WSG [ 03 Фев 2026, 15:44 ]
Заглавие:  Re: DS18B20, 1-wire

Полезен материал. Че и познава ... :wink
Your DS18B20 temperature sensor is likely a fake, counterfeit, clone ...

Автор:  LZ2WSG [ 03 Фев 2026, 15:50 ]
Заглавие:  Re: DS18B20, 1-wire

В архива: demo от библиотеката Arduino OneWire (оставил съм само температурата в oC като показание).
Прикачени файлове:
ds18x20_temperature_n_sensors.zip [11.37 KiB]
254 пъти

---
Тест с 10 броя DS18B20 на една шина. Закупувани са от две места.
Код за потвърждение:
------------------------
Temperature = 25.00 oC
Temperature = 25.06 oC
Temperature = 25.12 oC
Temperature = 25.12 oC
Temperature = 25.12 oC
Temperature = 25.00 oC
Temperature = 25.00 oC
Temperature = 25.19 oC
Temperature = 25.00 oC
Temperature = 25.00 oC
------------------------
...
------------------------
Temperature = 24.50 oC
Temperature = 24.50 oC
Temperature = 24.62 oC
Temperature = 24.56 oC
Temperature = 24.56 oC
Temperature = 24.50 oC
Temperature = 24.62 oC
Temperature = 24.62 oC
Temperature = 24.56 oC
Temperature = 24.56 oC
------------------------
...

Бредборд, 10 датчика в 3 колони, в паралел, с проводници напр. 10 см, свързана колона с колона.

На ~25 оC са с измерена еднаква температура. Приятно се изненадвам!
Един DS18 "отделих" с малко повече показание (+0,3 oC). Но и той е в допустимото отклонение из документацията (в случая предполагаме множеството за истина, за други прецизни сравнения трябва калибриран лабораторен термометър).

Ще е интересен тест и в други работни температури.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/