TFT дисплей: инверсия цвета
- Войдите на сайт для отправки комментариев
Сб, 14/01/2017 - 12:15
Здравствуйте.
Приобрел дисплей на чипе ILI9341, завести его удалось используя библиотеку SPFD5408 https://github.com/JoaoLopesF/SPFD5408
Но столкнулся с другой проблемой: инвертируются цвета.
Прочитав статью http://datagor.ru/microcontrollers/microcontrollers-code-library/2924-vizualizaciya-dlya-mikrokontrollera-chast-3-tft-displey-28-240h320-na-ili9341.html наткнулся на такое объяснение причины:
1. Все биты равны нулю. Это значение устанавливается по сбросу/подаче питания. Дисплей окрасился в голубоватый, а не жёлтый, цвет, хотя надпись «Datagor» – чёрная, как и планировалось. Однако, с надписью тоже не всё в порядке – она выведена в зеркальном отражении. Начало координат – в углу B. Причина путаницы с цветами следующая. В описании команды Memory Write мы выяснили взаимосвязь между битами параметра этой команды и частотой ШИМ-сигнала субпикселей: • Старшие 5 бит – частота сигнала для субпикселя красного цвета, • Средние 6 бит – частота сигнала для субпикселя зелёного цвета, • Младшие 5 бит – частота сигнала для субпикселя синего цвета. Однако, такой порядок действует, если бит BGR параметра команды MADCTL равен 1. Если же BGR = 0, то порядок – зеркальный: • Старшие 5 бит – частота сигнала для субпикселя синего цвета, • Средние 6 бит – частота сигнала для субпикселя зелёного цвета, • Младшие 5 бит – частота сигнала для субпикселя красного цвета. В этом случае неизменными остаются только те числовые значения цветов, которые симметричны в двоичном представлении – чёрный (0000000000000000), белый (1111111111111111) и зелёный (0000011111100000). Остальные цвета меняются на зеркально-противоположные: красный (1111100000000000) на синий (0000000000011111), синий на красный и т.д. Именно поэтому мы получили голубоватый экран вместо жёлтого, а надпись, как и хотели, черную.
Но никак не могу понять, что требуется сделать, чтобы решить эту проблему.
С ардуино я новичек, поэтому прошу не ругать, если что-то не так написал.
Попытка менять значение ILI9341_MADCTL_BGR 0x08 в файле registers.h окончилась безрезультатно
Сам спросил - сам отвечаю
Нашел чудесный алгоритм, спасибо Генри Уоррену
привожу код, который накидал, для проверки работы алгортма
Я его внедрил в библиотеки, чтобы в дальнейшем не возникало проблем.
Возможно есть другой способ получить нормальные цвета на данном дисплее, но я нашел только этот.
Надеюсь, что кому- то пригодится
Очень надеюсь, что это никому не пригодится.
Бороться нужно с проблемой, а не с симптомами, тем более, что средство борьбы явно слишком ресурсоемкое для маломощного контроллера.
Проще библиотеку найти ту которая нужна, а не настраивать какую попало
Все дело в инициализации дисплея. Вы используете библиотеку (или настройки библиотеки для конкретного дисплея) которые похожи по инициализации но все же от другого контроллера. То есть вы используете инициализацию не того контроллера, который используете. Выхода два: либо искать нормальную библиотеку (не правленную), либо Вам нужно почитать даташит на контроллер дисплея, выяснить какой бит отвечает за что и "ручками" подправить инициализацию в библиотеке.
Почитайте эту тему: http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=2#comment-216185 там с подобным сталкивались
я использовал для такого дисплея библиотеки отсюда
#include <UTFT.h> // UTFT Library from Henning Karlsen (http://www.rinkydinkelectronics.com/library.php)
#include <UTFT_Geometry.h> //UTFT Geometry Library from Henning Karlsen (http://www.rinkydinkelectronics.com/library.php)
Цвета в коде определялись так: (код чужой)
UTFT utftDisplay(ILI9341_16,38,39,40,41); // откомпилировался, заработал, но не влезает в экран, потихоньку правим код
На изменение бита BGR, в параметре команды Memory Access Control (0х36), дисплей никак не реагирует, однако на изменение других битов данной команды дисплей поворачивает изображение.
Пытался я бороться с проблемой, просмотрел даташит, пробовал различные команды с различными парметрами - безтолку.
На изменение бита BGR, в параметре команды Memory Access Control (0х36), дисплей никак не реагирует, однако на изменение других битов данной команды дисплей поворачивает изображение.
Пытался я бороться с проблемой, просмотрел даташит, пробовал различные команды с различными парметрами - безтолку.
Библиотеки, что я привёл пробовали?
Пробовал, но к сожалению дисплей никак не отзывается. Немного покопался в библиотеке и понял, что она для дисплеев у которых зайдествованы пины 0(RX) и 1(TX). Но в модели которая у меня эти пины дисплея свободны.
Дальние, с правой стороны. Плата внешне отличается от той, что на картинке.
Обнаружил, что дисплей отзывается на инициализацию от ILI9341 и SPFD5408. Покопавшись в даташитах обнаружил, что некоторые адреса команд и их параметры совпадают.
Вам нужно точно определить что у вас за контроллер. Для этого есть специальные программы. Читайте здесь: http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=1#comment-169922
Да и вообще перечитайте тему. Там много полезного.
Нашел рабочую библиотеку UTFT.h, дисплей завелся, как мне показалось даже шустрее чем с адафрутом.
Заводится только использовании инициализации для ILI9341, проблема таже самая.
При помощи читалки определите какой у вас контроллер, только после этого можно что-то конкретное делать. Ссылку давал выше
Не сразу понял, что от меня требуется. Выкладываю лог
о, как :) . Неужто вы подключили проводками на портА иль С к Меге ? Из этого лога только видно что он 320x240 из регистров 2A и 2С . В регистре D3 должно было лежать 9341 . Читалки это не панацея (крайне редко ID запрятан глубоко, т.е. только косвенные признаки, в таких случаях лучше уж тупо просто перебрать распространенные иниты) .
Раз у шилда адафруитстая распиновка , то вставьте шилд в Уно и запустите графические примерчики что с последней библиотекой адафруита (на гихабе к примеру), они в сериал монитор кидают известные им ID . Вот их лог и выложите.
поищите по форуму 2.4 и 0x4535 (хотя setxy у него отлична от ili9341 )
если что, у адафруита есть 2 либы по ili9341 - 8бит как у вас и SPI
я так понял проблема только с BGR - RGB ? поищите BGR по даташитам подходящих инитов дисплеев .
иначе , по поводу правильной цветопередачи м.б.:
1. неподходящий инит
2. неправильные настройки инита (гамма коррекция, регистр упр. матрицей к примеру по даташиту ili9341 это бит BGR в регистре 36h и еще упоминание BGR есть в бите SS в регистре B6h . Прочитайте еще про регистр F6h бит ENDIAN
3. непропай или сопля (тогда помимо и координаты нарушаться)
4. не та битность дисплея 8/9 16/18 бит (отдирать дисп и смотреть на шлейф , возможность уст. правильную битность перемычками или выводами IM ) . Ваша програмная примочка из 2го сообщения comment-251940 дает белый цвет? гляньте по даташиту ili9341 различие кодировки цветности 8 и 9 бит при параллельном интерфейсе : 7.6.3. 8-bit Parallel MCU Interface и 7.6.4. 9-bit Parallel MCU Interface , там с цветными картинками кодировки цветов все показано
5. дефектный дисп или подделка
вот чтение регистров с нормального ili9341 , в регистре D3h лежит 9341 :
Подключал к меге к тем пинам которые указаны в описании к програме, насколько я понял это и есть портА (22-29 пины). Разрешение дисплея верное.
Как я уже писал выше для этого дисплея подошел инит от ili9341, в команду 0х36 вводится параметр 0х48, если я все правильно понял, то 0х08 это как раз и есть бит BGR. Но отключение этого бита и ввод параметра 0х40 - ничего не дает, изменение других битов данной команды - вращает/отражает изображение на экране.
Адафруит так же не может определить ИД и в лог выводит прочитаный ид 0, и ни одна программа из примеров не запускается, для запуска программ я скармливаю библиотеке ид 0x9341 в строке tft.begin(0x9341).
Лазил по даташиту, искал все команды связанные с выводом цвета, но никаких успехов не добился.
2. вечером гляну еще раз, попробую поиграть с битами.
3. я заметил, что изображение выводится вверх ногами, так же коогдинаты сенсора сдвинуты относительно дисплея на -90гр. (по часово стрелке). Вы про такие нарушения координат?
4. Так же вечером гляну на шлейф. Примочка дает адекватные цвета и белый в том числе, она ведь не инвертирует биты, а лишь зеркально отражает каждый байт и меняет их местами:
11111000 00000000 -> 00000000 00011111
5. Насчет подделки вероятность стремится к 100% https://ru.aliexpress.com/item/For-Arduino-UNO-2-4-inch-TFT-touch-screen-supporting-For-UNO-R3/1625923145.html?spm=2114.13010608.0.0.tr23SC
В следующий раз буду знать, что именно заказывать
Оторвал дисплей от платы, проверил пайку - холодной пайки нет. шлейф целый, без деффектов.
Искал информацию про пин IM, но ничего не нашел
в библиотеке прописана инициализация 8 битного порта writeRegister8(ILI9341_PIXELFORMAT, 0x55), если попробовать задать 9 битный порт - 0х66, то дисплей отображает
Euronimus, попробуйте http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=5#comment-264976
1. что выдаст читалка v5.1 ?
2. попробовать скетч от MCUFRIEND ,
3. попробовать UTFT запиленный под LCD TFT 2.4" R61526 arduino uno .
На днях попробую, о результатах отпишусь. Спасибо за ссылку.
Из своего опыта борьбы с таким дисплеем, скажу что лично у меня не получилось запустить его с UTFT. Только Adafruit. И то после непродолжительных танцев с бубном. Искать "правильную" библиотеку всё равно что искать стандартный ключ от нестандартного замка - бред. Китайпром производит контроллеры быстрее, чем обновляются библиотеки их управления.
Насчет инверсии цвета особо высказываться не могу, поскольку не разбираюсь во всех этих тонкостях с байтами и регистрами. На мой взгляд это может быть банальная ложная пайка где-то на плате. Однако так же это может быть и несоответствие в софте.
Когда пытался засветить свой дисплей 9341, копал только в единственно доступном мне напралении - библиотеки, однако опять же без осознания смысла происходящего. Помнится что в результате пару раз проскакивала инверсия цвета. Но сейчас - все работает как надо, но, к сожалению - на Adafruit. Еще помнится там у меня был какой-то нестандартный способ инициализации дисплея. Сейчас посмотрю.
Вот только такая комбинация засветила мой ILI9341.
Наконец снова добрался до этого дисплея и в какомто смысле победил его. Теперь цвета выводит правильно.
Столкнулся с аналогичным дисплеем. В итоге экран адекватно заработал при выборе чипа R61526A вместо ili9341.
А библиотеку не скинете?
https://yadi.sk/d/KT8dnNv63U5WnR
Не могу найти, где скачал; дал бы ссылку на оригинал))
Нашел, где читал:
http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=5#comment-264976
Вот 100%-рабочий скетч с библиотекой UTFT
https://yadi.sk/d/6-04v7G53U5aKq
Благодарю. Странно, что гугл мне не предлагал ссылку на сообщение слайдера, но давал ссылку на Ваше сообщение тут ))