Arduino и десплей от видеорегистратора

saleksei2
Offline
Зарегистрирован: 07.12.2017

Добрый вечер, уважаемые форумчане!

Есть дисплей от видеорегистратора texet dvr-101hd. Ни схему на регистратор, ни схемы подключения дисплея ничего не нашёл. Пробовал искать тип контроллера по шлейфу дисплея и нашел три варианта: 1. SPFD5408B, 2. ILI-9325/9328 3. ST7789S. От третьего не нашел драйвера. От драйвера ili9341 дисплей ожил. И графику и текст правильно отображает. Разрешение экрана 240*320. Но цвет был всего лишь один- синий. Покопавшись в даташите от st7789s нашел адреса которые отвечают за битность цвета и выставил, чтобы дисплей считывал 12-битные данные цветности и о чудо- я стал наблюдать 2 цвета- синий и зеленый. Далее проинвертировал биты дисплея с BGR на RGB  и стал видеть красный и зеленый и желтый. Фото прилагаю того что получилось. Определить тип контроллера прогой для тестирования от adufruit_lcd не удалось- пишет 0(ноль) неизвестный дисплей. Получается что команды и биты очень похожи от 9341, но не оно. Подскажите где в adafruit_tftlcd находятся команды записи цвета для 9341. Я так понимаю, что 16битный цвет должен разбиваться на 2 по 8 бит и по очереди передаваться в контроллер дисплея, а этого не происходит. 

saleksei2
Offline
Зарегистрирован: 07.12.2017

название дисплея

saleksei2
Offline
Зарегистрирован: 07.12.2017

Текст присутствует зеленый и желтый цвет

saleksei2
Offline
Зарегистрирован: 07.12.2017

saleksei2
Offline
Зарегистрирован: 07.12.2017

Графика

arduinec
Offline
Зарегистрирован: 01.09.2015

saleksei2 пишет:

Добрый вечер, уважаемые форумчане!

Я так понимаю, что 16битный цвет должен разбиваться на 2 по 8 бит

На 2 по 5 бит и 1 по 6 бит, или 3 по 5 бит.

saleksei2
Offline
Зарегистрирован: 07.12.2017

arduinec, это я разобрался, что цвет состоит из R- 5бит, G-6бит, B-5бит, спасибо. А где в adufruit_tftlcd.cpp находится команда отправляющая код цвета на дисплей? Я хочу разобраться по какому принципу записываются данные о цвете пикселя/символа в память дисплея- т.е. это мой дисплей игнорирует следующий байт с цветом или же из программы надо подавать синхроимпульс для записи следующего байта цвета в дисплей.

Logik
Offline
Зарегистрирован: 05.08.2014

После ресета и инита подается команда на запись видеобуфера. Затем поток данных для отображения, попиксельно, каждый пиксель - 2 байта как выше написано. Так хоть весь экран заливаем. Полезно ограничить область вывода нужным прямоугольником, тогда его залем. Самый худший вариант - для каждого пикселя заново команду и 2 байта данных. Символов, как таковых у экрана нет, чисто графика, только пиксели, только хард ))

saleksei2
Offline
Зарегистрирован: 07.12.2017

Logik, шина c arduino uno используется 8-ми битная к дисплею подключаю к младшим 8 битам. Допустим код цвета 0хF3E5- это уже 16 бит (2 байта). Как программно записать этот цвет пикселя? кусок кода можешь скинуть как это программно выглядит?

Логически, я думаю, что надо передать сначала 0хЕ5, потом команда для дисплея на прием следующего байта, и передаем следующий байт 0хF3. Мне бы кусок программного кода поглядеть, а то я никак не найду где он находится чтобы порпавить под себя.

Logik
Offline
Зарегистрирован: 05.08.2014

Правильно думаете, только без команд перед вторым байтом. Только что первое (0хЕ5 или 0хF3) а что второе - проще опытным путем. Вобщем так на шине должно быть :<команда записи байт 1>,<команда записи байт 2>, <пиксель 1, байт 1>, <пиксель 1, байт 2>, <пиксель 2, байт 1> , <пиксель 2, байт 2>...

Управляющие сигналы соответствующие выставлять и менять  - и всех делов то.

/********************************** low level readwrite interface */

