Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[9]

по всем 11 соединительным линиям шины данных и управления. Во-вторых, экран ЖКИ считается жестко привязанным к начальной позиции с фиксированными адресами знакомест. В-третьих, при программировании будет использоваться ограниченный набор команд (желающие смогут в последствие расширить свои познания, изучив DATASHEET на HD44780 http: www.gaw.ru/pdf/lcd/Chips/Hitachi/hd44780u.pdf, 316 Кб). Программное управление ЖКИ

Поскольку внутри ЖКИ находится свой собственный контроллер со своей разветвленной системой команд, то задача упрощается. Две такие мощные и интеллектуальные микросхемы, как HD44780 и ATmega8, смогут быстро между собой "договориться" на машинном языке. Труд программиста заключается в том, чтобы "объяснить" контроллерам правила общения и установить протокол соединения.

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

Различают команды прямого и косвенного действия. Первые из них занимают адреса 0x013F и не требуют передачи данных. За вторыми (диапазон выше 0x3F) обязательно следует передача одного или нескольких байтов информации. Для примера на рис.5 показаны временные диаграммы выполнения команды 0x80 "Установка курсора в первое знакоместо верхней строки экрана" и индикация в нем цифры "4" пересылкой кода данных 0x34.

Формировать диаграммы, показанные на рис.5, должен МК с учетом задержек из табл.3, необходимых контроллеру ЖКИ на выполнение команд. Для повышения устойчивости работы экономить на задержках не надо. По крайней мере, при отладке программы они должны быть достаточно большими.

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

В листинге 1 показана Си-программа для тестовой проверки ЖКИ по схеме, собранной на рис.3.

Пояснения к листингу 1

Строки 5, 6 назначают условные имена для сигналов шины управления RS и E. Это стандартный прием на случай быстрого внесения изменений. Например, если вышел из строя вывод 25 микросхемы DD1, к которому был подключен сигнал RS, то можно перейти на другой исправный вывод (28) и в строке 5 указать "#define RS PC5". Все остальные замены по тексту листинга компилятор сделает автоматически.

Строка 7. Константа TIME определяет длительность положительного импульса сигнала Е на диаграмме рис.5. Формирование других задержек организуется умножением TIME на определенные коэффициенты. Получается своеобразный регулятор быстродействия. Он понадобится, в частности, для нестандартного ЖКИ, при этом константу TIME можно увеличить в несколько раз.

Строки 9-12. Функция задержки времени сделана универсальной. При малых значениях входной переменной "а" - микросекун-

Листинг

Проверка ЖКИ, =AVR. Ступень 6= Журнал РА, №б, 2005 Make: Name=avr61, MCU=atmega8, Level=2, Debug=VMLab ФыоЗы: 8ит0=СК8ЕЬЗ=СК5ЕЬ2=СК8ЕЫ="галочки" (1 МГц) #include <avr/io.h> Библиотека ввода-вывода #define RS PC0 Условное имя для сигнала RS (ЖКИ) #define EN РС2 Условное имя для сигнала Е (ЖКИ) #define TIME 2 Базовая задержка при частоте 1 МГц -------------Функция задержки времени--------------void pause(unsigned int a) "a" - длительность паузы { unsigned int cn; "cn" - счетчик времени = for (cn=a; cn > 0; cn-); Цикл задержки времени = } Окончание функции "pause" =

If---------Функция Записи команды в ЖКИ-------------:

void lcd com(unsigned char p) "p" - байт команды : { PORTC &= BV(RS); Сигнал RS=0 =

PORTC = BV(EN); Сигнал EN=1 =

PORTD = p; Вывод на шину DB0-DB7 ЖКИ команды = pause(TIME); Длительность сигнала EN =

PORTC &= BV(EN); Фронт записи команды в ЖКИ = pause(5 * TIME); Пауза для выполнения команды = } Окончание функции "lcd com" :

---------Функция записи данных в ЖКИ--------------=

void lcd dat(unsigned char p) "p" - байт данных = { PORTC = BV(RS) I BV(EN); Сигналы RS=1, EN=1 = PORTD = p; Вывод на шину DB0-7 ЖКИ байта данных = pause(TIME); Длительность сигнала EN = PORTC 6= -x BV(EN) ; Фронт записи данных в ЖКИ = pause(5 * TIME); Пауза для выполнения команды : } Окончание функции "lcd dat" : II---------Функция инициализации ЖКИ----------------=

