Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Cherep_VM
2024-09-21 21:03:32

Коли відточите навички читання/записування сторінок, спробуйте ось цей мій пристрій.

Завдяки вашим посиланням на документацію по DS2450 та Googl-перекладачу, вдалось зрозуміти алгоритми взаємодії між МК та модулем. Особливо закручено було в записі даних в модуль, тільки переклавши з англійської на українську алгоритм виконання команди WRITE MEMORY [55H], вдалось зрозуміти роботу вашої функції "uint8_t write(uint8_t *addr, uint8_t *buf, uint8_t start, uint8_t cnt)" яку ви, люб'язно, надали для ознайомлення.
"Спілкування" з модулем працює, тепер буду, по тихеньку, вивчати/освоювати його функціонал. wink
Щиро вдячний за поради!

Cherep_VM
2024-09-16 10:31:03

Ага, читав про "емуляцію", але, коли буде потреба, бажання і натхнення, то зможу, під Windows, на Delphi7, написати програму для налаштування DS2423, чи якогось іншого.  wink

Honey
2024-09-16 08:41:30
Cherep_VM пише:

датчик з газ.лічильника - геркон

Можна використати SS49E (аналоговий датчик Холла), але він потребує налаштування threshold-ів, це робиться записом в пам'ять лічильника і я для цієї процедури написав веб-інтерфейс (інструкція), що вже вимагає щоб лічильник був підключений до лінукса на якому має бути запущений owhttpd. Тут один користувач викладав урізану лише для ds2423 "емуляцію" owhttpd на мікроконтролері.

Cherep_VM
2024-09-16 08:01:24

Проблема не в пінах МК(сімейство C8051F300...F380 та інші), вони мають толерантність до 5В, а в тому, що напруга джерела живлення схеми не перевищує 4,2В. Бо схема розроблялась коли я ще не знав про ваш модуль і для простоти живлення, вибрав варіант джерела від одного елемента акума. Чому від акума, бо треба було забезпечити автономність контролера, бо датчик з газ.лічильника - геркон і треба було мати постійну можливість його контролювати. Тепер, автономність забезпечує ваш модуль. І потреба в акумі відпадає, але переробляти вже не буду. Ну то таке..., добре що були в наявності мініатюрні модулі DC-DCповишалки.

Honey
2024-09-15 22:49:46

Якщо піни вашого МК не толерантні до 5В, то скористайтесь такою схемою (фактично схема перетворювача логічних рівнів):
large_image9.jpg
Між GPIO4 на схемі (це ваш вихід МК) і +3.3V можна додати резистор 10-100кОм, або програмно використати вбудований в МК.

Cherep_VM
2024-09-15 20:04:55

Ще стикнувся з проблемою...МК контролера 3,2 вольтове, тому живлення відбувається від одного літіонового акума 3,6В, а лінію DQ треба "підвязати" до +5В...звідки взяти?  sad  Прийшлось "приліпити" маленьку повишалку(DC-DC 2,5..4,2В --> 5,1В). Добре що в коробочці контролера ще було вільне місце.  smile

Cherep_VM
2024-09-15 19:57:34

Адаптувати програму контролера було легше ніж присобачити модуль DS2423. Получилось ось так....
photo_2024-09-15_19-53-14_.jpg

Cherep_VM
2024-09-15 15:17:28

Доброго дня.
Завершив створення алгоритму читати/писати в сторінки модуля DS2423..., все грає та співає!  wink
В кінцевому варіанті реалізовано всього три функції:

U8	DS2423_getCounters     (U8 nomCounters);    //зчитую значення лічильника та значення напруги батарейки живлення модуля.
U8	DS2423_ReadRAM_COUNTER (U16 vAdr, U8 vKolB); //зчитую сторінку повністю(vKolB=42), або частково(vKolB<42).
U8	DS2423_WriteRAM        (U16 vAdr, U8 *vRAM, U8 vKolB);//запис в сторінку "write_Scratchpad"+"read_Scratchpad"+"copy_Scratchpad".

Тепер залишилось модуль прилаштувати до газового лічильника, підключити до контролера і там модернізувати програму(під цей модуль).
Ще "погрався" з читанням/запису в користувацьку область(24байта) пам'яті модуля...чудово, можна де що зберігати.
Щиро вдячний за допомогу!
Всім здоров'я та вдачі!

Honey
2024-09-10 09:17:45
Cherep_VM пише:

