МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Ульяновский государственный технический универс...
7 downloads
184 Views
238KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Ульяновский государственный технический университет
СБОРНИК ЛАБОРАТОРНЫХ РАБОТ Специализированные вычислительные системы Часть 2
Составитель И.А.Никищенков
Ульяновск 1995
-2УДК 681.3 Сборник лабораторных работ:Специализированные вычислительные системы. Часть 2/Составитель И.А.Никищенков-Ульяновск,1995г. -с.88 Настоящие методические указания составлены в соответствии с программой курса Специализированные ВС для студентов 5 курса специальности 2201 и студентов 4 курса направления 5528. Лабораторные работы предназначены для изучения особенности архитектуры, системы команд, подключения внешних устройств и системы прерываний однокристальной микроЭВМ К1816ВЕ48. Описываются режимы работы эмулятора микроЭВМ, команды эмулятора и клавиши, управляющие процессом моделирования.
Рецензент:
Одобрены секцией методических пособий научно-методического совета института
С Ульяновский государственный технический университет
-3СОДЕРЖАНИЕ Введение 4 1. Основные правила по технике безопасности при работе 5 в лаборатории 2. Лабораторная работа N 3. Программирование ввода и вывода числовых и логических данных 6 2.1. Экран эмулятора AVSIM48 6 2.2. Команды эмулятора AVSIM48 9 2.3. Отладка программ в эмуляторе AVSIM48 17 2.4. Задание к лабораторной работе 19 3. Лабораторная работа N 4. Измерение и отображение временных интервалов 20 3.1. Ввод информации с датчиков 20 3.2. Вывод управляющих сигналов из МК 23 3.3. Реализация функций времени 23 3.4. Ввод информации с клавиатуры 27 3.5. Вывод и отображение информации 31 3.6. Задание к лабораторной работы 32 4. Литература 32 .
-4ВВЕДЕНИЕ При проектировании СВС особое внимание должно быть уделено средствам сопряжения с элементами приборного оборудования (датчиками, исполнительными механизмами и устройствами, пультами и органами управления, элементами индикации и отображения информации, средствами связи и дистанционного управления и т.п.). Сложность реализации такого сопряжения обусловлена тем, что функционирование перечисленных элементов основано, как правило, на различных физических принципах, они обладают разным быстродействием часто требуют обмена информацией в произвольные моменты времени. Появление дешевых БИС микропроцессоров и запоминающих устройств вызвало появление программируемых микроконтроллеров для управления низовыми звеньями автоматизированных систем управления технологическими процессами. Преимущества программируемых микроконтроллеров заключаются в высокой надежности, быстродействии, универсальности, возможности работать в условиях окружающей среды повышенной агрессивности, что обеспечило им широкое распространение во всем мире. По данным западных фирм программируемые микроконтроллеры применяются в 35% систем от общего числа автоматизированных систем управления технологическими процессами. Одним из наиболее распространенных типов микро-ЭВМ, используемых для построения программируемых микроконтроллеров, являются разработанные фирмой Intel семейства MCS-48 и MCS-51, что обуславливает необходимость изучения в курсе Специализированные выычислительные системы возможности построения микроконтроллеров на их основе. Однокристальные микроЭВМ семейства К1816 - это аналог MCS-48 фирмы Intel. В оригинальной серии 10 различных микроЭВМ, в серии К1816 - три. Все микроЭВМ имеют общую организацию и систему команд, но отличаются объёмом встроенной памяти. Максимальный объем встроенного ОЗУ данных 128 байт и ПЗУ программ - 2 Кбайт. За счет использования дополнительных микросхем ОЗУ данных можно увеличить до 256 байт, а ПЗУ программ - до 4 Кбайт. Лабораторные работы проводятся с использованием комплекса программных средств эмулятора AVSIM48. .
-51.Основные правила по технике безопасности при работе в лаборатории К выполнению работ в лаборатории допускаются лица, прошедшие инструктаж по технике безопасности и расписавшиеся в соответствующем журнале. При выполнении работ студентам необходимо выполнять следующие правила: работать только на указанном месте; выполнять только ту работу и ее объем,которые определены заданием и преподавателем; быть внимательным и не отвлекать от работы других студентов; при возникновении ситуаций не предусмотренных программой, обратиться к преподавателю; не загромождать свое рабочее место портфелями, книгами и другими вещами не имеющими отношения к работе; включение и выключение питания отдельных компонентов вычислительных комплексов выполнять в сторогом соответствии с установленным порядком; после окончания работы сдать рабочее место лаборанту. ЗАПРЕЩАЕТСЯ: включать лабораторное оборудование без разрешения преподавателя или лаборанта; оставлять без наблюдения включенное оборудование; снимать ограждающие кожухи и устранять неисправности. При несчастном случае необходимо: снять напряжение с пострадавшего и сообщить о случившемся преподавателю; оказать первую помощь пострадавшему; вызвать по телефону 03 скорую медицинскую помощь. .
-62.ЛАБОРАТОРНАЯ РАБОТА N 3 Программирование ввода и вывода числовых и логических данных 2.1. Экран эмулятора AVSIM48 После запуска программы avsim48 необходимо выбрать тип процессора и на дисплее формируется таблица, отображающая состояние микро-ЭВМ. В левой части экрана отображается содержимое ПЗУ программ в виде двух столбцов: в левом столбце отображается номер ячейки или имя метки, в зависимости от заданного режима, а в правом - мнемокод команды. В центре экрана отображается содержимое аккумулятора, регистра флагов, указателя стека и памяти данных. Содержимое аккумулятора и ячеек ОЗУ отображается в двоичном, шестнадцатиричном и символьном виде. В зависимости от того в каком поле находится курсор, нажатые клавиши воспринимаются по разному. В двоичном поле это могут быть только клавиши "0" или "1", воспринимаемые как двоичные числа, в шестнадцатиричном поле - это клавиши "0"..."9" и латинские буквы "A"..."F", воспринимаемые как шестнадцатиричные цифры; в символьном поле воспринимается код символа нажатой клавиши. В поле PC и SP под заголовком addr отображаются текущие значения счетчика адреса команд и указателя стека. В поле data отображаются восемь байт ПЗУ, соответствующих указателю PC, причем точное значение PC указывается среди этих байт другим цветом, аналогично отображается содержимое стека. Ниже отображаются в двоичном, шестнадцатиричном и символьном виде регистры R0 и R1. Регистры R2..R7 отображаются только в шестнадцатиричном виде. Следует помнить, что регистры отображаются в ОЗУ в строке 0000, а стек - в строках 0008 и 0010. Содержимое ОЗУ отображается в виде двух таблиц, первые столбцы которых соответствуют адресам строк из восьми ячеек ОЗУ, а далее отображается содержимое в шестнадцатиричном виде. Управление отображением таблиц производится с помощью команды Dump. В правом верхнем углу экрана показано состояние переключателей, управляющих процессом моделирования и отображения результатов. Режим моделирования можно установить задав переключатели: SCL - управляет перемещением курсора на экране эмулятора, переключается нажатием Ctrl+PgUp: ON - перемещение между элементами МК запрещено и осу-
-7ществляется скроллинг ОЗУ (необходимо, чтобы курсор находился в поле ОЗУ); OFF - перемещение между элементами МК разрешено и скроллинг ОЗУ запрещен. SPD - скорость моделирования, переключается нажатием F5: LOW - медленная; MID - средняя; HI - высокая. DSP - обновление экрана, переключается нажатием F6: ON - обновление всего экрана после каждой команды; OFF - обновление выбранных окон после каждой команды. SKP - определяет отображение выполнения подпрограмм, переключается нажатием F8: ON - выполнение подпрограмм отображается; OFF - выполнение подпрограмм не отображается при пошаговом выполнении программ, так как происходит препывание при попытке перейти на подпрограмму. CURSOR - курсор при перемещении по экрану автоматически устанавливается на выбранное представление данных: символьное, шестнадцатиричное или двоичное. Переключается нажатием F7. Под заголовком TIMER отображается: ctr - числовой код в счетчике/таймере CTR/TMR/OFF - состояние: счетчик вкл/таймер вкл/выкл tov - запрет прерывания от таймера tf - флаг переполнения счетчика/таймера При выполнении команды STRT T происходит переключение в состояние таймер, что отображается как TMR и состояние таймера увеличивается на единицу по внутреннему генератору; при выполнении команды STRT CNT - переключение в состояние подсчета импульсов на входе Т1, причем в счетчик добавляется единица при переходе из 1 в 0 на входе Т1. По команде STOP TCNT подсчет импульсов прекращается. Под заголовком INT FFs отображается: ie - разрешение прерываний от входа int tie - разрешение прерываний от таймера iip - запрет прерываний на время работы подпрограммы обработки прерываний Под заголовком PINS отображаются значения на входах to, t1, int. При переполнении счетчика дальнейшая работа зависит от запрета
-8или разрешения прерываний. При выполнении команды EN TCNT прерывания разрешены, что переводит бит tie в поле INT FFs в единичное состояние и при переполнении счетчика флаг переполнения tf и бит запрета прерываний iip устанавливаются в единицу, происходит переход на вектор прерываний 07Н и затем на программу обработки прерываний. Если программа обработки прерываний заканчивается командой RET при ее выполнении флаг переполнения tf и бит запрета прерываний iip сохраняют значения единицы и при повторном переполнении счетчика прерывание не происходит и бит tov устанавливается в единицу. Если программа обработки прерываний заканчивается командой RETR при ее выполнении флаг переполнения tf сохраняет значения единицы, а бит запрета прерываний iip сбрасывается в ноль и при повторном переполнении счетчика происходит прерывание. При выполнении команды DIS TCNT прерывания запрещены и бит tie в поле TIMER в переводится в нулевое состояние и при переполнении счетчика флаг переполнения tf и бит tov устанавливаются в единицу, а бит запрета прерываний iip сохраняет нулевое состояние, если затем встречается команда JTF происходит переход по адресу указанному в этой команде, при этом бит tf сбрасывается в ноль, а бит tov сохраняет свое единичное состояние. Таким образом после выполнения программы обработки прерывании выполнение команды JTF так же приводит к переходу по адресу указанному в ней со сбросом tf. Прерывания от внешнего источника обрабатываются аналогично. При выполнении команды EN I прерывания разрешены, что переводит бит ie в поле INT FFs в единичное состояние и при переходе бита int в поле PINS из "1" в "0" бит запрета прерываний iip устанавливаются в единицу, происходит переход на вектор прерываний 03Н и затем на программу обработки прерываний. Если программа обработки прерываний заканчивается командой RET при ее выполнении бит запрета прерываний iip сохраняет значения единицы и при повторном запросе int=0 прерывание не происходит. Если программа обработки прерываний заканчивается командой RETR, при ее выполнении бит запрета прерываний iip сбрасывается в ноль и при повторном прерывании int=0 происходит прерывание. При выполнении команды DIS I внешние прерывания запрещены. В правой части отображается состояние портов BUS, P1, P2, причем в каждой верхней строке показано содержимое буфера вывода порта, а в расположенной под ней строке - сигналы на соответс-
-9твующих контактах микросхемы. Большинство данных одновременно представлено в шестнадцатиричном, символьном и двоичном виде. 2.2. Команды эмулятора AVSIM48 Меню команд эмулятора представляется в нижних двух строках экрана пользователя и первая строка содержит краткие сведения о команде, на которую указывает курсор, а вторая строка содержит имена команд, по которым перемещается курсор, с помощью которого осуществляется выбор команды. Переход от процесса моделирования к выполнению команд эмулятора и обратно осуществляется по нажатию Esc. Меню отображается в две строки, в каждый момент времени видна только одна строка и переход между строками осуществляется нажатием клавиши "пробел" или нажатием стрелки влево, если курсор в крайне левой позиции, и стрелки вправо, если курсор в крайне правой позиции. Выбранная команда начинает выполняться после нажатия клавиши "Enter" и выполнение команды приводит к необходимости ввода параметров или выбора из дополнительных пунктов меню, перемещение между которыми так же осуществляется нажатием клавиш стрелок и нажатием "Enter" или вводом соответствующих букв в именах команд. Количество уровней меню, в которых определяются параметры выбранной команды, различно и зависит не только от самой команды, но и от выбираемых параметров. Прервать последовательность выбора и вернуться в основное меню без выполнения команды можно в любой момент времени введя Ctrl+C. Перемещение по меню команд можно осуществлять вводя выделенные заглавные буквы в названиях команд, параметров, их цифровые значения или имена файлов, однако в этом случае необходимо точно повторять всю последовательность действий, заданную в меню команд. Эта последовательность данных может быть записана в командном файле, который создается с помощью команды COMMAND FILE и должен иметь расширение .cmd. Рассмотрим команды эмулятора подробно, причем при описании команд в скобках указываются тексты подсказок, выводимые на экран на соответствующих этапах выполнения команд. Команды меню эмулятора: первая строка Dump Expression commandFile Help IO Load вторая строка
- 10 Memory Patch Quit Reset Set setUp View eXecute Команда Dump предлагает определить область памяти отображаемую в верхнем и нижним окнах Data Space на экране монитора с помощью меню следующего уровня: Select DUMP Area: 1 2 Выбор 1 используется управления отображения в верхнем окно и выбор 2 - в нижнем окне. Для каждого из окон при выборе Absolute задается начальный абсолютный адрес памяти, с которого начинаются отображаемые в окне 32 байта памяти в абсолютных адресах (Enter Expression in Data Address Space). При выборе Indirect задается выделяемая на экране другим цветом ячейка, адрес которой задается косвенно. Адрес этой ячейки при вводе состоит из двух компонентов: первым вводится адрес ячейки памяти или номер регистра (Indirect Address or Register), которые интерпретируются как косвенный адрес, а затем константа (Index OFFSET). На экране это отображается как @R1 + R2, что означает содержимое R1 плюс константа два. Команда Expression вводит данные в элемент процессора, на который указывает курсор. В строке Enter Expression можно вводить константы и арифметические выражения с использованием регистров, констант и знаков арифметических операций плюс и минус. Допускается косвенная адресация через регистры и ячейки памяти. В последней строке сообщается, куда будут вводиться данные. Команда commandFile предназначена для создания и загрузки командного файла, после выбора которой на экран выводится следующая строка: COMMAND FILE: Load SAVE: Open Close Restart Предложение COMMAND FILE:Load предназначено для загрузки командного файла и после выбора Load необходимо ввести имя файла, в котором содержится выбранная последовательность действий, причем имя файла обязательно должно содержать расширение .cmd. Предложение SAVE обеспечивает создание командных файлов. После выбора Open и ввода имени файла, в котором предполагается сохранить командный файл, выполнение команды COMMAND FILE закончится. Затем следует выполнять запланированные команды, перемещаясь по меню путем ввода заглавных букв команд и необходимых параметров, по завершении необходимых действий следует закрыть файл выбрав в команде commandFile предложение SAVE:Close. Если в процессе формирования командного файла были допущены ошибки можно начать
- 11 ввод с начала выбрав предложение SAVE:Restart. Полученный командный файл можно запустить на выполнение как указано ранее путем выбора предложения COMMAND FILE Load, либо путем указания имени файла в командной строке avsim48 afl*.cmd -c1 где вместо *.cmd необходимо указать имя файла, которое должно обязательно содержать расширение. Команда Help содержит краткий справочник по эмулятору и после ее выбора на экран выводится: Commands Display Simulation Avocet Предложение Commands представляет описание формата команд и операндов языка ассемблер. Предложение Display поясняет клавиши управления отображением процесса моделирования. Предолжение Simulation описывает клавиши управления процессом моделирования и предложение Avocet приводит сведения о фирме-изготовителе. Команда IO предназначена для задания внешних воздействий на входах микроконтроллера, в которой определяется имя файла, за ним закрепляется порт, номер контакта и порядок подачи данных на вход. Файл внешних воздействий может содержать символы и числовые величины, заданные в двоичном формате одно или двухбайтового слова. При воспроизведении на входе функциональных зависимостей обычно используются файлы, содержащих десятичные или шестнадцатиричные константы, для их преобразования в двоичное представление используется программа iotran.exe, входящая комплект поставки эмулятора. Тип преобразования, имена исходного и результируюшего файлов определяются при вызове программы. После выбора команды IO появляется предложение: FILE: Open Close Выбор Close дает возможность закрыть ранее открытые файлы, тем самым прекратить подавать на входы МК сигналы, при этом последовательно выводятся имена всех открытых файлов и для каждого из них нужно подтвердить их закрытие вводом Yes или оставить открытым выбрав No. По выбору Open предлагается ввести имя файла (INPUT FILE:), содержащего внешние воздействия. Если вместо имени нажать Enter происходит переход к заданию выходного файла, рассмотренному далее. Затем в предложении REPLAY ...: Yes No определяются действия по достижению конца файла: при выборе Yes содержимое файла продолжит подаваться на выбранный вход с перво-
- 12 го символа файла, при выборе No передача данных прекратится. Следующее предложение (IO OUTPUT) определяет направление обмена: ввод или вывод, если просто нажать клавишу Enter будет производиться ввод из заданного файла, если ввести имя файла он будет создан и в него будут записываться выходные сигналы на на заданных контактах МК. Независимо от сделанного выбора в следующем предложении: IO TRIGGER: Cycles Opcode access задается порядок подачи данных на вход. При выборе Cycles данные на входе меняются независимо от действий программы: через определенный промежуток времени, задаваемый в машинных циклах, из входного файла выбирается следующее значение и подается на заданный вход и предлагается ввести заданное десятичным числом количество циклов. Следующее предложение IO TRANSFER: Mapbits mapBytes определяет вид вводимых данных. Выбор Mapbits указывает, что вводимые значения следует интерпретировать как биты и предлагается определить соответствие между символами, записанными в файле и значениями на входах МК, для чего нужно ввести: константа, константа, имя, направлениеEnter IO Bit, Memory Bit, Address, Dir:In/Out В этом случае предполагается, что любые символы в файле входных воздействий представляют двоичные константы с соответствующим этому коду набором нулей и единиц. Первая константа задает какой бит из входной двоичной константы будет подаваться на определяемый вход МК; вторая константа - номер бита входного порта, на который задается воздействие; третья составляющая - имя порта P1, P2, BUS; четвертая составляющия по умолчанию In, поэтому при вводе ее можно опустить, просто дважды нажав на Enter, однако при выводе ее надо указать в явном виде, набрав Out. В качестве имени можно указать PINS, но на месте второй константы должно стоять одно из имен: T0, T1 или Int. Выбор mapBytes предполагает ввод данных побайтно, входной код в этом случае интерпретируется как код символа и его значение подается на порт P1, P2, BUS, имя которого вводится на предложение ENTER EXPRESSION. Правила ввода направления Dir:In/Out такие же как и в предидущем случае. При выборе Opcode access данные на входе изменяются после того как процессор обратился к этому входу: в случае портов это может быть команда чтения из порта, а для входов PINS - команда ветв-
- 13 ления по значению на этом входе. Данные в этом случае могут вводиться только побайтно и сразу по выбору этого предложения необходимо ввести имя порта по правилам ENTER EXPRESSION, рассмотренным выше. Одной командой IO можно определить входное воздействие только на один вход (бит или байт), для задания нескольких воздействий следует использовать соответствующее количество команд IO. Вместе с тем один и тот же файл может использоваться в нескольких воздействиях. Команда Load загружает в ПЗУ программу пользователя. Использование предложения Avocet загружает программу с таблицей меток, что позволяет переключать на экране отображение меток и адресов в столбце команд по Alt+F5, однако в этом случае программа должна содержать в заголовке макроопределение $ALLPUBLIC и редактироваться с ключом -SY. При вводе имени файла в этом случае расширение не указывается. Предложение Program загружает только текст программы и имя файла должно иметь расширение *.hex, а предложение Symbol-table загружает таблицу меток (имя файла должно иметь расширение *.sym), то есть вместе ни работают как одно предложение Avocet. Команда Memory облегчает работу с ОЗУ. Ее предложения: Clear Fill Move Seach seachNext Очистить Заполнить Переместить Найти Найти следующее В каждом из предложений определяется область памяти, над которой производятся выбранные действия. Для этого предлагается задать нижнюю границу памяти (LOWER Address) и верхнюю границу памяти (UPPER Address). Для всех предложение, кроме Clear, необходимо задать выражение, которое будет заполнять заданную область (предложение Fill), определит начальный адрес, с которого будет переписана заданная область (предложение Move) или будет найдено в заданной области (предложения Seach и seachNext). Выражение составляется по общим правилам записи выражений языка ассемблер. Строка, в которой находится найденное в результате поиска выражение, становится первой в окне и выводится строка Found at, содержащая номер ячейки ОЗУ. Команда Patch позволяет вставлять "заплаты" в машинный код программы при отладке путем использования локального кросс-ассемблер. При выборе предложения Patch code в строке ENTER mnemonic необходимо ввести команду на языке ассемблер, которая после нажатия Enter будет занесена в ячейку ПЗУ программ, на ко-
- 14 торую указывает счетчик адреса команд (РС), счетчик адреса переместится на следующую ячейку и можно вводить новую команду. Указанная последовательность действий применяется при вводе команд размещающихся в ПЗУ последовательно и при необходимости ввести команды в разные адреса ПЗУ после нажатия Enter следует нажать Esc, изменить адрес в счетчике адреса команд и повторным нажатием Esc вернуться к вводу команды. Ввод всех команд и выход осуществляется по Ctrl+C. При вводе команды проверяется ее синтаксическая правильность и при наличии ошибок после Enter предлагается повторить ввод. Все внесенные изменения заносятся только в ПЗУ пограмм и после выхода из эмулятора теряются. Для запоминания внесенных изменений можно воспользоваться предложением Open output file, при выборе этого предложения необходимо ввести имя файла, где будут храниться изменения, а затем ввод исправлений производится, как описано в предложении Patch code. По завершении ввода всех исправлений необходимо закрыть файл с поомощью предложения Close file. Внесенные изменения будут храниться в заданном файле в виде строк, состоящих из двух элементов: первый элемент - номер ячейки ПЗУ, второй элемент - код команды. Команда Quit предназначена для завершения работы и выхода из эмулятора. Выход нужно подтвердить выбором предложения Exit или отказаться от него нажав Ctrl+C. Команда Set устанавливает параметры моделируемого МК и управляет точками останова. Меню этой команды, так же как и меню эмулятора, отображается в две строки, переход между которыми осуществляется по тем же правилам. Первая строка имеет вид: SET: Memory-map Passpoint cYcles Предложение Memory-map позволяет определить используемую область памяти. При запуске эмулятора размеры памяти не определены, а загрузка программы определяет только те ячейки ПЗУ, в которые помещается программа и 64 ячейки ОЗУ. При определении памяти необходимо выбрать тип памяти: ОЗУ (random-Access) или ПЗУ (read-Only), а затем задать ее размер путем последовательного ввода младшего и старшего адресов (LOWER Address и UPPER Address). Предложение Passpoint рассмотрим после определения точек останова. Предложение cYcles не имеет подменю и включает таймер, который можно сбросить по сбросу процессора или приостановить работу по Reset. Вторая строка команды Set управляет установкой различных ви-
- 15 дов точек останова. Все точки останова могут быть динамическими (Dynamic), то есть выполняющимися только один раз, а потом сбрасывающимися или постоянными (Sticky), которые можно сбросить только командой Reset. Различают четыре способа задания точек останова: A - R/W point - задается точка останова в при выполнении команды чтения или записи; B - R/W range - задается область точек останова в при выполнении команды чтения или записи; C - Write point - задается точка останова в при выполнении команды записи; D - Write range - задается область точек останова в при выполнении команды записи. После выбора типа точки останова предлагается определить к какому объекту относится этот тип. На это предложение можно ввести числовую константу, которая будет интерпретироваться как адрес ПЗУ команд и останов в этой точке будет происходить независимо от кода команды (т.е. типы A и C, B и D не будут отличаться). При вводе имени регистра останов будет происходить в любой точке программы, где произойдет запись в заданный регистр, если выбран тип C и D или любая команда, использующая его при выборе типа А и В. При использовании типов B и D предлагается ввести младший и старший адреса (LOWER Address и UPPER Address). Эти предложения используются в большинстве команд второй строки команды Set, которая имеет вид: SET BREAKPOINT: Conditional Dynamic Opcode Sticky Предложение Conditional устанавливает постоянную или динамическую точку останова любого типа, однако останов происходит только при совпадении задаваемых в команде величин со значением заданной в точке останова переменной. Можно выбрать один из четыре типов условий: Indirect - если при вводе используются цифровые константы из первого вводимого числа (Value of Byte...) вычитается второе вводимое значение (Offset Value). Регистры с номерами больше единицы воспринимаются как константы, сооветствующие этим номерам. Использование R0 и R1 позволяет использовать косвенную адресацию. Mask - вводится маска в виде двоичной константы, причем "х" соответствует любому значению этого бита;
- 16 Range - вводится область значений в виде двух констант: минимального (LOW limit of Byte ...) и максимального (HIGH limit of Byte ...) значений; Value - вводится значение в виде константы (Value of Byte..). После задания условий предлагается определить вид точки останова как и для других предложений. Предложение Dynamic устанавливает динамическую точку останова, тип которой определяется как указано выше. Предложение Opcode устанавливает динамическую точку останова для кода команды, который предлагается ввести. Предложение Sticky устанавливает постоянную точку останова одного из четырех указанных выше типов. Предложение Passpoint устанавливает тип точки Passpoint аналогично предложению SET BREAKPOINT, однако в этом случае останов не происходит, но для каждой Passpoint закрепляется счетчик, который подсчитывает число выполнений команды, для которой заданные типом условия выполняются. Просмотреть эти счетчики можно с помощью команды View. Команда Reset имеет, так же как и меню эмулятора, отображается в две строки, переход между которыми осуществляется по тем же правилам. Первая строка имеет вид: RESET: Cpu Disptrace cYcles все предложения этой строки не имеют подменю. Они выполняют следующие функции: Cpu - сброс процессора, однако ОЗУ, ПЗУ и аккумулятор не сбрасываются; Disptrace - отключаются все окна трассировки; cYcles - счетчик циклов перестает считать, но сохраняет свое значение. Вторая строка команды Reset управляет сбросом различных видов точек останова и имеет следующий вид: RESET BREAKPOINT: All Traplist Breakpoints Эти предложения выполняют следующие функции: All - сбрасывает все точки останова; Traplist - сбрасывает список точек останова; Breakpoints - имеет подменю, в котором определяется один из четырех типов точек останова, которые будут сброшены, затем предлагается подменю: Kill All Next, а в во второй строке первая точка из списка точек
- 17 останова выбранного типа. Предложение All удаляет все точки останова выбранного типа, предложение Kill удаляет точку останова, которая выводится во второй строке, предложение Next выводит следующую точку останова из списка. Команда setUp устанавливает размеры Undo, то есть количество команд, на которые можно вернуться назад по F9. Команда View предназначена для просмотра различных параметров процесса моделирования и представляет следующее подменю: VIEW: Bkpts IO-files Memory-map Ops-traps Passpts Symbols Предложения отображают следующие параметры: Bkpts - список активных точек останова; IO-files - список активных файлов внешних воздействий; Memory-map - распределение ОЗУ и ПЗУ; Ops-traps - список активных точек останова по коду команды; Passpts - список активных точек подсчета; Symbols - имеет подменю: VIEW SYMBOLS: Alpha Registers Numbers Code Data eXt и отображают: Alpha - список имен переменных и РОН и их адресов; Registers - список обозначений элементов ЦП; Numbers - список значений переменных; Code - список адресов меток; Data - список адресов переменных; eXt Команда eXecute выполняет команду ассемблера, которая вводится в строке Enter mnemonic. 2.3. Отладка программ в эмуляторе AVSIM48 Текст программы на языке ассемблер формируется в любом редакторе и является исходным для компилятора AVMAC48.EXE, по результатам работы которого формируются файлы: *.obj - обьектный код *.prn - скомпилированная программа в относительных адресах, подготовленная к выводу на печать. Файл *.obj является входным для редактора связей на выходе которого получается файл *.hex и *.sym, которые используются в моделировщике avsim48. Для того, чтобы получить возможность пе-
- 18 реключаться в режим отображения меток вместо адресов ПЗУ следует использовать макрокоманду $ALLPUBLIC до определения меток в программе и использовать ключ -SY при редактировании. При необходимости загрузить программу в память команд без выполнения можно воспользоваться следующими командными строками: avsim48 alatemp -c1 или avsim48 alptemp.hex -c1 где temp - имя программы, причем во втором случае расширение обязательно. При отладке удобно использовать следующий bat - файл: avmac48.exe temp.asm avlink temp=temp.obj -SY avsim48 alatemp -c1 В этом случае все файлы *.obj, *.hex, *.map, и *.sym будут иметь одинаковые имена и отличаться только расширениями. При каждом запуске программа будет заново компилироваться и можно изменять последнюю строку в зависимости от предполагаемого использования. Для запуска программы на моделирование необходимо основные параметры моделируемой системы с помощью команды Set, которая позволяет определить карту адресов ОЗУ и ПЗУ, тип точек останова, используемых при моделировании и запускает счетчик циклов. Сама программа загружается командой Load. При использовании предложения LOAD: programm вводится имя программы с расширением .hex и таблица меток не загружается, поэтому переход в режим отображения меток невозможен. Для загрузки программы с таблицей меток следует использовать предложение Load: avocet и имя программы указать без расширения. Переход к отображению меток или адресов и обратно осуществляется нажатием Alt+F5. После загрузки программы все порты сброшены и переключившись в режим экрана можно ввести в них значения отличные от нулевых. При этом перемещаться по экрану можно с помощью курсора. Для более быстрого перехода на нужный объект можно воспользоваться горячими клавишами, перечень которых приводится в команде Help предложение Display. Отображаемые в левом столбце адреса ПЗУ и коды команд изменяются автоматически при выполнении программы, однако можно отображать любые адреса изменив содержимое счетчика адресов программы введя его новое цифровое значение или увеличивая/уменьшая его значение на единицу нажатием +/- или увеличивая/уменьшая его значение на 22 нажатием PgUp/PgDn. Горячая кла-
- 19 виша для перехода на счетчик адреса программы Ctrl+P. В процессе моделирования программа может выполняться по командам и для выполнения каждой следующей команды нужно нажимать F10. Для запуска программы на выполнение используется клавиша F1, причем скорость выполнения команды определяется переключателем SPD. До выполнения можно задать динамические точки останова, для этого курсор точки останова перемещается в сторону меньших адресов нажатием F2, в сторону больших адресов - F4, сама точка останова задается нажатием F3. 2.4. Задание к лабораторной работе Разработать схему микроконтроллера на основе К1816ВЕ48 для ввода восьмеричных чисел со знаком и их отбражения на семисегментных индикаторах. Числа вводятся с клавиатуры, представленной матрицей 4*3. Назначение клавиш в клавиатуре задается исполнителем при разработке схемы. Алгоритм работы микроконтроллера должен предусматривать: - защиту от дребезга контактов; - число без знака считается положительным; - числа должны быть < 127 и разделяются клавишей пробел; - вводимые числа суммируются с накоплением; - после ввода 64 чисел производится усреднение; - если сумма превысит 6144 в порт BUS выдается код 0. - при вводе 64 чисел результат усреднения выводится на блок семисегментных индикаторов через порт BUS. Программа должна быть отлажена с использованием эмулятора. .
- 20 3. Лабораторная работа N 4 Измерение и отображение временных интервалов 3.1. Ввод информации с датчиков В устройствах и системах логического управления объектами события в объекте управления фиксируются с использованием разнообразных датчиков цифрового и аналогового типов. Наибольшее распространение имеют двоичные датчики типа да/нет, например концевые выключатели. Типовая процедура ожидания события (WAIT) состоит из следующих действий: ввода сигнала от датчика, анализа значения сигнала и передачи управления в зависимости от состояния датчика. Конкретная программа реализации процедуры зависит не только от типа МК, но и от того, каким образом датчик подключен к МК. Он может быть подключен к одной из линий портов МК или к специальным тестируемым входам (Т0, Т1). Например, при подключении датчика к линии бита 3 порта 1 процедура ожидания замыкания контакта будет иметь вид WAITC: IN A,P1 ;ввод сигнала от датчика JB3 WAITC ;если контакт датчика разомкнут,то ;повторять ввод, иначе выход При подключении датчика к тестовому входу Т0 эта же процедура: WAITC: JT0 WAITC ;если контакт разомкнут, то цикл. Другим частным случаем типовой процедуры ожидания события является процедура ожидания размыкания контакта, которая может быть реализована следующим образом: WAITO: IN A,P1 ;ввод байта CPL A ;инвертирование JB3 WAITO ;если контакт замкнут, то цикл Наравне с входами 0 и Т1 для опроса датчика может использоваться инверсный вход ЗПР. В этом случае надо предварительно запретить прерывания и использовать инверсный вход ЗПР как тестовый. Режим прерывания целесообразно использовать только для опроса особо важных датчиков с целью уменьшения времени реакции на исключительную (аварийную) ситуацию в объекте управления. Особенность процедуры ожидания импульсного сигнала состоит в том, что МК должен обнаружить не только факт появления, но и факт окончания сигнала. Для программирования этой процедуры удобно воспользоваться рассмотренными выше примерами ожидания
- 21 события, смонтировав их последовательно в линейную программу. Оформлять процедуры WAITC и WAITO в виде подпрограмм нецелесообразно, так как это удлиняет программу, а длина и, следовательно, время исполнения программы определяют минимальную длительность импульса, который может быть обнаружен программой. Последовательность склеивания процедур WAITC и WAITO зависит от формы импульса. Для "отрицательного" импульса (1 -> 0 - > 1) WAITC должна предшествовать WAITO, иначе - наоборот. Часто в управляющих программах возникает необходимость ожидания цепочки событий, представляемой последовательностью импульсных сигналов от датчиков. Рассмотрим две типовые процедуры: подсчет числа импульсов между двумя событиями и подсчет числа импульсов за заданный интервал времени. Предположим, что необходимо подсчитать число деталей, сошедших с конвейера от момента его включения до момента выключения. Факт схода детали с конвейера фиксируется фотоэлементом, на выходе которого формируется импульсный сигнал. Для простоты реализации предположим, что общее количество деталей меньше 255: COUNT: CLR A ; сброс счетчика деталей WAITC1: JT0 WAITC1 ; ожидание включение конвейера WAITC2: JT1 WAITC2 ; ожидание начала импульса WAITO2: JNT1 WAITO2 ; ожидание конца импульса INC A ; инкремент счетчика деталей JNT0 WAITC2 ; если конвейер не выключен,то про; должать подсчет, иначе выход По окончании выполнения процедуры в аккумуляторе фиксируется число деталей, представленное в двоичном коде. Процедура подсчета импульсов может быть реализована иначе, если использовать вход Т1 не как тестовый, а как вход счетчика событий: COUNT: CLR A ; сброс счетчика MOV T,A WAITC1: JT0 WAITC1 ; ожидание включения конвейера STRT CNT ; запуск счетчика событий WAITO1: JNT0 WAITO1 ; ожидание отключения конвейера STOP TCNT ; останов счетчика MOV A,T ; передача числа подсчитанных деталей ; в аккумулятор При решении задачи преобразования число-импульсного кода в двоичный код, а также в ряде других задач может возникнуть необ-
- 22 ходимость подсчета числа импульсов за заданный интервал времени. Эта процедура может быть реализована тремя различными способами: программной реализацией временного интервала и программным подсчетом числа импульсов на входе МК; программной реализацией временного интервала и аппаратурным подсчетом числа импульсов (на внутреннем таймере/счетчике); аппаратурной реализацией временного интервала и программным подсчетом числа импульсов. Первый способ неэффективен и значительно сложнее других, а потому не рассматривается, второй и третий являются альтернативными, поскольку у МК48 имеется только один таймер/счетчик. При аппаратурной реализации подсчета числа событий импульсный датчик должен быть подключен к входу Т1 микроконтроллера: STDLY: CLR A ; сброс счетчика импульсов MOV T,A ; STRT CNT ; запуск счетчика CALL DELAY ; временная задержка STOP TCNT ; останов счетчика MOV A,T ; фиксация результата Подсчет импульсов производится счетчиком событий, а отсчет заданного временного интервала - подпрограммой DELAY. При аппаратурной реализации отсчета временного интервала импульсные сигналы удобнее всего принимать на вход Т0: CTLDYT: MOV A,#0 ; настройка таймера MOV T,A ; STRT T ; запуск таймера MOV R1,A ; сброс счетчика импульсов WAITC: JTF STP ; если время истекло - переход на выход JT0 WAITC ; ожидание импульса WAIT0: JNT0 WAIT0 INC R1 ; инкремент счетчика JMP WAITC ; переход для продолжения счета STP: STOP TCNT ; останов таймера В приведенном примере таймер настроен на максимально возможный временной интервал - 20 мс, счетчик импульсов реализован в регистре R1. Проверка истечения заданного временного интервала осуществляется по флагу переполнения таймера (TF). Прерывание должно быть замаскировано. Поскольку аппаратурный таймер не может реализовать временные
- 23 задержки длительностью более 20 мс, "длинные" временные задержки должны реализовываться программно, например, они могут "набираться" из интервалов в 20 мс с подсчетом числа прерываний от таймера. 3.2. Вывод управляющих сигналов из МК Управляющее воздействие типа "импульс" можно получить последовательной выдачей сигналов "включить" и "отключить" с промежуточным вызовом подпрограммы временной задержки: ;включение выдачей отрицательного импульса в линию 3 порта 1 PULS: ANL P1,#11110111B ; включение CALL DELAY ; временная задержка OFF: ORL P1,#00001000B ; отключение Длительность импульса определяется временной задержкой, реализуемой подпрограммой DELAY, а на остальных линиях порта 1 сигналы остаются неизменными. Для генерации периодического управляющего воздействия (меандра) удобно воспользоваться процедурой выдачи импульсного управляющего воздействия (PULS) и подпрограммой реализации временной задержки, равной половине периода сигнала (DLYX). ;бесконечный периодический сигнал формируется в линии 3 порта 1 MEANDR: ANL P1,#0F7H ; включение CALL DLYX ; временная задержка OFF: ORL P1,#04H ; отключение CALL DLYX ; временная задержка JMP ON ; бесконечный цикл Последовательность импульсных сигналов с произвольной длительностью и скважностью может быть получена аналогичным образом. 3.3. Реализация функций времени Процедура реализации временной задержки использует метод программных циклов. При этом в некоторый рабочий регистр загружается число, которое затем в каждом проходе цикла уменьшается на 1. Так продолжается до тех пор, пока содержимое рабочего регистра не станет равным нулю, что интерпретируется программой как момент выхода из цикла. Время задержки при этом определяется
- 24 числом, загруженным в рабочий регистр, и временем выполнения команд, образующих программный цикл. Предположим, что в управляющей программе необходимо реализовать временную задержку 100 мкс. Фрагмент программы, реализующей временную задержку, требуется оформить в виде подпрограммы, так как предполагается, что основная управляющая программа будет производить к ней многократные обращения для формирования выходных импульсных сигналов, длительность которых кратна 100 мкс. DELAY: MOV R2,#X ; (R2)<--X COUNT: DJNZ R2,COUNT ; декремент R2 и цикл, если не нуль RET ; возврат Для получения требуемой временной задержки необходимо определить число X, загружаемое в рабочий регистр. Определение числа X выполняется на основе расчета времени выполнения команд, образующих данную подпрограмму. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки. В описании команд МК указывается, за сколько машинных циклов (МЦ) исполняется каждая команда. На основании этих данных определяется суммарное число машинных циклов в подпрограмме: CALL - 2МЦ, MOV - 2МЦ, DJNZ - 2МЦ, RET - 2МЦ. При тактовой частоте 6 МГц каждый машинный цикл выполняется за 2,5 мкс. Таким образом, подпрограмма выполняется за время 5+5+5X+5 = 15+5X мкс. Для реализации временной задержки 100 мкс число X=(100-15)/5=17. В этом случае при загрузке в регистр R2 числа 17 требуемая временная задержка (100 мкс) реализуется точно. Если число X получается дробным, то временную задержку можно реализовать лишь приблизительно. Для более точной подстройки в подпрограмму могут быть включены команды NOP, время выполнения каждой из которых равно 2,5 мкс. Минимальная временная задержка, реализуемая подпрограммой DELAY, составляет 20 мкс (X=1). Временную задержку меньшей длительности программным путем можно реализовать, включая в программу цепочки команд NOP. Максимальная длительность задержки, реализуемая подпрограммой DELAY, составляет 1,29 мс (X=255). Для реализации задержки большей длительности можно рекомендовать увеличить тело цикла включением дополнительных команд или
- 25 использовать метод вложенных циклов. Так, например, если в подпрограмму DELAY перед командой DJNZ вставить дополнительно две команды NOP, то максимальная задержка составит 15+X(5+5) = 15+10*255 = 2565 мкс (т.е. почти в 2 раза больше). Для программной реализации временной задержки большой длительности используется метод вложенных циклов. Числа X и Y выбираются из соотношения Т=5+5+X(5+5Y+5)+5, где Т - реализуемый временной интервал в микросекундах. Максимальный временной интервал, реализуемый таким способом, при X=Y=255 составляет 327,69 мс, то есть приблизительно 0,3 с. В качестве примера рассмотрим подпрограмму, реализующую временную задержку 100 мс: DELAY: MOV R1,#84 ; загрузка X LOOPEX: MOV R2,#236 ; загрузка Y LOOPIN: DJNZ R2,LOOPIN ; декремент R2 и внутренний цикл, ; если (R2) не равно нулю DJNZ R1,LOOPEX ; декремент R1 и внешний цикл, ; если (R1) не равно нулю MOV R3,#4 ; точная подстройка LOOPAD: DJNZ R3,LOOPAD ; временной задержки RET Здесь два вложенных цикла реализуют временную задержку длительностью 15+84(10+5*236) = 99975 мкс, а дополнительный цикл LOOPAD реализует задержку 25 мкс и тем самым обеспечивает точную подстройку временного интервала. Из рассмотренного примера видно, что секунда является очень большим интервалом времени по сравнению с частотой тактирования МК. Такие задержки сложно реализовать методом вложенных циклов, поэтому их обычно набирают из точно подстроенных задержек меньшей длительности. Например, задержку в 1 с можно реализовать десятикратным вызовом подпрограммы, реализующей задержку 100 мс. ONESEC: MOV R3,#10 ; загрузка в R3 числа и вызов ; подпрограммы DELAY LOOP: CALL DELAY ; задержка 100 мс DJNZ R3,LOOP; декремент R3 и цикл, если ; R3 не равен нулю Погрешность подпрограммы составляет 55 мкс. Для очень многих применений это достаточно высокая точность, хотя реализованные на основе этой программы часы астрономического времени за сутки
- 26 "убегут" примерно на 5 с. Недостатком программного способа реализации временной задержки является нерациональное использование ресурсов МК: во время формирования задержки МК практически простаивает, так как не может решать никаких задач управления объектом. В то же время аппаратурные средства МК позволяют реализовать временные задержки на фоне основной программы работы. При использовании таймера в МК48 можно получить временные задержки длительностью от 80 мкс до 20 мс. Например, для реализации временной задержки длительностью 240 мкс необходимо выполнить следующие действия: MOV A,#NOT(240/80-1) ; загрузка таймера MOV T,A STRT T ; запуск таймера EN TCNTI ; разрешение прерывания Появление сигнала прерывания от таймера соответствует истечению временного интервала 240 мкс. Погрешность будет составлять 7,5 мкс (время выполнения команды передачи управления по вектору прерывания и команды STOP TCNT). В задачах управления часто возникает необходимость измерения промежутка времени между двумя событиями. Обычно события в объекте управления представляются сигналами от двоичных датчиков. Считая событиями фронт и спад импульса, можно определять временные характеристики импульсных сигналов: длительность, период и скважность. Кроме того, с помощью процедуры MEASURE можно определять скорость перемещения подвижного органа объекта по эталонному (заданной длины) участку. Начало и конец участка должны быть снабжены датчиками (концевыми выключателями). Простейшим способом измерения длительности импульса является программный. Для обнаружения событий (фронт и спад импульсного сигнала) в этом случае используются типовые процедуры WAIT, а отсчет времени ведется программным способом. Для "положительного" импульсного сигнала, поступающего на вход Т0, программа измерения его длительности будет иметь вид MSCONT: MOV R7,#0 ;сброс счетчика WAITO: JNT0 WAITO ;ожидание фронта сигнала COUNT: INC R7 ;инкремент счетчика JT0 COUNT ;ожидание спада сигнала После выхода из процедуры содержимое счетчика (R7) пропорционально длительности импульса. Для нормальной работы этой прог-
- 27 раммы необходимо, чтобы обращение к ней производилось в моменты, когда на входе Т0 присутствует сигнал нулевого уровня. Верхний предел измеряемой длительности "положительного" импульса составит 255(1+2)*2.5 мкс = 8.925 мс. Этот предел может быть увеличен включением в цикл COUNT дополнительных команд NOP. Максимальная погрешность измерений 7.5 мкс. Для измерения длительности сигнала может быть использован таймер. При необходимости измерения временных интервалов большей длительности можно программным способом подсчитывать число переполнений от таймера, т.е. расширять его разрядность за счет рабочего регистра или ячейки РПД. 3.4. Ввод информации с клавиатуры Для обслуживания клавиатур в МК-системах используются две процедуры: опрос состояния клавиатуры и ввод кода нажатой клавиши. Первая процедура производит однократное обращение к матрице клавиш для определения, нажата ли хотя бы одна из клавиш. Вторая осуществляет циклический опрос клавиатуры до тех пор, пока не будет нажата (а часто и освобождена) клавиша. Будучи встроена в основную программу, вторая процедура блокирует процесс управления объектом на время ожидания нажатия клавиши, а потому обращение к ней осуществляется только при обнаружении нажатой клавиши процедурой опроса состояния клавиатуры. Вместо процедуры опроса состояния клавиатуры можно использовать аппаратные средства, формирующие сигнал внешнего прерывания для МК в случае нажатия любой клавиши. Процедуру ввода информации с некодирующей матричной клавиатуры удобно рассмотреть на примере клавиатуры 4х5, включающей 16 цифровых клавиш (0-F) и 4 управляющих. Структура матрицы клавиатуры аналогична структуре матрицы двоичных датчиков и способ подключения клавиатуры к МК представлен на рисунке. Причем линии порта 1 используются для сканирования, а линии порта 2 - для опроса матрицы клавиш. Каждая клавиша в такой матрице имеет свой номер, соответствующий ее местоположению. На цифровые клавиши можно нанести обозначения, соответствующие их кодам (от 0 до F). Коды управляющих клавиш больше 15.
- 28 ----T------¬ ----¬ ----¬ ----¬ ----¬ ¦МК ¦ P1.0 +---+ 0 +------+ 1 +------+ 2 +------+ 3 ¦ ¦ ¦ ¦ L-T-- L-T-- L-T-- L-T-¦ ¦ ¦ --+-¬ --+-¬ --+-¬ --+-¬ ¦ ¦ P1.1 +---+ 4 +------+ 5 +------+ 6 +------+ 7 ¦ ¦ ¦ ¦ L-T-- L-T-- L-T-- L-T-¦ ¦ ¦ --+-¬ --+-¬ --+-¬ --+-¬ ¦ ¦ P1.2 +---+ 8 +------+ 9 +------+ A +------+ B ¦ ¦ ¦ ¦ L-T-- L-T-- L-T-- L-T-¦ ¦ ¦ --+-¬ --+-¬ --+-¬ --+-¬ ¦ ¦ P1.3 +---+ C +------+ D +------+ E +------+ F ¦ ¦ ¦ ¦ L-T-- L-T-- L-T-- L-T-¦ ¦ ¦ --+-¬ --+-¬ --+-¬ --+-¬ ¦ ¦ P1.4 +---+10 +------+11 +------+12 +------+13 ¦ ¦ +------+ L-T-- L-T-- L-T-- L-T-¦ ¦ P2.0 +-----+ ¦ ¦ ¦ ¦ ¦ P2.1 +-----+----------+ ¦ ¦ ¦ ¦ P2.2 +-----+----------+----------+ ¦ ¦ ¦ P2.3 +-----+----------+----------+----------+ ¦ +------+ ---¬¦ ¦ ¦ ¦ ¦ ¦ ___ ¦ ¦ &+¦ ¦ ¦ ¦ ¦ ЗПР +-+ +-----------¦ ¦ ¦ ¦ ¦ ¦ +----------------------¦ ¦ ¦ ¦ ¦ +---------------------------------L---+------- L--Процедура ввода кода нажатой клавиши состоит из последовательности частных процедур (некоторые из них уже были рассмотрены ранее): сканирования матрицы клавиш, устранения дребезга контактов, ожидания освобождения клавиши и идентификация кода нажатой клавиши. Для некоторого типа клавиатур может отсутствовать процедура устранения дребезга контактов (клавиатуры на основе герконов). Процедуру сканирования иногда бывает удобно совместить с процедурой идентификации. Для программного ввода информации с некодирующих клавиатур характерен один недостаток, а именно - срабатывание по отпусканию клавиши, а не по нажатию. Однако при кратковременных нажати-
- 29 ях клавиш этот эффект не имеет особого значения. Рассмотрим отдельно каждую из перечисленных частных процедур. Частная процедура сканирования служит для обнаружения нажатой клавиши и последующей ее идентификации. Процедура сводится к поочередному обнулению каждой из линий сканирования и опросу линий возврата. В порт 1 выдается байт сканирования (БС), содержащий 0 только в одном бите. Если на пересечении линии сканирования и линии возврата находится нажатая клавиша, то в соответствующем бите байта возврата (БВ), принимаемого в порт 2, будет находиться 0. Последовательность байтов сканирования представляет собой код "бегущий нуль"; формирование очередного байта сканирования осуществляется путем сдвига его предыдущего значения. Направление сдвига определяет последовательность опроса клавиш. Если при полном цикле сканирования не было обнаружено нажатой клавиши, то процедура сканирования повторяется сначала. Оператор "Есть нажатая клавиша?" может быть реализован двумя способами: наложением маски или сдвигом. Первый способ подробно рассмотрен в типовой процедуре опроса группы импульсных датчиков. При втором способе клавиши, подключенные к каждой линии сканирования, анализируются последовательно. Если после анализа каждой клавиши осуществлять прибавление единицы к счетчику SCANCODE, то процедуру сканирования можно совместить с процедурой идентификации нажатой клавиши. После выхода из процедуры SCAN в SCANCODE будет находиться код нажатой клавиши. Кроме того, процедура SCAN осуществляет защиту от одновременного нажатия нескольких клавиш. Порядок анализа клавиш таков, что при одновременном нажатии клавиша с большим кодом игнорируется: ;R4 - счетчик кода сканирования SCAN: MOV R4,#0 ;сброс SCANCODE MOV R7,#5 ;загрузка счетчика сканирования MOV R6,#11111110B ;загрузка исходного байта ;сканирования LOOP: MOV A,R6 OUTL P1, ;вывод текущего байта скан. RL A ;сдвиг байта сканирования MOV R6,A ;сохранение текущего байта ;сканирования IN A,P2 ;ввод байта возврата MOV R5,#4 ;загрузка счетчиков запросов
- 30 ROTATE: RRC A ;сдвиг байта возврата JNC DBNC ;выход из процедуры при обнару;жении первой нажатой клавиши INC R4 ;инкремент SCANCODE DJNZ R5,ROTATE ;декремент счетчика опросов и ;цикл, если не нуль DJNZ R7,LOOP ;декремент счетчика сканирования ;и выход, если не нуль JMP SCAN ;начать сканирование сначала После выхода из процедуры SCAN управление передается частной процедуре устранения дребезга конрактов DBNC. Для того, чтобы при повторном обращении МК к клавиатуре не был введен код той же самой клавиши, вводится процедура ожидания освобождения. После выполнения сканирования активной осталась та линия сканирования, в которой обнаружена нажатая клавиша. Поэтому процедура ожидания освобождения нажатой клавиши сводится к считыванию и анализу байта возврата: WAITOP: IN A,P2 ;ввод байта возврата CPL A ;инверсия байта возврата JNZ WAITOP ;если клавиша нажата, то ждать Процедура WAITOP в том виде, в котором она приведена выше, может быть использована только в системах, защищенных от "залипания" контактов. Обнаружить "залипание" контакта можно путем подсчета "неудачных" опросов. Если число "неудачных" опросов превысило N и клавиша не была освобождена, выдается сообщение оператору о "залипании" контакта. Число N (и соответственно разрядность счетчика) определяется исходя из механических свойств клавиатуры. Каждой клавише клавиатуры должен быть поставлен в соответствие код (ее вес), являющийся функцией номеров линии сканирования (С) и линии возврата (В), на пересечении которых нажата клавиша. Процедура идентификации нажатой клавиши KEYW может быть совмещена с процедурой сканирования (как в рассмотренном выше примере). Тогда после выхода из процедуры SCAN в регистре SCANCODE будет размещен код нажатой клавиши. Для сложных клавиатур SCANCODE не всегда удается совместить с истинным весом клавиши. В этом случае необходима дополнительная перекодировка, которая выполняется табличным способом с использованием SCANCODE в качестве указателя.
- 31 Процедура KEYW может быть оформлена и как самостоятельная. В этом случае наиболее распространенный способ вычисления веса нажатой клавиши - аналитический в соответствии с выражением W=n*C+B, где n - количество линий возврата. Номера активных линий сканирования и возврата представлены в унитарном коде в виде байта сканирования и байта возврата. Поэтому процедура KEYW реализуется на основе процедур преобразования унитарного кода в двоичный и вычисления W. Кроме аналитического существует табличный способ определения кода нажатой клавиши. 3.5. Вывод и отображение информации Семисегментные индикаторы (ССИ) широко используются для отображения цифровой и буквенной информации. Семь отображающих элементов позволяют высвечивать десятичные и шестнадцатиричные цифры, некоторые буквы латинского и русского алфавитов, а также некоторые специальные знаки. Для засветки одного сегмента большинства типов СИИ необходимо обеспечить протекание через сегмент тока 10 - 15 мА при напряжении 2,0 - 2,5 В. Низкая нагрузочная способность МК не допускает прямого соединения с СИИ. В качестве промежуточных усилителей тока могут использоваться логические элементы серии К155 или интегральные схемы преобразователей кодов для управления СИИ. При использовании внешних (по отношению к МК) схем преобразователей кодов процедура индикации одного символа сводится к выдаче двоичного кода символа в соответствующий порт вывода МК. При программной перекодировке МК должен поставить в соответствие двоичному коду инициируемого символа определенный байт индикации (БИ), который и выдается в выходной порт. Перекодировку удобнее всего проводить табличным способом. Для этого байты индикации размещаются в смежных ячейках РПП в порядке возрастания исходных двоичных кодов символов. Такое расположение байтов индикации упрощает процесс перекодировки, так как в этом случае требуемый байт находиться в строке таблицы с номером, равным двоичному коду инициируемого символа: ; программа индикации символа на семисегментном индикаторе SYMBOL: MOV A,@R0 ; загрузка в аккумулятор ; кода символа ADD A,#CODTBL ; формирование адреса
- 32 ; байта индикации MOVP3 A,@A ; считывание байта индикации из ; таблицы OUTL P1,A ; выдача байта индикации на ; индикатор через порт 1 Приведенный фрагмент программы рассчитан на то, что гашение ССИ осуществляется при инициализации системы. Одновременно с этим в регистре R0 формируется адрес ячейки CODE, в которой хранится двоичный код индицируемого символа. INIT: ... ORL P2,#0FFH ; гашение индикатора MOV R0,#CODE ; загрузка в R0 адреса CODE 3.6. Задание по лабораторной работе Измерение и отображение временных интервалов Разработать программу работы микроконтроллера на основе схемы из лабораторной работы N3. Алгоритм работы должен реализовать следующие функции: - введенный с клавиатуры цифровой код представляет собой длительность импульса положительной полярности в миллисекундах, который выдается через один из портов микроконтроллера; - на один из входов микроконтроллера подается импульс положительной полярности, начало которого необходимо обнаружить, измерить его длительность и отобразить на блоке семисегментных индикаторов. Программа должна быть отлажена с использованием эмулятора. Литература 1. Однокристальные микроЭВМ.М.:МИКАП,1994.-400с. 2. Прангишвили И.В. Микропроцессоры и локальные сети микро-ЭВМ в распределенных системах управления.-М.: Энергоатомиздат,1985.282 с. 3. Сташин В.А., Урусов А.В., Мологонцева О.Ф. Проектирование цифровых устройств на однокристальных микроконтроллерах.-М.:Энергоатомиздат, 1990.-224с.