на главную
Карта сайта
English version
Вы читаете:

Ускорение вывода информации на TFT-дисплей у контроллеров ATmega

Документация
3 года назад

Ускорение вывода информации на TFT-дисплей у контроллеров ATmega


Существенным недостатком микроконтроллерных (МК) систем с выводом графической информации на дисплей является большое время прорисовки картинки. Так, микроконтроллер ATmega8515 с тактовой частотой 16 МГц потратит около 0,15 с на простую загрузку экрана с разрешением 320x240 каким-либо цветом. По этой причине делается вывод об отсталости МК серии Atmel и невозможности сделать на них что-либо "быстрое". Считается, что выход из положения - использование более производительных контроллеров серии STM32 с большой тактовой частотой. Но и тут положение не намного лучше, изображение также разворачивается недостаточно быстро.

Быстрый вывод графической информации можно сделать, используя в МК серии STM32 интерфейс FSMC. Но этот интерфейс есть только в тех МК, которые выполнены в корпусах с числом выводов 100 или 144. Эти МК значительно дороже, а их монтаж на плату более сложный, особенно в любительских условиях.

Интерфейс FSMC весьма похож на интерфейс, который существовал в МК фирмы Atmel с самого начала их производства. Это - интерфейс для работы с внешней памятью (EMI - Extended Memory Interface) [1]. Сейчас он потерял своё значение и сохранился лишь у немногих микросхем, например, ATmega8515, ATmega162, ATmega64/128 и ATmega1280/2560. Первые два МК выпускаются также в корпусах DIP40, а МК ATmega2560 используется в платах Arduino.

Схема макета на МК ATmega8515

Рис. Схема макета на МК ATmega8515

 

Для исследования скоростных возможностей интерфейса EMI был собран макет на МК ATmega8515, схема которого показана на рисунке (цепи питания не показаны). Мк тактируется кварцевым резонатором ZQ1. Дисплей подключён к предназначенным для интерфейса EMI выводам МК. Это шина адреса/данных AD0-AD7, шина адресов A8-A15 и выводы WR и RD. Вывод ALE (строб адреса) в макете не используется. Вывод RST дисплея может быть подключён к любому свободному порту МК. Вывод CD (RS) дисплея должен быть подключён к одному из выводов A8-A15. В устройстве используется вывод А11. Поскольку на плате только один дисплей, вход CS дисплея подключён к общему проводу.

Для измерения интервалов времени задействован таймер T1 в режиме счёта. Содержимое таймера перед измерением обнуляется, затем производится какая-либо операция, длительность которой интересует, после чего считывается содержимое таймера и выводится на дисплей. На вход таймера подаётся сигнал с периодом 63 мкс при тактовой частоте 16 МГц. Временной интервал получается после умножения содержимого таймера на 63.

В макете использован дисплей 2.4" TFT LCD Shield с встроенным контроллером ILI9341 и параллельным восьмибитным интерфейсом. Для тестирования были разработаны два варианта программы, различающиеся только способом обращения к дисплею. В обоих вариантах предусмотрены два теста. Первый тест (testl) ежесекундно загружает экран поочерёдно каким-либо цветом из восьми и измеряет время загрузки. Время выводится в нижнюю часть экрана. Второй тест (test2) просто выводит прямоугольники случайного цвета и размеров. Различие в скорости вывода видно глазом. Одинаковые тесты позволяют сравнить время выполнения одинаковых операций.

При разработке программы использована библиотека для работы с дисплеем на контроллере ILI9341 [2], а также была использована информация [3].

Первый вариант программы не использует интерфейс ЕМ!. Для управления дисплеем используются порты PORTA, PORTC, PORTD. Все сигналы управления формируются программно с минимально возможными задержками. Этот вариант находится в папке P1.

Функции вывода команды и данных выглядят так:

voidTFT9341_SendCommand(unsigned char cmd)

{ COMDATA_PORT &= ~(1<<LCD_CD); // вывод CD в состоянии посылки команды

DATA_PORT = cmd;

CTRL1_PORT&= ~(1<<LCD_WR); CTRL1_PORT |=(1<<LCD_WR);

}

void TFT9341_SendData(unsigned char data)

{ COMDATA_PORT |= (1<<LCD_CD); // вывод CD в состоянии посылки данных

DATA_PORT = data;

CTRL1_PORT&= ~(1<<LCD_WR); CTRL1_PORT |=(1<<LCD_WR);

}

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

Включение интерфейса осуществляется установкой бита SRE в регистре MCUCR:

MCUCR |= (1<<SRE).

Применённый дисплей не потребовал введения задержек в сигналы управления, и на макете не требуется использовать выводы порта PC для других целей и разбивать внешнюю память на сектора, поэтому в регистрах MCUCR и EMCUCR соответствующие биты обнулены:

MCUCR &= ~(1<<SRW10);

EMCUCR &= 0b10000001;

В адресном пространстве внешнего ОЗУ выделены два адреса для работы:

#define LCD_C (*(volatile unsigned char*)(0b1000000000000000));

#define LCD_D (*(volatile unsigned char*)(0b1000100000000000)).

По первому адресу будет выводиться команда, по второму - данные.

Адреса расположены в верхней части адресного пространства. Они достаточно далеки от адресов регистров контроллера и от адресов встроенного ОЗУ поэтому мешать работе МК не будут.

Вывод 24 (A11) подключён к входу CD(RS) дисплея. При записи информации по первому адресу на этом входе будет низкий уровень. Дисплей воспримет эту операцию как запись команды. При обращении по второму адресу на этом входе будет высокий уровень и дисплей будет принимать переданные данные.

Сигналы на выходы WR и RD дисплея формируются в МК аппаратно. Вывод команд и данных в дисплей происходит как обращение к ячейке памяти по одному из двух адресов.

Функции вывода команды и данных выглядят так:

void TFT9341_SendCommand(unsigned char cmd)

{

LCD_C = cmd;

}

void TFT9341_SendData(unsigned char data)

{

LCD_D = data;

}

Остальные функции библиотеки были также соответствующим образом изменены.

Выполнение первого теста программы без использования EMI дало такие результаты: время загрузки составило 1634x63 = 102 мс для чёрного или белого цвета, 2335x63 = 147 мс - для других цветов. Это соответствует частоте около семи кадров в секунду. Процесс загрузки виден непосредственно глазом. С использованием же интерфейса EMI МК тратит на загрузку любым цветом 514x63 = 32 мс, т. е. от трёх до пяти раз меньше времени. А сам процесс глазом уже практически не видно.

Проведённое тестирование показало, что мнение об отсталости МК семейства Atmel несколько преувеличено. По крайней мере, по скорости вывода информации на TFT-дисплей они ненамного уступают МК STM32 без интерфейса FSMC. В то же время в большинстве случаев пользоваться МК серии ATmega значительно проще и дешевле.

Литература

1. Евстифеев А. В. Микроконтроллеры AVR семейства Mega. Руководство пользователя. - М.: Издательский дом Додэка-XXI, 2007 (с. 143).

2. Урок 34. Часть 1. Дисплей TFT 240x320 8bit. - URL: http://narodstream. ru/avr-urok-34-displej-tft-240x320-8bit-chast-1/ (19.05.21).

3. Использование External Memory Interface для работы с экранчиком. - URL:http://we.easyelectronics.ru/ blog/AVR/660.html (19.05.21).

Автор: C. Свечихин, г. Красноярск