board707 / DMD_STM32

STM32Duino library for RGB, Monochrome and Two-color led matrix panels
GNU General Public License v3.0
54 stars 18 forks source link

Проблема с панелью 128*64 пикселя #114

Open SilentWalker9 opened 2 weeks ago

SilentWalker9 commented 2 weeks ago

Panel description

Dimensions (in pixels) : 128*64

Scan factor: 1/32

Chips on rear side: ICN2037BP, 74HC245KAJ, 74HC04D, RUC7258D

Panel photos

IMG_20240610_171427

Specifications

board707 commented 2 weeks ago

Добрый день Пожалуйста выложите код, которым тестируете

SilentWalker9 commented 2 weeks ago

Добрый день Пожалуйста выложите код, которым тестируете


/*--------------------------------------------------------------------------------------
Demo for RGB panels

DMD_STM32a example code for STM32 and RP2040 boards

The example shows the use of a multi_color scrolling and fixed text.

In multicolor mode each letter of the text prints in different color. If string contains more chars than there are colors in the list - the list restarts from beginning. ------------------------------------------------------------------------------------- */

include "DMD_RGB.h"

include "pic1.h"

// Fonts includes

include "st_fonts/UkrRusArial14.h"

include "st_fonts/UkrRusSystemFont5x7.h"

//Number of panels in x and y axis

define DISPLAYS_ACROSS 1

define DISPLAYS_DOWN 1

// Enable of output buffering // if true, changes only outputs to matrix after // swapBuffers(true) command // If dual buffer not enabled, all output draw at matrix directly // and swapBuffers(true) cimmand do nothing

define ENABLE_DUAL_BUFFER true

// ==== DMD_RGB pins ==== // mux pins - A, B, C... mux pins must be consecutive in ascending order

define DMD_PIN_A 7

define DMD_PIN_B 8

define DMD_PIN_C 9

define DMD_PIN_D 10

define DMD_PIN_E 11

// put all mux pins at list uint8_t mux_list[] = { DMD_PIN_A, DMD_PIN_B, DMD_PIN_C, DMD_PIN_D, DMD_PIN_E };

// pin OE must be one of PB0 PB1 PA6 PA7

define DMD_PIN_nOE 4

define DMD_PIN_SCLK 5

// Pins for R0, G0, B0, R1, G1, B1 channels and for clock. // By default the library uses RGB color order.2 // If you need to change this - reorder the R0, G0, B0, R1, G1, B1 pins. // All this pins also must be consecutive in ascending order uint8_t custom_rgbpins[] = { 6, 12, 13, 14, 15, 16, 17 }; // CLK, R0, G0, B0, R1, G1, B1 // Fire up the DMD object as dmd<MATRIX_TYPE, COLOR_DEPTH> // We use 64x32 matrix with 16 scans and 4bit color: DMD_RGB<RGB128x64plainS32, COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER); // other options are: // - 32x16 matrix with 8scans // - 80x40 matrix with 20scans // - 64x64 matrix with 32scans // Color depth - (STM32 only), or

// --- Define fonts ---- // DMD.h old style font DMD_Standard_Font Arial_F(Arial_14);

void setup(void) { // initialize DMD objects dmd.init(); // Disable scrolling method by moving entire screen dmd.disableFastTextShift(true); for (int x = 0; x < 100; x++) { dmd.fillScreen(dmd.Color888(255, 255, 255)); dmd.fillScreen(dmd.Color888(0, 0, 0)); } for (int x = 0; x < 100; x++) { for (int x = 0; x < 128; x++) { for (int y = 0; y < 64; y++) { dmd.drawPixel(x, y, 0xFFFF); } } }

delay(1000); }