void lcd init(void) { lcd com(0x08); lcd com(0x38) lcd com(0x38) lcd com(0x38) lcd com(0x01) lcd com(0x06) led com(OxOD)

Режим 8 бит, мигающий курсор : Полное выключение дисплея = pause(1000*Т1МЕ); 8 бит, 2 строки = pause(20*Т1МЕ); 8 бит, 2 строки = lcd com(0x38); 8 бит, 2 строки = pause(1000+TIME); Очистка дисплея = Сдвиг курсора вправо = Включение дисплея, мигающий курсор: Окончание функции "lcd init" = ОСНОВНАЯ ПРОГРАММА========= =

int main(void) Начало основной программы

{ PORTB = DDRD = OxFF; В=входы с резист., О=выходы PORTC = 0xF8; DDRC = 0x07; РС0..3 выходы с лог.О lcd init(); Инициализация ЖКИ (8 бит, 16x2)

lcd dat(Н1); lcd dat(е); lcd dat(Ч); Текст lcd dat(11); lcd dat(о); lcd dat(,); Текст lcd dat( ); lcd dat(1w1); lcd dat(о); Текст lcd dat(1 г1); lcd dat(111); lcd dat(1d1); Текст lcd dat( 1); lcd dat(1!1); Окончание текста return (0); Успешное завершение программы "main" ) WinAVR-20050214, длина BIN-кода 292 байтов

=1 =2 =3 =4 =5 =6 =7 =8 =9 =10 =11 =12 =13 =14 =15 =16 =17 =18 =19 =20 =21 =22 =23 =24 =25 =26 =27 =28 =29 =30 =31 =32 =33 =34 =35 =36 =37 =38 =39 =40 =41 =42 =43 =44 =45 =46 =47 =48 =49 =50 =51

ды, при больших (до 65535) - миллисекунды.

Строки 14-21,23-29формируют соответственно левую и правую половину временных диаграмм, показанных на рис.5.

Строки 31-39. Без процедуры инициализации ни один ЖКИ работать не будет. Это самая важная часть листинга. Именно на процессе инициализации часто "спотыкаются" начинающие программисты. Дело в том, что в разных источниках приводятся разные варианты последовательностей команд инициализации и не все из них гарантированно будут работать с конкретным ЖКИ.

Наиболее общая процедура инициализации приведена в DATASHEET на HD44780. Функция "lcd init" в целом повторяет ее с тем отличием, что команда полного выключения дисплея 0х08 поставлена первой, чтобы при включении питания на экране не появлялся "мусор". Здесь нет ограничений против экспериментов, главный критерий - практика.

Строки44-49. После выполнения инициализации курсор устанавливается в крайнее слева положение в верхней строчке экрана. Следовательно, первая буква "H" будет выведена именно в это знакоместо. Далее курсор автоматически переходит на одну позицию вправо (см. строку 37) и следующая команда выведет сюда букву "e" и т.д.


Симв. Стр. F RS R/W

Листинг 2

8-битовый интерфейс жки-мк

XI LCD(16 2 250К) РСО PCI РС2 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 .PLOT v(PCO) v(PC2)

Строка 50. Редкий случай, когда основная программа не содержит бесконечно повторяющегося цикла. Число "0" в функции "return" по традиции означает успешное завершение основной программы. Если бы потребовался аварийный выход из программы, то запись выглядела бы "return(-1)". Из-за гипотетического числа (-1) функция "main" в строке 41 имеет тип "int", а не "void".

Моделирование процессов в симуляторе VMLab

Тем, кто еще не успел приобрести ЖКИ, отчаиваться не надо. Увидеть надпись "Hello, world!", формируемую в листинге 1, можно через симулятор VMLab.

Порядок действий. Запустить на выполнение программу VMLab. Создать новый проект под названием "avr61.prj" и сохранить его в той папке, где находится программа "avr61.c" (методика описана в "Ступени 4").

Листинг 3

11==============ОСНОВНАЯ ПРОГРАММА==================

int main(void) Проверка знакогенератора 0-255

{ unsigned char cifra=0, Ь; Счетчикм

PORTB = DDRD = OxFF; В=входы с реэист., Б=выходы PORTC = 0xF8; DDRC = 0x07; РСО-3 выходы с лог.О lcd init(); Инициализация ЖКИ (8 бит, 16x2)

while (1) Бесконечный цикл

( lcd com(0x0C); Удаление видимости курсора

lcd com(0x86); Курсор на шестое слева место lcd dat(cifra/100 + 0x30); Сотни

lcd dat((cifra/10)%10 + 0x30); Десятки

lcd dat(cifra%10 +0x30); Единицы

lcd dat(=); Знак равенста

lcd dat(cifra); Содержимое знакогенератора

for (b=0; b < 10; b++) pause(25000); Пауза 1 с lcd com(0x86); Курсор на шестое слева место for (b=0; b < 5; b++) lcd dat( ); Очистка cifra++; Следующий символ знакогенератора

( Окончание функции "while"

) WinAVR-20050214, длина BIH-кода 340 байтов

=40 =41 =42 =42 =43 =44 =45 =46 =47 =48 =49 =50 =51 =52 =53 =54 =55 =56 =57 =58

Дописать в конце проекта текст согласно листингу 2. Первые две строки относятся к комментариям, объясняющим формат модели ЖКИ с позиционным обозначение Х1. Сокращение "LCD" -это англоязычный аналог аббревиатуры "ЖКИ". Число символов (16), число строк (2) и частота F внутреннего генератора (250 кГц) относятся к характеристикам индикатора. Далее следует перечисление линий портов МК, к которым подключаются соответственно сигналы RS, R/W, E, DB7-DB0. Замыкает проект строка виртуального осциллографа, согласно которой будут рисоваться (PLOT) графики сигналов RS и E.

Запустить симуляцию проекта. Открыть окно виртуального осциллографа "View - Scope" и панель управления "View - Control Panel". Через несколько секунд на экране осциллографа появятся изображения импульсов RS, E, а в окошке "LCD (HD44780 type)" - искомая надпись (рис.6).

Важная деталь. Модель ЖКИ, имеющаяся в VMLab, несколько отличается от свойств реальных изделий (или наоборот?), причем в сторону увеличения технологического запаса. Например, если повысить быстродействие ЖКИ уменьшением в 2 раза чисел "1000" в строках 33, 36 листинга 1, то экран в VMLab будет пустой, хотя реальный индикатор MTC-16204X фирмы Microtips устойчиво отображает текст.

Русификация ЖКИ

Научившись выводить на экран ЖКИ англоязычные сообщения, пора заняться переводом их на русский язык. Как известно, каждый ЖКИ имеет встроенный знакогенератор, представляющий собой область ПЗУ объемом более 8 Кб, которая прошивается на заводе-изготовителе.

Традиционно первая половина ПЗУ с адресами 00-7Fh содержит начертания цифр, знаков препинания, а также заглавных и строчных букв латинского алфавита. Все как в IBM PC. Вторая половина "отдана на откуп" национальным алфавитам. В связи с этим HD44780 имеет модификации исполнения с тремя основными вариантами зашивки знакогенератора:

латиница и европейские языки (European standard font или Euro);

латиница и японские иероглифы (Japanese standard font или Japan;)

латиница и кириллица (Custom font или Russian, рис.7).

Не все из ячеек знакогенератора заполнены. При обращении к "пустым" ячейкам на экране будет выведена произвольная информация, чаще всего состоящая из засвеченных точек. Первые 16 символов с адресами 0х00-0х0F отмечены "звездочкой". При желании они могут быть самостоятельно запрограммированы пользователем.

Какой знакогенератор имеется в конкретном ЖКИ, должно быть указано в его условном обозначении или в технических параметрах, хотя на практике приходится верить честному слову


продавца. Другой подход - вспомнить про отечественный менталитет и самому воочию увидеть на экране ЖКИ все возможные начертания символов. Для этого надо заменить строки 40-51 листинга 1 строками 40-58 листинга 3. Далее провести компиляцию и зашивку МК, после чего в верхней строке экрана ЖКИ будут с секундными паузами выводиться цифры десятичного адреса знакоместа 0-255 и графические образы содержащихся в них символов. Если графика и очередность появления символов соответствует рис.7, значит, ЖКИ в порядке.

Внимательный читатель, наверное, уже догадался сравнить коды знакогенератора из рис.7 со стандартными таблицами КОИ8, а также с основной и альтернативной кодировками ГОСТа. Увы, ни одна из них не подходит под ЖКИ-кириллицу, видно про успехи нашей стандартизации в Японии и Тайване знают не очень много. В связи с этим текст, написанный в Си-программах по-русски, выглядит на русифицированном ЖКИ "по-китайски". Необходима программная перекодировка шрифта.

Если решать задачу ручным переводом, то порой возникают такие сложности, что даже опытные разработчики стараются все фразы составлять только по-английски или по-русски, но английскими буквами. К счастью, проблема довольно легко решается применением специальных утилит-перекодировщиков.

Теоретическую подкованность пора закрепить практическими действиями.

"Кибер-отгадчик"

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

Особое место отводится головоломкам с абстрактными числами. Среди них, предсказание результатов математических действий, угадывание чисел, техника быстрого счета. В последнем случае, например, оказывается, что для моментального извлечения кубического корня или корня в пятой степени из 6-значных чисел вовсе не надо быть экстрасенсом или обладать феноменальной памятью [1]. Все дело в точном расчете и знании особенностей теории чисел.

Один из самых старинных фокусов с предсказанием результата заключается в том, что кого-нибудь просят задумать число, проделать над ним ряд операций и затем объявляют ответ. Если он совпадает - все выглядит как маленькое чудо или чтение мыслей на расстоянии.

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

Исходные данные для разработки. Воспроизвести через ЖКИ диалог фокусника со зрителем по угадыванию чисел. Обеспечить кнопочное подтверждение ответа. Ширина шины данных интерфейса связи с ЖКИ - 4 бита.

Ключевым требованием при составлении электрической схемы устройства является ширина шины данных. В схеме, показанной на рис.3, она была равна 8 битам, поскольку МК и ЖКИ соединялись между собой по линиям DB0-DB7. Сейчас требуется в 2 раза уменьшить число линий связи. Сделать это можно без применения мультиплексоров, воспользовавшись специальным режи-

мом работы контроллера HD44780.

Для активизации четырехбитового режима надо программно сформировать сигналы управления согласно временным диаграммам на рис.8. По структуре они совпадают с рис.5 за исключением удвоенного числа импульсов "Е". Линии связи проходят через старшие разряды шины данных DB4-DB7, младшие DB0-DB3 остаются не задействованными.

Достоинство режима - малое число проводников, упрощение топологии печатной платы, экономия линий портов МК. Недостаток - пониженная скорость передачи данных в ЖКИ, так как приходится информацию передавать двумя порциями (нибблами или тетрадами) по 4 бита в каждой. Однако, учитывая обязательные задержки времени в программе и физическую инерционность "жидких кристаллов", снижение скорости почти не чувствуется.

Электрическая схема "кибер-отгадчика" показана на рис.9. Интерфейс МК-ЖКИ до предела упрощен. Даже сигнал R/W в МК не заводится: нет смысла, ведь все равно на нем постоянно должен присутствовать лог."0" (это следствие принятых ранее ограничений, которые гласят: "ЖКИ является только приемником данных").

Кнопка SB1 представляет собой пульт управления игрока. Нажимая ее, он подтверждает, что выполнил указания "кибера". Элементы R1, С1-С3 повышают помехоустойчивость. Переключателем S1 включается подсветка (если она имеется в ЖКИ). Яркость регулируется подбором резистора R2, чтобы протекающий через него ток не превышал 120...150 мА. "Крейсерское" значение тока 70...100 мА.

Логика работы устройства описывается тождеством: x=(y*k+x*k)/k-у, где x - предсказываемый результат, y - задуманное число, k - произвольный коэффициент.

Для упрощения вычислений значения "x" и "k" ограничивают в пределах первого десятка. Для того чтобы диалог человека с машиной не напоминал монолог птицы-говоруна, в процесс вычислений вносится элемент случайности. Для этого числа "x" и "k" генерируются случайным образом в диапазоне соответственно 1-9 и 2-9.

Расшифровка действий: "Задумайте любое число (y). Умножьте его на первое число (k). Прибавьте к результату второе число (x*k). Полученное разделите на первое число (k) и вычтите задуманное число (y)". Если вычисления проделаны без ошибок, то в результате должно получиться число "x", о чем фокусник и сообщает зрителю.

Практическое задание. Приобрести алфавитно-цифровой дисплей ЖКИ, проверить его работоспособность на тестовых программах (листинги 1, 3). Собрать "кибер-отгадчик". Программа для его прошивки будет приведена в "Ступени 7".

Литература

1. Гарднер М. Математические чудеса и тайны. - М.: Наука, 1986.- 128 с.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11]