Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу победить Tearing effect что я делаю не так.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
murmur
Коллеги, выполняю заливку разными цветами на 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);
}



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

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

В приведённом Вами коде видно, что Вы 3 раза синхронизируетесь с сигналом TE и каждый раз выводите один из цветов RGB. Как я понял - это и есть вывод всего кадра, видимо каждая цветовая компонента выводится отдельно.
Документации на экран я не смотрел, исходников Ваших не видел, и Вы когда написали про 22 мс и привели этот кусок не указали - откуда и до куда 22 мс (где Вы устаналиваете в 1 красный сигнал, а где - в 0?) и где весь кадр? Гадать на кофейной гуще не умею, сорри.
murmur
Цитата
Гадать на кофейной гуще не умею

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

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

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

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

Действительно - не совпадало направление отрисовки и заполнения буфера.
Теперь все работает.
jcxz, спасибо за толчок в правильном направлении!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.