void loop(void) { // create foreground colors for mono-color text uint16_t col[] = { dmd.Color888(255, 0, 0), // red //dmd.Color888(0, 128, 128), dmd.Color888(0, 255, 0), // green dmd.Color888(0, 0, 255) // blue }; int col_cnt = 3; // color count uint16_t bg = 0; // background - black

// create colors for multicolor strings // The 1st color of the list used as background uint16_t colors[] = { bg, col[0], col[1], col[2] }; DMD_Colorlist multicolor(4, colors);

// select standard font dmd.selectFont(&Arial_F);

// text // We do not recode it when use standard fonts. // Transcode non-English messages to UTF needs for use with GFX fonts only. //editor.maxTokenizationLineLenght(800); char g[] = "созерцания этого великого фрактального подобия, и от вот этого замечательного всеединства существа, бесконечно-вечного, куда ни посмотри: хоть вглубь - в бесконечно малое, хоть ввысь - в бесконечно большое."; char s[] = "как эта Земля. Мне этот мир уже во многом понятен, и ищу я здесь только одного - покоя, умиротворения, и вот этой гармонии, от слияния с бесконечно-вечным, от "; char t[] = "Я, в своем познании настолько преисполнился, что как будто бы уже сто триллионов миллиардов лет, проживаю на триллионах и триллионах таких же планет. Планет, "; char year[] = "BOBRE";

// shift steps in pixels for running text (positive - shift right, negative - left) int8_t step[] = { -1 }; // running text shift interval uint16_t interval = 8;

long prev_step = millis(); uint16_t col_ptr = 0; uint16_t i = 0; uint16_t test = 800; uint16_t test_cnt = 3; dmd.setBrightness(255);

// Cycle for tests: // -- running texts moving left and right with single and double speed

while (1) {

//dmd.drawFastHLine(0,0,50,0b1111111111111);
if ((millis() - prev_step) > interval) {
  prev_step = millis();  // moved to the start of the loop to prevent "scroll not smooth" issue
  if (test >= test_cnt) {
    test = 0;
    // draw library name as mono-color message
    dmd.setMarqueeColor(col[0], bg);
    dmd.drawMarqueeX(g, -1 * (dmd.stringWidth(g)), 0);
    dmd.swapBuffers(true);
  }
  switch (test) {
    // moving text at x axis
    case 0:
      if (dmd.stepMarquee(step[i], 0) & 1) {  // if text is reached screen bounds

        dmd.clearScreen(true);
        // set next text color
        col_ptr++;
        if (col_ptr >= col_cnt) col_ptr = 0;

        // set text in single color
        //dmd.setMarqueeColor(col[col_ptr], bg);

        // set color list for multicolor
        dmd.setMarqueeColor(&multicolor);

        // set new text speed
        i++;
        // if all moving finished
        if (i > 3) {  // return to start
          i = 0;
        }

        if (step[i] < 0) dmd.drawMarqueeX(t, dmd.width() - 1, 0);
        else dmd.drawMarqueeX(s, -1 * dmd.stringWidth(s), 0);
      }

      // renew fixed text
      uint8_t text_start = (dmd.width() - dmd.stringWidth(year)) / 2;  // center aligned text
      dmd.drawStringX(text_start, 15, year, col[2]);
      DrawRect(0, 0, 127, 63, 0xFFFF, 0);
      // output mem buffer to matrix
      dmd.swapBuffers(true);
      break;
  }
}

}

}

void DrawRect(int x1, int y1, int x2, int y2, uint16_t color, uint8_t filled) { if(filled != 0) { /*uint32_t i;

  for ( i = y1; i <= y2; i ++ )
    dmd.drawFastHLine ( x1, i, x2, i, color );*/

} else { dmd.drawFastHLine(x1, y1, x2-x1, color); dmd.drawFastVLine(x2, y1, y2-y1, color); dmd.drawFastHLine(x1, y2, x2-x1, color); dmd.drawFastVLine(x1, y1, y2-y1, color); } }

board707 commented 2 weeks ago

На первый взгляд никаких проблем не вижу. У Вас одна такая панель или несколько? Если много - пробовали другие панели, на всех такой эффект?

SilentWalker9 commented 2 weeks ago

На первый взгляд никаких проблем не вижу. У Вас одна такая панель или несколько? Если много - пробовали другие панели, на всех такой эффект?

К сожалению только одна. Никаких графических дефектов за исключением этого.

board707 commented 2 weeks ago

Ну раз одна, то проще будет поменять местами пины нижней и верхней половины. Только надо делать это не в коде, а непосредственно на панели:

