Перейти к содержанию
    

ili9341 и Tearing effect

Коллеги, я примерно представляю себе что это такое и как с этим бороться.

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

Насколько я понимаю, для синхронизации нужен контроль сигнала вертикальной синхронизации.

 

У меня есть дисплей китайский на ili9341. Понимает команды Tearing effect ON|OFF. Однако включение и выключение никоим образом не влияет на мерцание экрана при его заливке. А заливка происходит быстро - около 30 мсек.

 

Как все таки избавиться от этого эффекта? Или команда Tearing effect OFF - это фишка, свойственная собственно кристаллу контроллера ili9341, реализация которой производителем дисплея не реализована (не выведен сигнал TE) ?

ILI9341.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант вы можете подключить дисплей по RGB интерфейсу и тогда вы сами будете генерировать для дисплея VSYNC и HSYNC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант вы можете подключить дисплей по RGB интерфейсу

Как вы себе это представляете для дисплея, у которого на шлейфе разведен только SPI ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вы дали даташит на контроллер, у которого RGB есть)) Что там на дисплее я не знал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вы себе это представляете для дисплея, у которого на шлейфе разведен только SPI ?

Очевидно отвечающие Вам должны обладать телепатическими способностями. Тогда так и указывайте в заголовке темы.

 

По SPI вряд-ли Вам удастся это как-то побороть. Посмотрите в мануале какая макс. скорость по SPI и посчитайте общее время обновления экрана. Или Вы не весь экран обновляете (извините - не обладаю телепатическими способностями)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/1/2016 at 1:17 AM, murmur said:

Коллеги, я примерно представляю себе что это такое и как с этим бороться.

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

Насколько я понимаю, для синхронизации нужен контроль сигнала вертикальной синхронизации.

У меня есть дисплей китайский на ili9341. Понимает команды Tearing effect ON|OFF. Однако включение и выключение никоим образом не влияет на мерцание экрана при его заливке. А заливка происходит быстро - около 30 мсек.

Как все таки избавиться от этого эффекта? Или команда Tearing effect OFF - это фишка, свойственная собственно кристаллу контроллера ili9341, реализация которой производителем дисплея не реализована (не выведен сигнал TE) ?

Данный дисплей конечно же, дерьмового качества, но для обкатки тестов вполне годится.

 

Тоже столкнулся с необходимостью синхронизировать вывод кадра и отрисовку, чтоб не резало картинку.

 

Итак, данный дисплей имеет ножку 21 (нумерация со стороны шлейфа дисплея), прийдётся курочить абдурино-шилд чтоб до ней добраться. Эта ножка именуется "TE". Так вот, можно расслабиться! )))

 

Команда 0x35, которая включает эту ножку - НЕ работает! ))) В других дисплеях - эта же команда работает и выдаёт на ножку TE честный VSYNC. Можно опрашивать бит порта или завести на прерывание.

 

Но только не в этом дисплее.

 

Поэтому....  было найдено решение - опрос номера отображаемой линии (команда 0x45).

У меня кадр рисуется с 32 линии и по высоте занимает 256 линий.  Значит, нам надо давать команду на отрисовку, когда луч дошел до 288 линии (256+32):

 

void VBlank(void) //тупо ждёт пока луч не достигнет 288-й строки
{
 u16 v=0;
 while(v!=(32+256))
 {
  LCD_COM8=0x45; //команда Get_Scanline
  v=LCD_RD_DAT8;
  *(u8*)(((u32)&v)+1)=LCD_RD_DAT8&0x03;
  *(u8*)( (u32)&v   )=LCD_RD_DAT8;
 }
 LCD_COM8=0x2C; //команда Write VRAM
}

 

Ещё важно упомянуть, что в данном дисплее луч идет по короткой стороне дисплея - 0...239, а не 0..319, так как дисплей расчитан для портретной ориентации. И независимо от того как настроено отображение видеопамяти (Portrait, landscape) - развертка будет идти в Portrait -стиле!

 

А это значит что во избежание тиринга, нам нужно отрисовывать ЖЕЛАТЕЛЬНО также - слева направо 0...239 (по направлению короткой стороны) и сверху-вниз 0..319 (длинная сторона).

 

Тогда тиринга не будет + изображение будет двигаться плавно и без подёргиваний.

 

Ну и конечно же, важно настроить дирекцию кадра и луча.  Следует избегать случаев когда вертикальное направление луча не совпадает с отрисовкой (бит 4 регистра 0x36).

 

Ориентация задана так:

	//Memory Access Control
	TFT_WriteCommand(0x36); 
	TFT_WriteData(0x48); //orientation: 0x28 0x48 0x88 0xE8   + 0x10 vertical scan direction
 

 

Ну и до кучи - настройка частоты обновления кадров в дисплее:

	//Frame Rate Control (In Normal Mode/Full Colors)
	TFT_WriteCommand(0xB1); 
	TFT_WriteData(0x00);  
	TFT_WriteData(0x1F /*0x1B*/);  //61 Hz 70 Hz

 

 

 

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...