Тепер, коли буду щось писати в сторінку, то теж, в підрахунок CRC включати байти команди та адреса, я правильно розумію?

Треба дивитися даташит, шукаєте там Memory function flow chart, вам спочатку потрібна буде команда OFh для запису в скретчпад, бачите там "Master RX CRC16 of Command, Address, Data" - це значить, що потрібно включати, наступною командою 55h потрібно скопіювати скретчпад в сторінку.

Cherep_VM
2024-09-09 22:23:43

Встановив ваші, рекомендовані, таймінги...все Ок! Буду з ними працювати...це ж буде по феншую! wink
З підрахунком CRC визначився, все "грає та співає" !!!  smile
Вдячний за ваші поради та підказки.
Інтуїтивно розумію, що треба, але про всяк випадок спитаю...
Тепер, коли буду щось писати в сторінку, то теж, в підрахунок CRC включати байти команди та адреса, я правильно розумію?

Cherep_VM
2024-09-09 20:59:50

Так, я вас правильно зрозумів. Якраз з цією паузою(delay_us( 1);) і посилено працював. Через те що мій переносний осцилл не може нормально, на таких тривалостях, працювати, синхронізуватись, я не можу сказати, що вказавши паузу в 1мкс, то вона дійсно буде в 1мкс....підозрюю, що там буде трохи більше і тому протокол працює без проблем. Зараз запущу домашній осцилл і ретельніше все перевірю.
З 2019 року реалізував дома щось типу "розумний дім". Срільнуло мені в голову зробити керування батареями опалення контролерами і показувати їхню роботу на ПК(планшет). Так і зробив і вже 5 років система працює. Контролери батарей мають по три датчики DS18B20(температура кімнати, температура батареї, температура теплотраси) і керує електроклапаном(12В) який то відкриває батарею, то закриває в залежності від заданої температури. Я до чого веду....обкатавши нові таймінги протоколу 1Wire, прописав їх в контролери(7шт) і вже тиждень все працює нормально. Але менш з тим...зараз попробую реалізувати ваші поради. wink

https://forum.arduino.ua/img/members/29 … shot_3.jpg

Honey
2024-09-09 15:34:25

Я б ось це

#define inBit1Wire(inBit)
	LineWire	=0;				delay_us( 8);
	LineWire	=1;				delay_us( 1);
	inBit		=LineWire;		delay_us(40);
	LineWire	=1;				delay_us(90);

змінив на таке

#define inBit1Wire(inBit)
	LineWire	=0;				delay_us( 8);
	LineWire	=1;				delay_us(11);
	inBit		=LineWire;		delay_us(30);
	LineWire	=1;				delay_us(90);

бо лінія може не встигнути піднятись за 1мкс

Cherep_VM
2024-09-09 14:14:37

Напевно, вхід DQ має певну ємність, більша ніж у DS18B20, яка "поволі" заряджається і часу в 5мкс між слотами(старий варіант формування імпульсів), коли лінія звільнена, не встигає досягти +5В. А от коли час між слотами збільшив до 90мкс, то все стало нормально. Да, можна було зменшити опір резистора і можливо все теж стало-б нормальок.

У вас трохи неправильні таймінги.......

Так, я знаю...ви маєте рацію!
Раніше формував їх по специфікації на DS18B20. Тепер, коли "вирівнював" рівні імпульсів, емпірично, підігнав їх до стабільної роботи протоколу. Тобто щоб затримки були мінімально-оптимальні. smile
При нагоді, ще раз їх перегляну.

Honey
2024-09-09 14:08:14

Приблизно так (псевдокод):
write_0 {
  bus_low
  delay 59
  bus_hiz
  delay 11
}
write_1_read {
  bus_low
  delay 10
  bus_hiz
  delay 5
  r = bus_read
  delay 55
  return r
}

Honey
2024-09-09 13:54:08

У вас трохи неправильні таймінги. Відправка нуля - це ~59мкс нуль на шині і не менше 1мкс одиниця, відправка одиниці - 5..10мкс нуль і ~55мкс одиниця. Слейв робить зчитування шини через 30-35мкс після падаючого фронту (тобто десь посередині) і визначає, там передали 0 чи 1. А якщо слейв хоче передати нуль, то він по падаючому фронту замикає шину на землю на 30-40мкс, тобто мастер повинен робити зчитування десь посередині - приблизно на 15..20й мікросекунді.

Підвал форуму