#326 Re: Апаратні питання » STM32f429 LTDC VGA джитер » 2025-03-29 19:47:40

duron пише:

на моніторі присутні три вертикальні лінії з доволі великим джитером пікселів.

STM32F42X має кеш перед флешкою, тому час виконання одного і того ж коду з флешки не є константою з точністю до періоду такотового генератора. Інше питання, чи у вашому випадку джиттер обумовлений цією особливістю, чи особливостями реалізації у вашому коді.

Необхідно як мінімум бачити код. Також, якщо є можливість, запишіть і порівняйте осцилограми сусідніх фреймів, на яких саме етапах генерації фрейма відбувається зсув, на який період.

Можна спробувати завантажити код в SRAM і виконувати звідти.

#327 Re: Програмування Arduino » не працює ArduinoISP » 2025-03-21 13:31:52

jokeer пише:

Із мінусів - текстовий файл, пишеться руками.

Якщо редагування файла руками - це мінус, то є PlatformIO Home та розширення для VSCode.

#328 Re: Програмування Arduino » не працює ArduinoISP » 2025-03-20 21:37:39

renoshnik пише:

Using Programmer              : arduinoisp

Arduino ISP - це програматор у вигляді окремого пристрою на базі attiny: https://docs.arduino.cc/retired/boards/arduino-isp
Вам потрібно, як зазначено вище, Arduino as ISP.

#329 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-18 19:58:56

Primaangel88 пише:

коли дисплей відпрацював натискання кнопки він посилає наступні данні в порт:
5A A5 06 83 50 00 01 00 01

Цікаво. Це він сам ініціює передачу чи відповідає на команду читання?
Якщо ініціює сам, що відбудеться, коли керуючий хост відправляє якусь команду і очікує відповіді, а в цей момент на дисплеї натиснули кнопку?

Primaangel88 пише:

5А А5 маска

Я би назвав це заголовком (frame header) або маркером.

Primaangel88 пише:

06 довжина передачі в байтах
83 команда читання данних з RAM памяті, я так зрозумів так дисплей каже що він наступні данні прочитав з своєї RAM
50 00 адреса в памяті

Тут наче має бути ще 01 - розмір даних у 16-бітних словах.

Primaangel88 пише:

00 01 данні що там лежать

І що, ніхто досі не написав для цього протокола людського парсера? Всі оперують масивом байтів?

#330 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-18 17:30:51

Primaangel88 пише:

Але якась херня виходить повна

Так завжди виходить, коли код пишеться одразу, без чіткого розуміння що він має робити, та без попередньої розробки алгоритму (на папері з олівцем, так).

Primaangel88 пише:

при натисканні будь якої кнопки на дисплеї отримую:
5A A 66 83 5000 0 0 0

Ну, значення Buffer[0], Buffer[3] та Buffer[4] відповідають тим, на які перевіряєте. Що не так?

Primaangel88 пише:

а повинен отримати: 5A A5 06 83 50 00 01 00 01 (перша кнопка натиснута)

Ви впевнені, що саме таку послідовність має видавати дисплей? Це десь зазначено в описі протоколу?

Primaangel88 пише:
if(bufflag && l>=20){
 if (bufflag && Buffer[0] == 0X5A && Buffer[3] == 0X83 && Buffer[4]==0X50){
 }

тепер читає але не кожен раз. треба задовбат кнопку натисканням і тільки разу з 10 спрацьовує

Так умова спрацьовує тільки коли набереться 20 байт ТА байти у певних позиціях мають певні значення.

Для початку сформулюйте словами, що конкретно має робити код? Знаходити певну послідовність байтів у вхідному потоці з послідовного порта?

Primaangel88 пише:
            Serial.print(Buffer[0], HEX);
            Serial.print(Buffer[1], HEX);
            Serial.print(Buffer[2], HEX);
            Serial.print(Buffer[3], HEX);
            Serial.print(Buffer[4], HEX);
            Serial.print(Buffer[5], HEX);
            Serial.print(Buffer[6], HEX);
            Serial.print(Buffer[7], HEX);
            Serial.print(Buffer[8], HEX);

Тут же всі символи зливатимуться, "1 23" не відрізнити від "12 3".

for (auto i : Buffer) {
    Serial.print(i, HEX);
    Serial.print(' ');
}

Або, з лідируючими нулями:

for (auto i : Buffer) {
  char s[4];
  snprintf(s, sizeof(s), "%02x ", i);
  Serial.print(s);
}

Взагалі, якщо вся комунікація з дисплеєм іде по послідовному порту, а чіткого опису протоколу немає, я би для початку підʼєднав би його до компа і відлагодив комунікацію у програмі для компа, без всяких ардуін. На будь якій мові, яку знаєте, хоч C#, хоч Python, чи що інше. Потім би уже портував на ардуіну.

#331 Re: Програмування Arduino » Не працює функція » 2025-03-17 12:28:37

Yuri57 пише:

Якщо визиваю функцію void strob1; - не працює.

Як саме визиваєте?
Спробую вгадати, ви написали

strob1;

Це не є викликом функції. Якби ви увімкнули "Show verbose output during: compile", то побачили би попередження від компілятора:

warning: statement is a reference, not call, to function 'strob1' [-Waddress]
   strob1;
         ^
warning: statement has no effect [-Wunused-value]

Спробуйте

strob1();

#332 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-16 00:25:17

jokeer пише:

ReadSerial виглядає по наркоманськи wink

Та там весь код наркоманський.
Навіщо аж три таймера з однаковим інтервалом?

В ReadSerial()

      if (Buffer[0] == 0X5A & Buffer[3] == 0X83) {
          if (Buffer[4] == 0X50) {           

виконується навіть коли прочитано лише 1 байт, а в Buffer[3] і Buffer[4] може бути хто зна шо.

Точніше, в Buffer[3] і Buffer[4] значення ніколи і не записуються, бо як тільки прочитано один байт, Buffer_Len скидається в нуль.

І хіба дисплей відповідає такими ж командами, якими сам керується? Я в документацію не вчитувався, але це було би дуже дивно. Зазвичай керуючий пристрій видає команду на читання, потім зчитує результат.

Взагалі, якщо Serial читається побайтно, навіщо зайвий раз перевіряти available()?

Це:

if (Buffer[0] == 0X5A & Buffer[3] == 0X83)

з логічної точки зору працюватиме, але семантично мабуть малось на увазі

if (Buffer[0] == 0X5A && Buffer[3] == 0X83)

#333 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-15 23:10:18

jokeer пише:

Можна і без зсувів і масок

union myUnion {

Можна і без union:

uint16_t myint;
...
Send_ar[6] = (reinterpret_cast<uint8_t *>(&myint))[1];
Send_ar[7] = (reinterpret_cast<uint8_t *>(&myint))[0];

або по-C-шному:

Send_ar[6] = ((uint8_t *)&myint)[1];
Send_ar[7] = ((uint8_t *)&myint)[0];

Але що цей варіант, що варіант з union даватимуть різні результати на little endian та big endian процесорах. А варіант зі зсувами і масками портабельний, результат не залежить від архітектури процесора.

#334 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-14 19:44:15

Можна припустити, що відображається число (N*256+M)/100, де N - перший байт двічі в BCD, M - другий байт один раз в BCD. Але це якесь збочення. Там же в цих дисплеях наче програмується формат даних для відображення. Може варто перепрограмувати сам дисплей, щоб сприймав дані у нормальному форматі, аніж підганяти дані під такий дивний формат?

#336 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-14 17:29:22

Primaangel88 пише:

я пробував записати 0x00 0x22 на виході маю значення 0.22, якщо записати 0x22 0x00 на дисплеї 56.32

О, це вже щось. Для 0x00 0x22 я би сказав, що це BCD, але тоді для 0x22 0x00 було би 22.00. Гіпотеза про BCD не підтверджується. Які значення на дисплеї відповідають наступним записаним значенням:
0x01 0x00
0x00 0x01
0x80 0x00
0x00 0x80
0x55 0x55
?

#337 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-14 17:21:49

Primaangel88 пише:

Вибачаюсь. Уточнюю тип данних int 2 байта.
Дисплей DWIN DMT80600L104L104_02wtz6F
має отримувати данні в вигляді ASCII. останні два байти це данні які треба записати

Так в якому форматі мають бути дані? Припустимо, значення temp1 = 42.7315. Які значення у тих двох байтах будуть відповідати цьому значенню temp?

Якщо потрібно записати цілу частину float'а як 2-байтовий int, тоді в разі big endian:

uint16_t t = temp1;
Send_ar[6] = t >> 8;
Send_ar[7] = t & 0xff;

В разі little endian:

uint16_t t = temp1;
Send_ar[6] = t & 0xff;
Send_ar[7] = t >> 8;

(Для знакових int це працюватиме тільки в системі з доповненням до 2-х).

А що записувати, якщо значення float не вміщається в 2-байтовий int?

Якщо ж потрібно записати ASCII-коди десяткового представлення цілої частини float, тоді можна щось типу

if (temp >= 0 && temp < 100) {
    uint16_t t = temp1;
    Send_ar[6] = t / 10 + '0';
    Send_ar[7] = t % 10 + '0';
} else {
    Send_ar[7] = Send_ar[6] = '-';
}

Звідки ви взяли цю адресу 0x5002 для запису командою 0x82? Там же має бути описаний і формат даних. Наприклад, згідно з цим мануалом, 0x5002 - це взагалі якийсь байт статуса чи то відтворення відео, чи то якоїсь анімації. Навряд чи те, що вам потрібно. Наскільки розумію, ті дисплеї мають купу різних варіантів прошивок, у яких одні й ті ж адреси мають різні призначення.
Уточніть в документації на конкретно вашу версію прошивки, за якою адресою і в якому точно форматі потрібно писати дані для відображення.

#338 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-14 15:13:47

Primaangel88 пише:

Підкажіть як конвертувати значеня float в HEX і внести в останні 2 значення масиву. взагалі не розумію які операції треба виконати.

Тип float в C++ - це 4 байта (в більшості реалізацій це IEEE 754). В 2 байта без втрати точності вони не влізуть. В якому конкретно форматі потрібно представити значення float? Який порядок байт, little endian чи big endian?

Є здогадка, що ви хочете відображати температуру у вигляді двозначного десяткового числа. Якщо так, то для цього ніякого конвертування float в HEX не потрібно. Що за дисплей? В якому форматі він очікує дані, ASCII-коди символів?

#339 Re: Програмування Arduino » Потрібна допомога з скетчем розхідоміра рідини » 2025-03-10 10:55:48

jokeer пише:

- в одну руку Хоровіца з Хіллом, в другу Страуструпа - і по голові!

Кнутом потрібно! big_smile

PS: Метод кнута і пряника: метод, винайдений Д. Кнутом і вдосконалений Пряником.

#340 Re: Програмування Arduino » Потрібна допомога з скетчем розхідоміра рідини » 2025-03-10 10:06:29

jokeer пише:

Прочитайте будь яку книгу про ардуїно для початківців

Тут нічого специфічного для ардуіно, тут основи C++. В ардуіно хоч і недо-, але все таки підмножина С++. Потрібно навчитись читати код і діагностику компілятора, він же все підказує.

А якщо мета - навчитись програмувати, то вивчати C++ на прикладі ардуінівських бібліотек категорично не рекомендую.

#341 Re: Програмування Arduino » Потрібна допомога з скетчем розхідоміра рідини » 2025-03-10 00:21:41

dimich пише:

Схоже, що та бібліотека - якась обгортка для Adafruit SSD1306, а ви їй даєте LiquidCrystal_I2C.

А, вже бачу, що до SSD1306 воно не має відношення, а це обгортка для LiquidCrystal_I2C.

Подивіться же в приклад до тієї бібліотеки: examples/HelloWorld/HelloWorld.ino.

Там використовується метод init(), ніякого begin() там немає. Звідки воно взялося у вашому коді? Якщо це не ваш код, то питайте у автора, яка саме бібліотека якої версії тому коду потрібна. Але у LCD_1602_RUS немає метода begin().

#342 Re: Програмування Arduino » Потрібна допомога з скетчем розхідоміра рідини » 2025-03-09 23:30:53

Boing_777 пише:

Скетч , далі включити бібліотеку   ,LCD_1602_RUS

Так звідки ви її взяли? Схоже, що та бібліотека - якась обгортка для Adafruit SSD1306, а ви їй даєте LiquidCrystal_I2C.

Якщо назгрібати якогось сміття з інтернету, то не варто сподіватись, що воно скомпілюється. А якщо і скомпілюється, то не факт, що буде працювати як треба.

#343 Re: Програмування Arduino » Потрібна допомога з скетчем розхідоміра рідини » 2025-03-09 23:03:01

Boing_777 пише:

#include <LCD_1602_RUS_ALL.h>

Що це за LCD_1602_RUS, звідки воно? Якщо це бібліотека, як ви її встановлювали?

Boing_777 пише:

//Тип подключения дисплея: 1 - по шине I2C, 2 - десятиконтактное. Обязательно указывать ДО подключения библиотеки

#include - це НЕ "підключення бібліотеки", це включення файла в поточну одиницю компіляції.

#344 Re: Програмування Arduino » Ошибка компиляции » 2025-03-08 20:58:56

vigor53 пише:

Ошибся в написании - не 0,01 nf а 0,01 mF то есть не меряет менее 10000 pF

0,01 mF - це 10 uF, або 10000 nF, або 10000000 pF.

Там же в скетчі явно написано:

  if (microFarads < 0.01) {
    microFarads = 0.00;  // Set to 0 for values below the threshold
    u8g.print("Unknown !");

тобто менше 10000 pF (0.01 uF) не показувати, бо немає сенсу.

#345 Re: Програмування Arduino » Ошибка компиляции » 2025-03-08 20:51:44

jokeer пише:

Ми ж не очікуємо, що штука ціною в 4 бакси повністю еквівалентна штуці за 400 баксів?

Вартість зазвичай корелює з якістю, але не завжди smile І за 400 баксів можна замість нормального прилада придбати показометр.
Можна зробити і більш-менш адекватний вимірювач ємності за десяток баксів по вартості компонентів. На основі моста Віна, наприклад. Але це явно не з ардуінівським підходом.

#346 Re: Програмування Arduino » Ошибка компиляции » 2025-03-08 19:18:05

vigor53 пише:

По поводу сопротивления - в одной из радакции скетча  прописывется 1000000.0F - это правильно
Показания соответствуют реальности .
НО ! Менее чем 0.01 nf - прибор не меряет

Так у вас час вимірюється з гранулярністю 1 мс. При опорі 1 МОм це відповідає ємності 1 нФ. Тобто якщо наміряли 1 мс, то ємність може бути десь від 0 до 2 нФ, якщо наміряли 2 мс, то ємність десь між 1 і 3 нФ.

Це якби в millis() не було джиттера. В 16МГц ардуіно millis() оновлюється з частотою ≈976 Гц, тобто спочатку відстає від реального, потім стрибком "наздоганяє". Крім того, час вимірювання АЦП також вносить похибку.

Такий метод дозволяє приблизно оцінити порядок величини ємності, але аж ніяк не вимірювати нанофаради.

vigor53 пише:

после проб и ошибок нашел как умеьшть значения.

Збільшення опору резистора в 4 рази теоретично збільшує роздільну здатність в 4 рази. Але тільки теоретично. Дивіться коментар вище щодо sample and hold конденсатора в АЦП. Ні про які 0.01 нФ (10 пФ) не може бути мови.

Можна було би заміряти час за допомогою micros() із вимкненими перериваннями. Але все одно, на малих ємностях S/H конденсатор в АЦП уже впливатиме.

По-хорошому, потрібно використовувати capture event в TIMER1 і аналоговий компаратор.

Для великих ємностей, щоб не чекати кілька секунд, можна зробити магазин резисторів на різних пінах, і вмикати відповідний до діапазона.

vigor53 пише:

А так прибор достаточно простой и надежный. Да вот еще - после некоторого времени работы
перестает измерять - приходтся перегружать, но это не критично.

Якась взаємовиключна характеристика hmm Надійний прилад не перестає вимірювати після якогось часу роботи.

Щоби погратись і повчитись - звісно, ок. Якщо задача вимірювати ємності, то придбайте нормальний прилад.

#347 Re: Програмування Arduino » Ошибка компиляции » 2025-03-08 01:34:19

jokeer пише:

Якщо не помиляюсь, adc там досить неочевидно влаштований, не схоже на ідеальний вимірювач напруги з безкінечним опором.

Ніякий практичний ADC не є ідеальним вимірювачем напруги з бескінечним опором. Там звичайний ADC послідовного наближення. Вимога до source impedance взята з даташиту, наприклад для Atmega328P в 23.6.1:

The ADC is optimized for analog signals with an output impedance of approximately 10kΩ or less. If such a source is used, the sampling time will be negligible. If a source with higher impedance is used, the sampling time will depend on how long time the source needs to charge the S/H capacitor, with can vary widely. The user is recommended to only use low impedance sources with slowly varying signals, since this minimizes the required charge transfer to the S/H capacitor.

S/H capacitor там намальований 14 pF, так що коли вимірювана ємність на пару порядків більше, то цей ефект практично не має впливати.

Взагалі замість АЦП можна було би і аналоговий компаратор використати.

jokeer пише:

А рівень порогу, скоріше за все, пов'язаний з тим що конденсатор розряджається не лінійно, чим далі, тим швидкість розряду менше і гірше точність.

Та впевнений, що вони тупо взяли визначення постійної часу і переписали формулу відносно C, не вникаючи, звідки ті 63.2% там взялись.

#348 Re: Програмування Arduino » Ошибка компиляции » 2025-03-08 00:43:36

jokeer пише:

1. Резисторів на 4 МОм не буває wink

4.02 МОм, відхилення менше 1%. В ряді E48 можуть попадатись і практично точні 4 МОм.
Або 2×2 МОм послідовно.

jokeer пише:

2. To put it shortly, the ADC needs to see source impedance of 10 kilo-ohms or less for accurate results.

То трохи з іншої опери. Тут source - це сам конденсатор, його impedance в першому наближенні прямує до нуля. А вхідний опір піна у атмеги - порядка сотень МОм. Так що метод робочий, в межах точності таймера та АЦП.

Мене більше приколює, що вони привʼязались до рівня саме 63.2%, хоча можна брати будь-який поріг, наприклад 1/2.

#350 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-03-06 16:40:33

Vovik07 пише:

Чому дві бо зручніше щоб були два окремих блокти на лівий і правий... Ви праві можливо і однієї булоб з головою, памяті з запасом. Але коли використовувати одну на дві стрічки то трохи каламбур виходить.

А, тоді є певний сенс. Крім того, передача низьковольтного цифрового сигнала по неекранованій несиметричній лінії в умовах бортової мережі автомобіля ненадійна. А якщо блок керування безпосередньо поряд із виконавчим пристроєм, то ймовірність збоїв менше.

Vovik07 пише:

якщо будуть питання по коду. Чи можна вас запитувати... Чи краще створити свою тему?

Та думаю, зручніше, коли окреме питання - окрема тема.

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