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

STM32F205 (FSMC) + ili9486(16bit parallel) + 111fps = мерцание

Доброго времени суток!

Вывожу на дисплей квадрат через функцию FillRect(...) сначало черный, затем синий. В дебаге через breakpoint вижу их поочередно. Затем запускаю в обыном режиме, отключив breakpoint. Считаю количество обновлений экрана и вывожу раз в секунду на экран число (111fps получается). При этом рассчитываю, раз частота обновления значительно больше 25 Гц, увидеть что-то среднее между синим и черным, а вижу полосатый квадрат.

Идея в том, что хочу сделать анимацию, имитирующую стрелочный прибор, а стрелка при обновлении постоянно мерцает (так же как и квадрат).

Вопрос, как избавиться от мерцания, если увеличение частоты не помогает?

 

2.png

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


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

46 minutes ago, sergey_k said:

При этом рассчитываю, раз частота обновления значительно больше 25 Гц, увидеть что-то среднее между синим и черным, а вижу полосатый квадрат.

Проблема в том, что частота обновления экрана никак не привязана к частоте заливки вашего прямоугольника, и определяется настройками ILI9486.

Так что это вам нужно синхронизировать свою прорисовку с контроллером экрана (см "Tearing Effect Information" в описании контролера).

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


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

8 часов назад, sergey_k сказал:

При этом рассчитываю, раз частота обновления значительно больше 25 Гц, увидеть что-то среднее между синим и черным, а вижу полосатый квадрат.

Наверное каждый видел, как в кино у телеги колеса крутятся в обратную сторону. Здесь работает тот же эффект.

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


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

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

Да, это затратно по ресурсам, да это медленно, да требует память под буфер, но зато будет отображаться на всех дисплеях одинаково.

 

Так же можете попробовать повысить частоту отрисовки самого дисплея (Ссылка на обсуждение). Разве что в сообщении указано странное число. Для ILI9486L 100Гц достигается (96 или 117 на самом деле) при значениях 0xB1 = 0xD110 / 0xE110 / 0xF110 (Параграф 8.2.51 даташита). Нужно смотреть уже на месте.

Но проблему мерцания это скорее всего не устранит. И я бы всё равно рекомендовал использовать отрисовку на стороне контроллера.

Изменено пользователем AlanDrakes
Дополнил мысль

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


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

21 hours ago, aaarrr said:

Проблема в том, что частота обновления экрана никак не привязана к частоте заливки вашего прямоугольника, и определяется настройками ILI9486.

Так что это вам нужно синхронизировать свою прорисовку с контроллером экрана (см "Tearing Effect Information" в описании контролера).

Спасибо за наводку! Я лучше понял прицип работы дисплея. Думаю в будущем это пригодится. Но на данном дисплее не выведен пин TE, поэтому не вижу возможности применить это в данном случае.

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


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

14 hours ago, Сергей Борщ said:

Наверное каждый видел, как в кино у телеги колеса крутятся в обратную сторону. Здесь работает тот же эффект.

В случае с автомобилем, как я понял, эффект достигается за счет дискретности восприяния мозгом колеса. Тот же эффект можно получить, если подсвечивать вращающийся объект в нужный момент (наверное так работают вентиляторы с бегущими надписями). =) В результате эксперимента я добился что полосы бегут в разные стороны, и даже получил почти стояние на месте. Избавиться от полос меняя частоту заливки информации в дисплей не получается. Пока я склоняюсь, что проблема связана с Tearing Effect, о котором писал aaarrr.

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


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

Повышение частоты отрисовки до 117 Гц действительно не помогло. При этом картинка несколько изменилась (стала контрастнее).

Формирование изображения на стороне контроллера я частично сделаю. Сейчас столкнулся с проблемой, что заливка прямоугольника одним цветом даёт эффект полос.

Вероятно получается так: заливка идёт с частотой f1, а отрисовка с частотой f2. И эти два процесса никак не синхронизированны (к сожалению вывод TE на плате отсутствует). Получается, что при каждой отрисовки я вижу какой-то процент заливки. Получается эффект как с вращающимся колесом, который описан выше.

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


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

Вам не нужно гнаться за частотой кадров.

Рекомендую наоборот - использовать аппаратный таймер, который будет запускать процесс копирования данных из буфера экрана в буфер дисплея. И лучше использовать частоту не очень близкую к частоте обновления дисплея. В прошлой ссылке есть на эту тему информация. Так же рекомендую пролистать даташит на сам контроллер ЖК панели, применённый в дисплее. Как увеличить его частоту обновления я писал.

У себя не стал заморачиваться с эффектами из-за ограниченной памяти (кроме экрана требуется ещё много чего), потому отрисовка идёт через Chrome-ART ускоритель с преобразованием из "сжатых" пикселей (indx-16) в RGB-16. Картинка имеет максимум 16 цветов, зато скорость отрисовки радует. А эффекты... ну лично мне они не особо нужны в проекте.

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


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

On 7/16/2020 at 8:47 AM, sergey_k said:

И эти два процесса никак не синхронизированны (к сожалению вывод TE на плате отсутствует).

 

Это не беда.  TE можно считать через регистр (или номер рисуемой линии). У меня LCD с ILI9341 работал  "на ура" и без кривляний картинки. И заливка двумя цветами блынькала без диагональных линий

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

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


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

On 7/16/2020 at 12:13 AM, sergey_k said:

В случае с автомобилем, как я понял, эффект достигается за счет дискретности восприяния мозгом колеса. 

Нет. Вам привели пример с кинофильмом. В этом случае эффект из-за разности частот камеры и вращения колеса.

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


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

16 minutes ago, __inline__ said:

У меня LCD с ILI9341 работал  "на ура" и без кривляний картинки

 

Нашёл свой пост, год назад писал об этом очень подробно с примерами как сделать:

 

 

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


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

16.07.2020 в 00:13, sergey_k сказал:

В случае с автомобилем, как я понял, эффект достигается за счет дискретности восприяния мозгом колеса.

"В случае с автомобилем" эффект не из-за мифической "дискретности мозга" (мозг - не дискретный, это не процессор). А из-за дискретности кадров снимающей камеры.

Представьте что у вас есть счётчик считающий от 0 до 9 (и далее по кругу). Вы снимаете его камерой (для упрощения примем, что каждый кадр снимается мгновенно). Снимать начали в момент показа цифры '5'. И период кадров камеры == периоду прохода счётчиком всего диапазона 0...9 (==частоте появления цифры '0').

Что увидите на каждом кадре? Правильно - всегда будет цифра '5', как будто счётчик стоит.

Теперь чуть уменьшим частоту кадров камеры, на 10%. Увидим как в каждом кадре счётчик стал инкрементироваться.

А если наоборот - увеличим частоту кадров камеры на 10%, то увидим как счётчик стал декрементироваться.

Хотя реальная частота счёта счётчика никак не менялась. Менялась только частота кадров.

Так и с колёсами: если частота кадров равна частоте вращения колёс - на экране будет казаться, что они не крутятся, если частота кадров чуть выше частоты вращения колёс - будет казаться что колёса крутятся в обратную сторону. Никакой "дискретности мозга" нет.

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


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

И куда подевался топик-стартер?  Очень интересно, решил ли он задачу с синхронизацией вывода картинки и отображением на своём дисплее, или нет?:mail1:

 

On 7/22/2020 at 10:50 PM, jcxz said:

Так и с колёсами: если частота кадров равна частоте вращения колёс - на экране будет казаться, что они не крутятся, если частота кадров чуть выше частоты вращения колёс - будет казаться что колёса крутятся в обратную сторону. Никакой "дискретности мозга" нет.

 

Эти ощущения очень индивидуальны. У меня к примеру глаз очень придирчив, и я вижу артефакты, когда ристуют не по VSync'у.  Другие не замечают или это явление им не мешает.

Кроме тиринга (разрезания), есть ещё эффект подёргивания, который особо видно, если картинку смещать по горизонтали.  Так что тут только вертикальная синхронизация.

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

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


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

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

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

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

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

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

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

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

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

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