Главная arrow Программирование arrow ARM arrow Эффективная работа с графическим индикатором Friday, March 24 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

Эффективная работа с графическим индикатором Версия для печати
Написал microsin   
01.03.2009

Графические индикаторы (обычно LCD черно-белый или цветной) имеют последовательный или последовательно/параллельный интерфейс, через который на индикатор передается графическая информация, команды по управлению индикатором, а также считывается статус индикатора (готов ли он к приему информации и т. д.).

Наличие шины обмена с индикатором замедляет работу с ним и требует непроизводительных затрат от процессора - вставка циклов ожидания, пока индикатор не будет готов к приему информации, формирование требуемых временнЫх диаграмм на интерфейсе индикатора (согласно протоколу обмена, описаному в даташите на индикатор). Прямая работа с индикатором (вывод на шину информации, когда нужно что-то нарисовать на экране) неэффективна по нескольким причинам: 
- как я говорил, она загружает процессор и затрудняет быструю обработку остальных задач в программе.
- по медленному протоколу шины в индикатор пишутся данные, которые иногда не нужны. Например, в закрашенные области повторно рисуются закрашенные области.
- для того, чтобы индикатор работал с точки зрения пользователя "быстро", вовсе не нужно быстро обновлять содержимое видеопамяти индикатора. Это просто нужно делать строго периодично и с такой чатотой, чтобы глаз не успевал отслеживать изменения. Тогда будет использоваться как инерционность человеческого глаза, так и инерционность жидкокристаллических ячек экрана.

Для перечисленых условий наиболее оптимален (с точки зрения загрузки процессора и визуальной скорости работы для пользователя) следующий принцип работы с индикатором:
1. Программа, которая должна рисовать на экране, рисует то же самое в буфере памяти, который доступен для процессора. Для этого выделяется специальный буфер в сверхбыстром RAM, с которым процессор может работать очень эффективно.
2. По медленной шине на индикатор выводятся только изменения, которые произошли в буфере. Таким образом, объем данных, передаваемых в индикатор, уменьшается, что ускоряет обмен с ним (чем меньше изменяется картинка, тем меньше данных).
3. Данные передаются на индикатор строго периодично с частотой, близкой к пределу инерционности системы (например, для LCD достаточно частоты обновления индикатора в 20 Гц - человек все равно не заметит, если обновлять индикатор чаще).

Теперь немного комментариев. Вывод индикатор разбивается на 2 раздельных по времени и независимых друг от друга процесса. Первый процесс просто пишет в сверхбыстрый буфер данные, когда надо что-то нарисовать - это делает обычная программа в фоновом режиме (основное тело main), и делает это очень быстро, без задержек, в любое удобное для программы время. Второй процесс - вызываемая по таймеру с частотой 20 Гц подпрограмма, которая смотрит, какие изменения произошли в буфере, и эти изменения уже передает на LCD-индикатор по его медленной шине.

По поводу выделения буфера вроде все понятно - нужен блок памяти, равный размеру видеопамяти индикатора. Сложнее сделать отслеживание изменения буфера, чтобы оно работало эффективно. Это можно сделать по-разному - например, выделить для каждой строки индикатора флаг, который должна устанавливать программа, записывающая информацию в буфер (первый процесс). Подпрограмма, которая анализирует изменения в буфере (второй процесс) будет эти флаги считывать и сбрасывать по мере передачи информации в индикатор. Наверное, самый простой по реализации и самый быстрый вариант - выделить 2 одинаковых буфера. В первый буфер пишет данные первый процесс, а второй процесс сравнивает эти 2 буфера - там, где данные отличаются, там и произошли изменения. Эти изменения передаются на индикатор, и второй буфер обновляется (приводится в соответствие с первым буфером).

[Ссылки]

1http://www.winstar.com.tw/products_detail_ov.php?lang=ru&ProID=72
   Описание на монохромный графический индикатор WinStar WG240128B.
2. http://www.microchip.com.ru/Support/GUI.html
   Графический интерфейс пользователя с применением микроконтроллеров Microchip (бесплатная библиотека с исходниками)
3. http://www.easygui.com/
   Платная библиотека, которая поддерживает почти все микроконтроллеры и множество графических индикаторов и контроллеров.
4. IAR EW ARM: как перенаправить вывод printf и putchar (в статье описан пример подключения индикатора ЖКИ Winstar WG240128B со схемой и исходниками).

Последнее обновление ( 04.01.2010 )
 

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

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017