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

Не могу победить Tearing effect что я делаю не так.

Коллеги, выполняю заливку разными цветами на 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);
}

 

 

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

 

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

post-64708-1481546448_thumb.png

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

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


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

Контроллер SSD1963 обновляет дисплей за 12 мсек.

Дискавери заливает картинку за 22 мсек.

То есть вроде бы 22 мсек меньше чем 12мсек*2 и борьба с фликером возможна.

Что я делаю - отлавливаю TE сигнал, после его спада жду 500 мксек и вывожу картинку.

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

А прерывания на время этого теста у Вас запрещены? И почему кстати 12мсек*2, а не просто 12мсек? У Вас кадровая частота какая? Или у SSD1963 черезстрочная развёртка?

И какое направление сканирования строк дисплея при формировании картинки и при заполнении контроллером? Они совпадают?

Если они идут в разных направлениях, то судя по осциллограмме, как раз и будет происходит два пересечения вывода картинки и процесса заполнения - так что всё так и должно быть.

А ещё можно попробовать изменить частоту кадровой развёртки и посмотреть что получится.

Да и вообще - у Вас полный вывод картинки (всех цветов) как я понимаю длится 6 кадров развёртки? Тут борись - не борись - всё равно мерцать будет.

 

PS: Вчерась сам ковырялся со своим экранчиком+STM32F429 ;) Правда у меня ILI9341. Мне не удалось включить вывод сигнала TE, где-то что-то недоглядел наверное. Ведь судя по схеме - линия TE распаяна.

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


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

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

Не знаю, почему вы решили, что у меня заполнение шесть кадров. По осциллограмме же видно, что два кадра. Частота обновления примернл 80 герц, исходя опять таки из частоты сигнала ТЕ на осциллограмме

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


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

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

Не знаю, почему вы решили, что у меня заполнение шесть кадров. По осциллограмме же видно, что два кадра. Частота обновления примернл 80 герц, исходя опять таки из частоты сигнала ТЕ на осциллограмме

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

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

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


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

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

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

 

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

Ну как 3 данных подряд команды FillScr (заполнение экрана) можно принять за 1 кадр?

В одном цикле while есть 3 кадра, они разные только для того, чтобы глазом можно было видеть смену кадров.

 

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

 

Действительно - не совпадало направление отрисовки и заполнения буфера.

Теперь все работает.

jcxz, спасибо за толчок в правильном направлении!

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


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

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

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

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

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

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

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

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

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

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