murmur 0 31 октября, 2016 Опубликовано 31 октября, 2016 · Жалоба Коллеги, я примерно представляю себе что это такое и как с этим бороться. Общий смысл борьбы в том, чтобы начать писать в память сразу же после старта вывода кадра из памяти и при этом не обгонять собственно вывод. Насколько я понимаю, для синхронизации нужен контроль сигнала вертикальной синхронизации. У меня есть дисплей китайский на ili9341. Понимает команды Tearing effect ON|OFF. Однако включение и выключение никоим образом не влияет на мерцание экрана при его заливке. А заливка происходит быстро - около 30 мсек. Как все таки избавиться от этого эффекта? Или команда Tearing effect OFF - это фишка, свойственная собственно кристаллу контроллера ili9341, реализация которой производителем дисплея не реализована (не выведен сигнал TE) ? ILI9341.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба Как вариант вы можете подключить дисплей по RGB интерфейсу и тогда вы сами будете генерировать для дисплея VSYNC и HSYNC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба Как вариант вы можете подключить дисплей по RGB интерфейсу Как вы себе это представляете для дисплея, у которого на шлейфе разведен только SPI ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба Ну вы дали даташит на контроллер, у которого RGB есть)) Что там на дисплее я не знал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 3 ноября, 2016 Опубликовано 3 ноября, 2016 · Жалоба Как вы себе это представляете для дисплея, у которого на шлейфе разведен только SPI ? Очевидно отвечающие Вам должны обладать телепатическими способностями. Тогда так и указывайте в заголовке темы. По SPI вряд-ли Вам удастся это как-то побороть. Посмотрите в мануале какая макс. скорость по SPI и посчитайте общее время обновления экрана. Или Вы не весь экран обновляете (извините - не обладаю телепатическими способностями)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 июля, 2019 Опубликовано 23 июля, 2019 (изменено) · Жалоба 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 Изменено 23 июля, 2019 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться