Муфты электромонтажные от производителя Fucon

Оптимизированный интерфейс и адаптер для подключения к Arduino ЖК дисплея с 16-битной шиной. Часть 3 - Оптимизация алгоритма прорисовки линий и варианты конфигурирования драйвера

Часть 1 - Схемотехническое решение
Часть 2 – Программная реализация

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Изначально в первой версии программного драйвера использовался экстремально быстрый алгоритм прорисовки линий EFLA (Extremely Fast Line Drawing Algorithm). Алгоритм демонстрировал хорошие результаты, и потому не предпринимались какие-либо попытки оптимизации. Однако, как выяснилось позже, алгоритм EFLA оптимален лишь для микроконтроллеров, не поддерживающих инструкцию деления, и было бы лучше, вероятно, применить классический алгоритм Брезенхэма (Bresenham). Автор реализовал алгоритм Брезенхэма с использованием примера кода из англоязычной Википедии (глава Simplification, упрощенный код).

Разработанный демонстрационный код для рисования псевдослучайных линий выполняется в течение фиксированного интервала времени (5 секунд). При использовании дисплея на контроллере ILI9325 в режиме 64 тыс. цветов, портретной ориентации и алгоритма EFLA за 5 секунд прорисовываются 1055 линий. При тех же условиях, но с использованием алгоритма Брезенхэма, количество линий увеличилось до 1110.

Алгоритма Брезенхэма выполняется немного быстрее. Ненамного, но этого достаточно, чтобы задуматься о дополнительной оптимизации кода для библиотеки графических функций. При оптимизации мы должны учитывать несколько основных фактов:

  1. Все пиксели в одной линии имеют одинаковый цвет.
  2. TFT панель предусматривает «оконный» режим работы с автоматическим инкрементом по оси X.
  3. TFT панель допускает независимое изменение позиции по оси X и Y.

Результирующий оптимизированный код с комментариями автора (англ.) представлен в Листинге 2.

Отметим несколько важных моментов. На этапе инициализации мы устанавливаем окно, которое простирается до нижней правой точки TFT панели. Это означает, что в случае, когда необходимо записать одновременно два пикселя по горизонтали, мы можем не использовать операцию перемещения курсора, TFT панель сделает это автоматически. Когда необходимо переместить курсор, мы аккуратно перемещаемся только в требуемом горизонтальном или вертикальном направлении.

Выполнение демонстрационного приложения рисования псевдослучайных линий с такой оптимизацией завершилось результатом в 2060 линий, что говорит о повышении производительности на 85% (Рисунок 11).

Рисунок 11. Сравнение средней скорости рисования псевдослучайных линий с использованием различных алгоритмов.

Теперь, когда мы имеем два режима доступа к контроллеру TFT панели, можно приступить к конфигурированию драйвера.

Дисплеи на контроллере ILI9325

ILI9325 – очень распространенный QVGA контроллер, на нем выполняется большинство TFT панелей, представленных на рынке, включая и те, которые устанавливаются на микроконтроллерные отладочные платы (Рисунок 12).

TFT панель на контроллере ILI9325.
Рисунок 12. TFT панель на контроллере ILI9325.

Наш программный драйвер обеспечивает поддержку портретного и альбомного режима с 16-битной глубиной цвета (64 тыс. цветов). Функция аппаратной прокрутки изображения поддерживается в обеих ориентациях. Для использования драйвера необходимо в своем проекте подключить заголовочный файл:

#include "Generic16BitILI9325.h"

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

typedef ILI9325_Landscape_64K_Gpio16Latch TftPanel; //typedef ILI9325_Portrait_64K_Gpio16Latch TftPanel; //typedef ILI9325_Landscape_64K_Xmem16 TftPanel; //typedef ILI9325_Portrait_64K_Xmem16 TftPanel; //TftPanel *tft=new TftPanel;

Закомментированные строки приведены для справки (первые две строки – определяют GPIO режим работы, вторые две – для режима работы через XMEM интерфейс). Последняя версия библиотеки графических функций (3.0.1) включает в себя набор демонстрационных приложений, которые обязательно пригодятся вам при разработке своих устройств.