// the C/D pin is high during write
void TFTLCD::writeData(uint16_t data) {

    volatile uint8_t *wrportreg = portOutputRegister(wrport);

  *portOutputRegister(csport) &= ~cspin;
  //digitalWrite(_cs, LOW);
  *portOutputRegister(cdport) |= cdpin ;
  //digitalWrite(_cd, HIGH);
  *portOutputRegister(rdport) |= rdpin;
  //digitalWrite(_rd, HIGH);

  *wrportreg |=  wrpin;
  //digitalWrite(_wr, HIGH);

  setWriteDir();
  write8(data >> 8);
  
  *wrportreg &= ~wrpin;
  //digitalWrite(_wr, LOW);
  *wrportreg |=  wrpin;
  //digitalWrite(_wr, HIGH);

  write8(data);

  *wrportreg &= ~wrpin;
  //digitalWrite(_wr, LOW);
  *wrportreg |=  wrpin;
  //digitalWrite(_wr, HIGH);

  *portOutputRegister(csport) |= cspin;
  //digitalWrite(_cs, HIGH);

}


// the C/D pin is low during write
void TFTLCD::writeCommand(uint16_t cmd) {

    volatile uint8_t *wrportreg = portOutputRegister(wrport);

  *portOutputRegister(csport) &= ~cspin & ~cdpin;
  //digitalWrite(_cs, LOW);
  *portOutputRegister(cdport) &= ~cdpin;
  //digitalWrite(_cd, LOW);
  *portOutputRegister(rdport) |= rdpin;
  //digitalWrite(_rd, HIGH);

  *wrportreg |=  wrpin;
  //digitalWrite(_wr, HIGH);

  setWriteDir();
  write8(cmd >> 8);

  *wrportreg &= ~wrpin;
  //digitalWrite(_wr, LOW);
  *wrportreg |=  wrpin;
  //digitalWrite(_wr, HIGH);

  write8(cmd);

  *wrportreg &= ~wrpin;
  //digitalWrite(_wr, LOW);
  *wrportreg |=  wrpin;
  //digitalWrite(_wr, HIGH);

  *portOutputRegister(csport) |= cspin;
}


void TFTLCD::drawPixel(uint16_t x, uint16_t y, uint16_t color)
{
  // check rotation, move pixel around if necessary
    switch (rotation) {
..........
    }
    
  if ((x >= TFTWIDTH) || (y >= TFTHEIGHT)) return;
  writeRegister(TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h)
  writeRegister(TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h)
  writeCommand(TFTLCD_RW_GRAM);  // Write Data to GRAM (R22h)
  writeData(color);
}

Я digitalWrite заменил на более быстрое, но оставил под коментами для понимания.

saleksei2
Offline
Зарегистрирован: 07.12.2017

Logik, спасибо! Получается сам дисплей должен ожидать приема следующего байта, а он не ожидает, т.к находится в 16 битном режиме((( Я пробывал самые разные комбинации IW0-IW3, а он как работал так и работает в одном режиме. На плате стояли резюки по 0 Ом и получался код 1001, наверное, все таки, в дисплее жестко прописан режим.((( 

Остается подключить дисплей или в 12 битный режим(в него я могу перевести программно) или в 16 битный режим- а это минус 4 пина( как минимум) на ардуинке. Для Mega это не критично, а вот для UNO - ограниченный функционал. Или использовать два основных цвета "Синии + зеленый" или "Красный + Зеленый". Так тоже неплохо получается)

Пробывал неиспользуемые пины дисплея D10-D17 сажать на +3,3В, появляется белый цвет, и весь фон засвечивается оттенком красного или синего, а не черный. Так хуже нежели использовать 2 цвета в 12 битном режиме.

Logik
Offline
Зарегистрирован: 05.08.2014

Так перепаяйте резюки, чтоб в 8-битный перешло.

 

saleksei2
Offline
Зарегистрирован: 07.12.2017

Все комбинации перебрал, так и не перешел в 8-ми битный режим. Я отдельно провода вывел и перебирал все 16 вариантов. Наверное жестко сидит 16 битный вариант.

arduinec
Offline
Зарегистрирован: 01.09.2015

saleksei2 пишет:

Остается подключить дисплей или в 12 битный режим(в него я могу перевести программно) или в 16 битный режим- а это минус 4 пина( как минимум) на ардуинке. Для Mega это не критично, а вот для UNO - ограниченный функционал.

Если Меги нет, то можно со сдвиговыми регистрами 595 побаловаться.

saleksei2 пишет:

Пробывал неиспользуемые пины дисплея D10-D17 сажать на +3,3В, появляется белый цвет, и весь фон засвечивается оттенком красного или синего, а не черный. Так хуже нежели использовать 2 цвета в 12 битном режиме.

Вот ещё вариант: подавать сигналы на 3 старших бита каждого цвета, а оставшиеся биты притянуть к "земле". Но для этого нужно определить: какой пин за какой бит какого цвета отвечает.

Logik
Offline
Зарегистрирован: 05.08.2014

saleksei2 пишет:

Все комбинации перебрал, так и не перешел в 8-ми битный режим. Я отдельно провода вывел и перебирал все 16 вариантов. Наверное жестко сидит 16 битный вариант.

А чего их перебирать, их там до чертиков. Если уверены что ili9341 то ищем даташит https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf там все есть, режимы например на 10стр.

 

Logik
Offline
Зарегистрирован: 05.08.2014

arduinec пишет:

Вот ещё вариант: подавать сигналы на 3 старших бита каждого цвета, а оставшиеся биты притянуть к "земле". Но для этого нужно определить: какой пин за какой бит какого цвета отвечает.

Не, там шина, там кроме данных еще и команды нужны, их так обрезать низя.

saleksei2
Offline
Зарегистрирован: 07.12.2017

Logik пишет:

saleksei2 пишет:

Все комбинации перебрал, так и не перешел в 8-ми битный режим. Я отдельно провода вывел и перебирал все 16 вариантов. Наверное жестко сидит 16 битный вариант.

А чего их перебирать, их там до чертиков. Если уверены что ili9341 то ищем даташит https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf там все есть, режимы например на 10стр.

 

В том то и дело, что до конца и не понял какой контроллер стоит. По пинам на шлейфе дисплея подошел котроллер ST7789S. Нашел даташит и если смотреть на IM0-IM3 (1001), то режим использовался 8-ми битный с подключением к старшим разрядам D17-D10. Вроде как логично и пины D9 и D0 жестко посажены на землю. Подключил информационные пины с ардуино на старшие разряды дисплея. Ииии тишина, даже никаких дерганий. Перебрал кучу драйверов и ничего. Думаю, а дайка я переброшу на младшие разряды, и о чудо экран задергался. Перебрав по очереди все драйвера, показывать стал только из под ILI9341. По кодам управления с ST7789S идентичны. 

А в видеорегистраторе использовались все 16 бит- это я пробежался по плате и вижу что все пины подключены к процессору. Из этого делаю вывод, что дешифратор дисплея определил не верно. 

Интересно у какого дешифратора  IM0-IM3 код (1001) означает 16-битный режим?

saleksei2
Offline
Зарегистрирован: 07.12.2017

А вот сдвиговые регистры это ТЕМА. Я вчера заказал для других задач 3 дисплея за 780 руб/партия 2,4" с тачами и смотрю на шилде стоит 2 микрухи- тут мне мысль пришла, что это наврено регистры стоят, но на фото не видно какие именно. Наверное 595. Спасибо за идею arduinec.

arduinec
Offline
Зарегистрирован: 01.09.2015

saleksei2 пишет:

на шилде стоит 2 микрухи

Там скорее всего стоят микросхемы преобразователей сигналов с 5 В на 3.3 В.

Logik
Offline
Зарегистрирован: 05.08.2014

Почти 100% это преобразователи уровня. С 595 регистрами тормозня будет, скорость вывода не выше 2-3 кадров в секунду получите. Если такое устроит, то проще по i2c или spi подключить.

 

arduinec
Offline
Зарегистрирован: 01.09.2015

Logik пишет:

С 595 регистрами тормозня будет, скорость вывода не выше 2-3 кадров в секунду получите. Если такое устроит, то проще по i2c или spi подключить.

Вообще, 595 достаточно быстрый регистр (предельная частота 100 МГц). Другое дело, что Ардуина с такой скоростью ему данные не успевает кидать.

Впрочем, ТС сейчас важнее с пинами разобраться, а скоростью потом озадачиться.

arduinec
Offline
Зарегистрирован: 01.09.2015

saleksei2 пишет:

Интересно у какого дешифратора  IM0-IM3 код (1001) означает 16-битный режим?

Вот у этого шилда определяется код 0101 (#46): http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

В примерах скетчей вместо 0101 подставляется код 9341 и дисплей работает (в 8-битном режиме).

Полный набор с библиотеками: https://yadi.sk/d/xNv6ovluoJVU9

saleksei2
Offline
Зарегистрирован: 07.12.2017

Arduino, спасибо за информацию. Попробую с этим библиотеками и отпишусь.

KovAl
Offline
Зарегистрирован: 25.01.2022

Всем привет!

Кто-нибудь знает, что это за дисплей и возможно ли его приспособить к ардуино-поделкам?

Дисплей снят с авто зеркала-видеорегистратора. Полный "нонейм", как собственно и сам регистратор.

На шлейфе "пароль" FPC043BA-05-09HT. Гугл на него не отзывается..

Навскидку (по внешнему виду, регистратор какой-то DEXP). Дисплей 4,3 дюйма, 24 пина.

На мелкой "материнской плате" регистратора живёт процессор GPCV5247A.