www.kn34pc.com

Форум на силистренските радиолюбители
Дата и час: 12 Мар 2026, 10:21

Часовете са според зоната UTC + 2 часа




Напиши нова тема Отговори на тема  [ 5 мнения ] 
Автор Съобщение
 Заглавие: DS18B20, 1-wire
МнениеПубликувано на: 27 Яну 2026, 08:53 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1640
Местоположение: Силистра
1-Wire Communication Through Software

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

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


Using a UART to Implement a 1-Wire Bus Master


Върнете се в началото
 Профил  
 
 Заглавие: Re: DS18B20, 1-wire
МнениеПубликувано на: 01 Фев 2026, 09:19 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1640
Местоположение: Силистра
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 | Прегледано 834 пъти ]
Върнете се в началото
 Профил  
 
 Заглавие: Re: DS18B20, 1-wire
МнениеПубликувано на: 01 Фев 2026, 09:26 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1640
Местоположение: Силистра
Тест на CRC, един DS18, на около 10 см от микроконтроелра, на стационарно захранване:
Код за потвърждение:
    if (temp_ds == -999)  // CRC test
      while (1)
        __NOP();

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

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


Върнете се в началото
 Профил  
 
 Заглавие: Re: DS18B20, 1-wire
МнениеПубликувано на: 03 Фев 2026, 14:44 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1640
Местоположение: Силистра
Полезен материал. Че и познава ... :wink
Your DS18B20 temperature sensor is likely a fake, counterfeit, clone ...


Върнете се в началото
 Профил  
 
 Заглавие: Re: DS18B20, 1-wire
МнениеПубликувано на: 03 Фев 2026, 14:50 
Offline
Аватар

Регистриран на: 07 Дек 2006, 17:24
Мнения: 1640
Местоположение: Силистра
В архива: demo от библиотеката Arduino OneWire (оставил съм само температурата в oC като показание).
Прикачени файлове:
ds18x20_temperature_n_sensors.zip [11.37 KiB]
24 пъти

---
Тест с 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). Но и той е в допустимото отклонение из документацията (в случая предполагаме множеството за истина, за други прецизни сравнения трябва калибриран лабораторен термометър).

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


Върнете се в началото
 Профил  
 
Покажи мненията от миналия:  Сортирай по  
Напиши нова тема Отговори на тема  [ 5 мнения ] 

Часовете са според зоната UTC + 2 часа


Кой е на линия

Потребители, разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Форумът се задвижва от phpBB® Forum Software © phpBB Group
Преведено от yarnaudov.com