#1 Re: Апаратні питання » STM32f429 LTDC VGA джитер » Сьогодні 04:39:03

duron пише:

Ще прийшла в голову думка, запустити на таймері ШІМ із піксельною частотою і заповненням 50% , тоді тактову частоту таймера і LTDC можна буде подати на окремі входи кольорів, і візуально оцінити чи працюють вони синхронно.

Слушна думка. Там окремий PLLSAI, то може відбувається якийсь зрив генерації в самому МК. Але таке мало би бути видно на осцилограмі тактового виходу.

Ще, дуже здивуюсь, якщо причина в цьому, але чому б не перевірити. У програмі з гітхаба фреймбуфер розташований в зовнішній SDRAM. Спробуйте перемістити його у внутрішню SRAM.

#2 Re: Апаратні питання » STM32f429 LTDC VGA джитер » Сьогодні 01:51:21

duron пише:

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

Вправо? Цікаво, я би очікував навпаки, вліво. Буфер вносить затримку порядка десятка наносекунд, тобто відносно синхроімпульса сигнал зображення повинен приходити трошки раніше. Але тривалість пікселя 40 нс, так що це не було би декілька пікселів.
Хоча, з іншого боку, це означає, що розсинхронізація стала відбуватись пізніше. В ідеалі вона мала "зміститись" вправо настільки, що синхроімпульс нового рядка мав би приходити раніше, ніж ця розсинхронізація відбудеться.

Питання навмання: не пробували інвертувати полярність HSync?

duron пише:

Чітко видно тактовий сигнал, і якийсь незрозумілий шум.

В ідеалі тактовий сигнал з заповненням 50% мав би відображатись як суцільне поле половинної яскравості, бо один імпульс приходиться на один піксель. А тут якась інтерференційна картина. Зрозуміло, що АЦП монітора семплує миттєві (в першому наближенні) значення. Але він мав би семплувати з частотою, в кілька разів вищою за частоту пікселів, і усереднювати (фільтрувати). Схоже, він семплує прямо на відновленій частоті пікселів і ніякого усереднення не робить.

Питання навмання: Не перевіряли цей монітор з джерелом заздалегідь робочого VGA сигнала, наприклад HDMI-VGA адаптером або старою відеокартою з VGA-виходом? Мені в свій час допоміг ось такий генератор. Може це особливість самого монітора, виробник зробив VGA-вхід "аби було"?

А як, наприклад, виглядають вертикальні лінії в один піксель з інтервалом в пару десятків пікселів?

#3 Re: Апаратні питання » STM32f429 LTDC VGA джитер » Вчора 22:01:57

duron пише:

Можливо проблема ще може бути в частоті піксельних даних, стандарт відео 640x480 вимагає частоту пікселів 25.175 мГц, PLL LTDC вдається налаштувати саму ближчу частоту 25.125 мГц.

Специфікація VESA (наступний за VGA стандарт) допускає відхилення pixel clock до ±0.5%, у вас виходить менше 0.2%. Сам піксель-клок у VGA нікуди ж не передається, але на ньому базуюється решта таймінгів.

Зі своїх давніх експериментів з VGA памʼятаю, працювало і з набагато більшими відхиленнями. При перевищенні порогових значень TFT-монітори (які тоді тільки зʼявились у нас) або переходили в сплячку, або відображали "нема сигнала". Але таких артефактів із джиттером не памʼятаю.

Cхожий (але не такий) джиттер бачив при підключенні PAL RGB-сигнала від ZX Spectrum до розʼєму SCART телевізора. Там вирішилось узгодженням імпедансів та екрануванням.

duron пише:

Осцилограф є fnirsi 1C15, ним цю заваду розгледіти не вдається

Ну тут фазовий шум. Потрібно дивитись на крутизну фронтів синхроімпульсів (slew rate), і стабільність моментів часу, коли сигнал досягає певного рівня (який залежить від схеми монітора). Може цьому конкретному монітору взагалі не подобається рівень 3.3 В, може для стабільної роботи він хоче 5.

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

Крім того, у VGA для кожної кольорової компоненти окрема зворотня лінія землі. Використання для сигналів кольору і синхронізації спільної землі на розʼємі теж може негативно впливати.

Підозріло виглядає співпадіння паттерна джиттера з паттерном на тактовому виході при підключенні його до Green. Хоча тут може бути, що наведення просто йде однакове на всі лінії, і сигнал на тактовому виході тут ні до чого. Тактовий вихід у вас же просто висить "у повітрі", нікуди не навантажений на самій платі?

#4 Re: Апаратні питання » STM32f429 LTDC VGA джитер » Вчора 02:25:55

duron пише:

на жаль не підходить LTDC для моніторів з аналоговим входом.

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

#5 Re: Апаратні питання » STM32f429 LTDC VGA джитер » Вчора 01:23:48

Що ж, моя гіпотеза - відбувається розсинхронізація між піксель-клоком LTDC і відновленим піксель-клоком у моніторі. Скоріш за все через недосконалість аналогової частини та особливості дискретизації аналогового сигнала в TFT-моніторі. Через це фронт відеосигнала попадає то в один піксель, то в інший, сусідній.
Кінескопний монітор не відновлює піксел-клок, там це не потрібно.

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

Як воркераунд, можете спробувати в лінії Green після резистора поставити конденсатор десь 10-47 пФ в землю (підберіть експериментально). Це має "розмити" зображення і джиттер буде не так помітно.

#6 Re: Апаратні питання » STM32f429 LTDC VGA джитер » Вчора 00:32:33

duron пише:

Піни LTDC, в процесі наладки зменшив до 3х (PI9=VSYNC,  PI10=HSYNC, PI2=VIDEO G7).

Які номінали резисторів на кожному з пінів? (на фото не розібрати).

На схемі в проекті з гітхаба R-2R ЦАП, він робить певну аттенюацію. У вас, якщо на виході PI2 3.3В, то має бути десь 270-300 Ом.
На VSYNC і HSYNC навпаки, мають бути TTL-рівні, 82 Ома може бути забагато (від схеми монітора залежить).

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

duron пише:

Саме на цих зелених смугах і відбувається джитер пікселів.

Так мабуть цей сигнал і пролазить у відеосигнал, може й не прямо, а побічно. Схему підключення ж теж не показуєте.
TFT монітор намагається синтезувати піксель-клок по імпульсам горизонтальної синхронізації, а поріг спрацьовування плаває через шум квантування АЦП. Сигнал VGA-то аналоговий, і горзонтальна синхронізація йде в каналі зеленого.
Без коду, де той LTDC конфігурується, без схеми підключення, без діагностичної інформації це ворожіння на кавовій гущі.

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

duron пише:

підключивши тактовий вихід LTDC на вхід зеленого кольору монітора, ці смуги стає добре видно.

Схоже на імпульси частотою близько 80 кГц, розмазані за рахунок характеристики навантаження. Що ще може бути на тактовому виході? Вони мабуть і пролазять у сигнал.

#9 Re: Апаратні питання » STM32f429 LTDC VGA джитер » 2025-03-29 20:14:08

duron пише:

Цікаво що на кінескопному моніторі їх немає, зображення чисте, тому думаю проблема не в коді.

Ну може це гармоніка горизонтальної синхронізації пролазить, через те, що лінія неузгоджена. Може якісь вибрики по живленню. Без осцилограми можна довго вгадувати.

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

duron пише:

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

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

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

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

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

jokeer пише:

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

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

#12 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.

#13 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 данні що там лежать

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

#14 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, чи що інше. Потім би уже портував на ардуіну.

#15 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();

#16 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)

#17 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 процесорах. А варіант зі зсувами і масками портабельний, результат не залежить від архітектури процесора.

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

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

#20 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
?

#21 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 - це взагалі якийсь байт статуса чи то відтворення відео, чи то якоїсь анімації. Навряд чи те, що вам потрібно. Наскільки розумію, ті дисплеї мають купу різних варіантів прошивок, у яких одні й ті ж адреси мають різні призначення.
Уточніть в документації на конкретно вашу версію прошивки, за якою адресою і в якому точно форматі потрібно писати дані для відображення.

#22 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-коди символів?

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

jokeer пише:

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

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

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

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

jokeer пише:

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

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

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

#25 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().

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