TFT uDisp320240. Часть 2.

Продолжаю возиться с данным дисплеем.  То, с чем я пока не разобрался, постараюсь не затрагивать. В этой статье пойдёт речь о простейшей графике: точке, линии, круге. Источником информации для меня явился даташит на управляющий дисплеем контроллер — SSD2119, т.к. другой информации в сети я не нашёл.
Характеристики контроллера дисплея:
— поддерживает до 262k цветов TFT панели с разрешением 320 х 240 точек;
— графическое ОЗУ (CDDRAM)  172 800 байт (320 х 240 х 18 / 8);
— поддерживаются  8/9/16/18-bits 6800 -серия / 8080-серии совместимы параллельный интерфейс или последовательный SPI интерфейс;
— имеется вспомогательные 18-/6- видео интерфейс (VSYNC, HSYNC, DOTCLK, DEN) для отображение анимационного изображения.
— содержит DC-DC преобразователь напряжения обеспечивающий светодиодную подсветку TFT панели;
— содержит  схема управления палитрой , с помощью которой возможно программно корректировать оптимальное качество изображения;
— обеспечиваются различные режимы энергосбережения.

Как и в прошлых своих экспериментах я использую 4-х проводный интерфейс SPI, но управляющий контроллер ATtiny2313. Реализацию SPI для него я уже рассматривал — пришла пора оценить скорость вывода картинки через SPI с частотой SCK равной 10 МГц.
Управление дисплеем осуществляется через набор управляющих регистров. Их довольно много — 44. Однако для начальной работы не обязательно досконально разбираться в них всех. Достаточно рассмотреть регистры , задействованные в последовательности для включения, а также регистры устанавливающие границы видео ОЗУ (т.е. рисования) по координатам.

В двух словах задача стоит следующая: инициализировать дисплей и выводить на него точки заданных размеров и цвета по установленному адресу. А выводя точки по заданному адресу можно реализовать вывод линий и окружностей.
В предыдущей статье я брал исходник, скачанный с evobdg, и особо его не переделывал, т.е. задавался целью просто увидеть картинку. После изучения даташита я переделал инициализационную последовательность команд строго согласно указанной, в результате чего она «похудела» довольно значительно. Функции обмена по SPI остались те же, только я их привёл к более привычному для меня виду.
Итак простая графика — т.е. процесс рисования точек, линий, окружностей. Ключевая задача — вывод точки реализуется довольно просто. Смотрим вкладку.

В функции рисования точки задаётся её размер — size, координаты x y, цвет — color. Локальные переменные счётчиков по x — i и по y — j необходимы для рисования точек размерами больше одного пикселя. Обращаемся к регистру 0х4Е ( установка адреса видео ОЗУ по х) и записываем соответствующую координату. Соответственно для регистра 0х4F (установка адреса видео ОЗУ по у) также записываем значение у. Затем следует обращение к регистру 0х22 (запись в видео ОЗУ) и прописываем туда соответсвующее размеру точки количество пикселей заданного цвета по х. После записи каждого пикселя происходит инкремент адреса по х (по умолчанию стоит именно такая настройка, хотя можно устанавливать различные варианты изменения адреса). После вывода пикселей точки по х (для текущего у), цикл инкрементирует значение по у и процесс повторяется, пока точка не прорисуется полностью. Как видите -ничего сложного.

Далее выводим линии и окружности. В своё время, когда я осваивал  LCD WG12864, мне пришлось реализовывать подобное. После перебора различных вариантов, функции рисования линий и окружностей я реализовал  по алгоритму Брезенхема, т.к. он является самым оптимальным в плане ресурсы контроллера/качество. Чтобы не изобретать велосипед, можно просто скопировать их реализацию на Си из соответствующей статьи в Википедии и вставить в свой код СОВЕРШЕННО ничего не изменяя — что я и сделал. На фото ниже я для наглядности запечатлел результаты вывода некоторой информации на дисплей.

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

Ну, и как я указывал в начале статьи, предлагаю Вам оценить скорость вывода картинки с максимальной частотой SPI. Для этого в исходнике в главной функции раскомментируйте строку  LCD_test (); , а остальные согласно вкладке

 закомментируйте. Откомпилируйте, залейте прошивку в контроллер и наблюдайте такую картинку :
Забегая вперёд скажу, что смотреть анимацию при такой скорости не выйдет — необходимо осваивать другие типы интерфейсов, но об этом разговор впереди. Однако для просмотра фото — вполне себе сойдёт.
Теперь отвечу на вопросы, которые чаще всего задают. Схему смотрим в разделе define исходника. Не забывайте, что питание дисплея 3,3 В, но к 5-ти вольтам его логика толерантна.  На ногу, разрешающую включение преобразователя подсветки также можно подавать 5 В. Фьюзы оставляем дефолтные, только рабочую частоту меняем — этот параметр смотрим в makefile.
В заключение хочу сказать — глаза бояться, руки делают, главное ВДУМЧИВО читать даташит. Успехов друзья.

Запись опубликована в рубрике Микроконтроллерный конструктор с метками , . Добавьте в закладки постоянную ссылку.

3 комментария: TFT uDisp320240. Часть 2.

  1. oleg говорит:

    Не нашел раздела define в Вашем архиве. Если можно схему подключения в почту.

  2. s_black говорит:

    А это что?

    #define	BLACK	  0x0000
    #define	BLUE	  0x001F
    #define	RED 	  0xF800
    #define	GREEN     0x07E0
    #define CYAN	  0x07FF
    #define MAGENTA   0xF81F
    #define YELLOW    0xFFE0
    #define WHITE	  0xFFFF
    #define PORT_SPI PORTB
    #define DDR_SPI  DDRB
    #define UCSK     PB7
    #define DO       PB6
    #define DI       PB5
    #define CS       PB4
    #define DC       PB3
    #define RES      PB2
  3. Дмитрий говорит:

    Жив?
    Подскажи, не понимаю, как включить подсветку. Или она автоматически при инициализации будет? У меня еще толком не получилось его активировать

Добавить комментарий

Ваш e-mail не будет опубликован.