Демонстрационное видео работы графической библиотеки и драйвера с дисплеем на контроллере ILI9325 (оптимизированный GPIO интерфейс).

Дисплеи на контроллере ILI9327

Контроллер ILI9327 поддерживает разрешение 432×240 точек, и дисплеи на нем менее распространены (Рисунок 13). Автор использовал панель с разрешением 400×240, 32 пикселя сам драйвер делает невидимыми, другими словами, вы можете их записывать, но на экране ничего не отобразится. Эта особенность обходится в драйвере с помощью класса, выступающего в качестве параметра для драйвера.

TFT панель на контроллере ILI9327.
Рисунок 13. TFT панель с разрешением 400×240 точек на контроллере ILI9327.

Также обеспечивается поддержка двух режимов доступа, двух режимов ориентации с 16-битной глубиной цвета и аппаратная прокрутка. Для использования драйвера необходимо включить заголовочный файл:

#include "Generic16BitILI9327.h"

Аналогично драйверу ILI9325 определены режимы работы:

typedef ILI9327_400x240_Landscape_64K_Gpio16Latch TftPanel; //typedef ILI9327_400x240_Portrait_64K_Gpio16Latch TftPanel;  //typedef ILI9327_400x240_Landscape_64K_Xmem16 TftPanel;  //typedef ILI9327_400x240_Portrait_64K_Xmem16 TftPanel;  //TftPanel *tft=new TftPanel;

Закомментированные строки приведены для справки (первые две строки – определяют GPIO режим работы, вторые две – для режима работы через XMEM интерфейс). В состав библиотеки входит набор демонстрационных приложений, которые обязательно пригодятся вам при разработке своих устройств.

Демонстрационное видео работы графической библиотеки и драйвера с дисплеем на контроллере ILI9325 (оптимизированный GPIO интерфейс).

Дисплеи на контроллере ILI9481

ILI9481 – малораспространенный HVGA контроллер, поддерживающий разрешение 480×320, интересен, прежде всего, с точки зрения работы драйвера с графикой большего разрешения (Рисунок 14).

TFT панель на контроллере ILI9481.
Рисунок 14. TFT панель с разрешением 480×320 точек на контроллере ILI9481.

Для использования драйвера необходимо включить заголовочный файл:

#include "Generic16BitILI9481.h"

Далее выбираем один из доступных режимов работы:

typedef ILI9481_Landscape_64K_Gpio16Latch TftPanel;  //typedef ILI9481_Portrait_64K_Gpio16Latch TftPanel;  //typedef ILI9481_Landscape_64K_Xmem16 TftPanel;  //typedef ILI9481_Portrait_64K_Xmem16 TftPanel;  //TftPanel *tft=new TftPanel;

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

Дисплеи на контроллере HX8347A

HX8347A – QVGA контроллер компании Himax, который довольно часто используется в TFT панелях с разрешением 320×240 (Рисунок 15).

TFT панель на контроллере ILI9481.
Рисунок 15. TFT панель с разрешением 320×240 точек на контроллере HX8347A.

Для использования драйвера необходимо включить заголовочный файл:

#include "Generic16BitHX8347A.h"

Поддерживаемые режимы работы:

typedef HX8347A_Landscape_64K_Gpio16Latch TftPanel;  //typedef HX8347A_Portrait_64K_Gpio16Latch TftPanel;  //typedef HX8347A_Landscape_64K_Xmem16 TftPanel;  //typedef HX8347A_Portrait_64K_Xmem16 TftPanel;  //TftPanel *tft=new TftPanel;

Демонстрационное видео

Загрузки

Библиотека графических функций, драйвер TFT панелей и демонстрационные приложения с исходными кодами – скачать

andybrown.me.uk

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: A Generic Optimized 16-bit LCD Adaptor for the Arduino. Part 3 - Optimization and Driver Configurations

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя