реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не могу победить Tearing effect что я делаю не так.
murmur
сообщение Dec 12 2016, 12:39
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 425
Регистрация: 30-04-11
Пользователь №: 64 708



Коллеги, выполняю заливку разными цветами на SSD1963 c помощью STM32F4Discovery.

Контроллер SSD1963 обновляет дисплей за 12 мсек.
Дискавери заливает картинку за 22 мсек.
То есть вроде бы 22 мсек меньше чем 12мсек*2 и борьба с фликером возможна.

Что я делаю - отлавливаю TE сигнал, после его спада жду 500 мксек и вывожу картинку.
Осциллограмму прилагаю - синий график - это импульсы TE, идущие из SSD1963, красные импульсы - по фронту - начало заливки, по спаду - окончание заливки.


Код вот, если что
Код
while(1)
{    
    

    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0) {}
    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) {}
    delay_us(500);
           GPIO_SetBits(GPIOD, GPIO_Pin_12);
             SSD1963_FillScr(GUI_RED);
         GPIO_ResetBits(GPIOD, GPIO_Pin_12);
    delay_ms(50);

  while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0) {}
    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) {}
    delay_us(500);
        GPIO_SetBits(GPIOD, GPIO_Pin_12);
        SSD1963_FillScr(GUI_GREEN);
       GPIO_ResetBits(GPIOD, GPIO_Pin_12);
    delay_ms(50);
    
    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0) {}
    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) {}
      delay_us(500);
        GPIO_SetBits(GPIOD, GPIO_Pin_12);
        SSD1963_FillScr(GUI_BLUE);
    GPIO_ResetBits(GPIOD, GPIO_Pin_12);
    delay_ms(50);
}



Мерцание есть. Визуально - две косые линии на весь экран.

Что делать и кто виноват?

Сообщение отредактировал murmur - Dec 12 2016, 12:40
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 12 2016, 14:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(murmur @ Dec 12 2016, 15:39) *
Контроллер SSD1963 обновляет дисплей за 12 мсек.
Дискавери заливает картинку за 22 мсек.
То есть вроде бы 22 мсек меньше чем 12мсек*2 и борьба с фликером возможна.
Что я делаю - отлавливаю TE сигнал, после его спада жду 500 мксек и вывожу картинку.
Осциллограмму прилагаю - синий график - это импульсы TE, идущие из SSD1963, красные импульсы - по фронту - начало заливки, по спаду - окончание заливки.

А прерывания на время этого теста у Вас запрещены? И почему кстати 12мсек*2, а не просто 12мсек? У Вас кадровая частота какая? Или у SSD1963 черезстрочная развёртка?
И какое направление сканирования строк дисплея при формировании картинки и при заполнении контроллером? Они совпадают?
Если они идут в разных направлениях, то судя по осциллограмме, как раз и будет происходит два пересечения вывода картинки и процесса заполнения - так что всё так и должно быть.
А ещё можно попробовать изменить частоту кадровой развёртки и посмотреть что получится.
Да и вообще - у Вас полный вывод картинки (всех цветов) как я понимаю длится 6 кадров развёртки? Тут борись - не борись - всё равно мерцать будет.

PS: Вчерась сам ковырялся со своим экранчиком+STM32F429 wink.gif Правда у меня ILI9341. Мне не удалось включить вывод сигнала TE, где-то что-то недоглядел наверное. Ведь судя по схеме - линия TE распаяна.
Go to the top of the page
 
+Quote Post
murmur
сообщение Dec 12 2016, 14:56
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 425
Регистрация: 30-04-11
Пользователь №: 64 708



Хм... наверное все.таки в направлении заполнения проблема. У меня чужой код и как.то сразу насторожило, что заполняется вертикальными линиями справа налево. Вернусь домой проверю.
Не знаю, почему вы решили, что у меня заполнение шесть кадров. По осциллограмме же видно, что два кадра. Частота обновления примернл 80 герц, исходя опять таки из частоты сигнала ТЕ на осциллограмме
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 12 2016, 15:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(murmur @ Dec 12 2016, 17:56) *
Хм... наверное все.таки в направлении заполнения проблема. У меня чужой код и как.то сразу насторожило, что заполняется вертикальными линиями справа налево. Вернусь домой проверю.
Не знаю, почему вы решили, что у меня заполнение шесть кадров. По осциллограмме же видно, что два кадра. Частота обновления примернл 80 герц, исходя опять таки из частоты сигнала ТЕ на осциллограмме

В приведённом Вами коде видно, что Вы 3 раза синхронизируетесь с сигналом TE и каждый раз выводите один из цветов RGB. Как я понял - это и есть вывод всего кадра, видимо каждая цветовая компонента выводится отдельно.
Документации на экран я не смотрел, исходников Ваших не видел, и Вы когда написали про 22 мс и привели этот кусок не указали - откуда и до куда 22 мс (где Вы устаналиваете в 1 красный сигнал, а где - в 0?) и где весь кадр? Гадать на кофейной гуще не умею, сорри.
Go to the top of the page
 
+Quote Post
murmur
сообщение Dec 12 2016, 18:05
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 425
Регистрация: 30-04-11
Пользователь №: 64 708



Цитата
Гадать на кофейной гуще не умею

Вы не гадаете, у вас просто очень странное восприятие действительности.

Цитата
Вы 3 раза синхронизируетесь с сигналом TE и каждый раз выводите один из цветов RGB. Как я понял - это и есть вывод всего кадра,

Ну как 3 данных подряд команды FillScr (заполнение экрана) можно принять за 1 кадр?
В одном цикле while есть 3 кадра, они разные только для того, чтобы глазом можно было видеть смену кадров.

Сейчас буду играться с направлением отрисовки

Действительно - не совпадало направление отрисовки и заполнения буфера.
Теперь все работает.
jcxz, спасибо за толчок в правильном направлении!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th April 2024 - 15:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016