Пины 12, 13, 14 - подключите к R1, G1, B1 а 15, 16, 17 - к R0, G0, B0

Настройки в коде НЕ МЕНЯЙТЕ.

Отпишитесь потом, помогло или нет.

SilentWalker9 commented 2 weeks ago

Ну раз одна, то проще будет поменять местами пины нижней и верхней половины. Только надо делать это не в коде, а непосредственно на панели:

Пины 12, 13, 14 - подключите к R1, G1, B1 а 15, 16, 17 - к R0, G0, B0

Настройки в коде НЕ МЕНЯЙТЕ.

Отпишитесь потом, помогло или нет.

Другое дело. IMG_20240611_131418.jpg

Возможно мой косяк, не правильно понял как подключать, возник небольшой косяк на краю, но нужно отмыть сначала от флюса.

board707 commented 2 weeks ago

На обратной стороне матрицы обычно есть стрелочки, показывающие вверх. Интересно - они совпадают с ориентацией вашего изображения?

А так вроде похоже проблема решена?

SilentWalker9 commented 2 weeks ago

На обратной стороне матрицы обычно есть стрелочки, показывающие вверх. Интересно - они совпадают с ориентацией вашего изображения?

А так вроде похоже проблема решена?

Да, стрелочки совпадают IMG_20240611_141643.jpg

IMG_20240611_141633.jpg

https://mega.nz/file/DGwASRaI#6hQD6Df1A8srJMmFC99rQvJPfFtRC5J6U7AfHUxJotE По ссылке видео. Красные пиксели - большое напряжение, а вот что за артефакты. Они только на максимальной яркости.

board707 commented 2 weeks ago

Красные пиксели - большое напряжение, а вот что за артефакты.

Как вы определили про напряжение?

Под артефактами вы имеете в виду иногда мигающую строчку по центру панели?

SilentWalker9 commented 2 weeks ago

Красные пиксели - большое напряжение, а вот что за артефакты.

Как вы определили про напряжение?

Под артефактами вы имеете в виду иногда мигающую строчку по центру панели?

Не только, если присмотреться, то и под буквами промелькивает. А по напряжению, потому что от лабораторника запитан, провода на 10AWG поменял. https://mega.nz/file/2bp33BoY#pqK7TMMz9QTjeioJGA3Xn9qqDL67E0slqtaMJYD7G9M

board707 commented 2 weeks ago

Попробуйте поиграть интервалом прокрутки текста - 8мс для такой матрицы мало. Изменится что-то или нет?

И также снизьте яркость от 255 до 200 - вы разницу скорее всего не заметите, а с артефактами может и помочь.

SilentWalker9 commented 2 weeks ago

Попробуйте поиграть интервалом прокрутки текста - 8мс для такой матрицы мало. Изменится что-то или нет?

И также снизьте яркость от 255 до 200 - вы разницу скорее всего не заметите, а с артефактами может и помочь.

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

board707 commented 2 weeks ago

ранее она у меня тоже была на максимальной яркости, а артефактов не было.

Эти матрицы работают на высоких частотах (до 25 МГц) - поэтому они крайне чувствительны к качеству соединений и длине проводов. Если артефакты то появляются. то изчеазают - это практически 100% плохие контакты.

SilentWalker9 commented 2 weeks ago

ранее она у меня тоже была на максимальной яркости, а артефактов не было.

Эти матрицы работают на высоких частотах (до 25 МГц) - поэтому они крайне чувствительны к качеству соединений и длине проводов. Если артефакты то появляются. то изчеазают - это практически 100% плохие контакты.

Тогда не было бы зависимости от яркости. Только от содержимого. Разводка платы экрана, возможно, немного кривая. У меня экран, тоже использует pio, на ili9486, больше 40МГц работает на лапше спаянной на коленке. Кстати, как я понял, запись данных в экран идёт вне зависимости от обращения к библиотеке?

board707 commented 2 weeks ago

Тогда не было бы зависимости от яркости. Только от содержимого.

Это разные факторы. Контакты - аппаратная проблема, зависимость от яркости - программная. Я не могу сказать издалека, в чем у вас дело - одно, другое, а может и то и то разом, поэтому даю рецепты наугад.

как я понял, запись данных в экран идёт вне зависимости от обращения к библиотеке?

Принцип работы ХАБ75 панелей требует обновления данных тысячи раз в секунду

SilentWalker9 commented 2 weeks ago

Тогда не было бы зависимости от яркости. Только от содержимого.

Это разные факторы. Контакты - аппаратная проблема, зависимость от яркости - программная. Я не могу сказать издалека, в чем у вас дело - одно, другое, а может и то и то разом, поэтому даю рецепты наугад.

как я понял, запись данных в экран идёт вне зависимости от обращения к библиотеке?

Принцип работы ХАБ75 панелей требует обновления данных тысячи раз в секунду

Ну я понял, что он организован на сдвиговых регистрах. Теперь такой вопрос, тактовая экрана зависит от частоты проца?

SilentWalker9 commented 2 weeks ago

Кажется я нашёл проблему.1718103338.jpg

Это моя обычная настройка фиолетовых плат. И на такой настройке артефакты имеются. 1718103333.jpg

Это стандартная настройка частоты, на ней нет артефактов. Не зависит от частоты процессора, но зависит от выставленного делителя на QSPI, что очень странно.

SilentWalker9 commented 2 weeks ago

Тактовая частота, что интересно, не меняется при смене делителя скорости флеш. А при смене частоты процессора меняется. При том, я сейчас очень внимательно последил, это не просто артефакты, а кратковременное смещение пикселей вниз, на один. А полоса по середине, это что-то непонятное.

board707 commented 2 weeks ago

зависит от выставленного делителя на QSPI, что очень странно.

Насколько я помню, на QSPI висит внутренний флеш. Возможно что память дает артефакты при оверклоке?

такой вопрос, тактовая экрана зависит от частоты проца?

Прямой зависимости нет.

SilentWalker9 commented 2 weeks ago

зависит от выставленного делителя на QSPI, что очень странно.

Насколько я помню, на QSPI висит внутренний флеш. Возможно что память дает артефакты при оверклоке?

такой вопрос, тактовая экрана зависит от частоты проца?

Прямой зависимости нет.

QSPI при разгоне процессора из-за делителя становится ещё ниже, чем в стоке. Измерить нормально не смогу, ибо ослик на 25МГц.

board707 commented 2 weeks ago

Насчет "зависиморсти нет" - был неправ, зависит. Делитель частоты PIO машины задан явно - и выбран из расчета дефолтной частоты проца. При оверклокинге Пико в два раза клок на матрице тоже будет в два раз быстрее, при таких значениях некоторые панели уже начинают сбоить.

SilentWalker9 commented 2 weeks ago

Насчет "зависиморсти нет" - был неправ, зависит. Делитель частоты PIO машины задан явно - и выбран из расчета дефолтной частоты проца. При оверклокинге Пико в два раза клок на матрице тоже будет в два раз быстрее, при таких значениях некоторые панели уже начинают сбоить.

Тут проблема с доступом к флешу возникает, по всей видимости. IMG_20240611_161332.jpg

Тактовая QSPI в стоке.

IMG_20240611_161447.jpg

В разгоне.

board707 commented 2 weeks ago

Для проверки попробуйте поменять делитель pio_clkdiv со значения 3 на 5 или 6 и запустить с оверклоком. Если дело в этом - артефакты должны уйти.

pio_clkdiv задается в файле DMD_STM32a.h line 472

SilentWalker9 commented 2 weeks ago

Для проверки попробуйте поменять делитель pio_clkdiv со значения 3 на 5 или 6 и запустить с оверклоком. Если дело в этом - артефакты должны уйти.

pio_clkdiv задается в файле DMD_STM32a.h line 472

Нет, не влияет. Я это и пытался донести, что проблема не в тактировании экрана, а в районе кода. Попробую отключить двойной буфер. Двойной буфер не влияет.

board707 commented 2 weeks ago

это не просто артефакты, а кратковременное смещение пикселей вниз, на один.

на самом деле это один из самых типичных артефактов на подобных библиотеках (моей в том числе). Он связан с расинхроном вывода данных и переключения строк. Если грубо, матрица работает по типу динамической индикации. В каждый конкретный момент на панели светится только одна горизонтальная строка. Матрица имеет на борту память только на одну строчку. Чтобы засветить следующую строчку, нужно сначала загрузить данные этой строки, а потом переключить вывод. Если переключить строчку чуть раньше или чуть позже, данные засветят соседнюю строчку. В общем, это проблема скорее всего где-то в моем коде, но найти проблему без тестов на реальной матрице непросто.

SilentWalker9 commented 2 weeks ago

это не просто артефакты, а кратковременное смещение пикселей вниз, на один.

на самом деле это один из самых типичных артефактов на подобных библиотеках (моей в том числе). Он связан с расинхроном вывода данных и переключения строк. Если грубо, матрица работает по типу динамической индикации. В каждый конкретный момент на панели светится только одна горизонтальная строка. Матрица имеет на борту память только на одну строчку. Чтобы засветить следующую строчку, нужно сначала загрузить данные этой строки, а потом переключить вывод. Если переключить строчку чуть раньше или чуть позже, данные засветят соседнюю строчку. В общем, это проблема скорее всего где-то в моем коде, но найти проблему без тестов на реальной матрице непросто.

Перетекание оптимизации на fast почти избавило от артефактов. Я готов предоставить помощь удаленно, единственное в свободное время от работы. Сам писал либу на свой экран, правда через sio, а не pio, поэтому понимаю.

board707 commented 2 weeks ago

Спасибо. У меня сейчас нет ни одной стандартной матрицы такого размера, только всякая экзотика :) Так что мне может понадобится Ваша помощь для проверки на реальной панели, влияют ли мои исправления на артефакты или нет. И хорошо что Вы подняли эту тему, я всегда рад баг-репортам :)

SilentWalker9 commented 2 weeks ago

Спасибо. У меня сейчас нет ни одной стандартной матрицы такого размера, только всякая экзотика :) Так что мне может понадобится Ваша помощь для проверки на реальной панели, влияют ли мои исправления на артефакты или нет. И хорошо что Вы подняли эту тему, я всегда рад баг-репортам :)

Не за что, тестером быть забавно, можно находить то, что не должно выплывать)

board707 commented 4 days ago

Привет, возвращаясь к проблеме - если честно, каких-то явных причин для артефактов я не нашел. Кое-какие шероховатости поправил в коде, хотя не уверен, что они как-то повлияют. Можете в последней версии библиотеки заменить файлы из приаттаченного архива и снова запустить тест? dmd_rgb_dma_clk_test.zip

SilentWalker9 commented 4 days ago

Привет, возвращаясь к проблеме - если честно, каких-то явных причин для артефактов я не нашел. Кое-какие шероховатости поправил в коде, хотя не уверен, что они как-то повлияют. Можете в последней версии библиотеки заменить файлы из приаттаченного архива и снова запустить тест? dmd_rgb_dma_clk_test.zip

Через пару часов, вернусь после работы и отпишусь. Кстати, появилась проблема с SPI.

SilentWalker9 commented 3 days ago

https://mega.nz/file/nH4yQITI#fNdRTfgLmg97ElaNyPObOrLwlHwppnwZTxSoAotQaOc Это после замены файлов вашими. Артефакты ушли, но я не уверен, ибо мог и я до этого что-нибудь накрутить. https://mega.nz/file/jfxDwBTZ#2AGppFo-NVzSdTooWo6t2kKB5ab5P0xtv9eDuyuf5TI А это при попытке включения SPI, но отсутствия общения по нему, ибо модуль NRF24L01 принимает данные, но они по какой-то причине искажённые до неузнаваемости.

board707 commented 1 day ago

мог и я до этого что-нибудь накрутить

Можете мне прислать код библиотеки, который у Вас получился после Ваших и моих изменений?

А это при попытке включения SPI,

Честно говоря, не вижу разницы с предыдущим видео...

Что касается проблем с SPI - можете мне выложить полный код скетча, на котором это проявляется?