Справочник от Автор24
Поделись лекцией за скидку на Автор24

Методология проектирования микропроцессорных систем

  • 👀 1045 просмотров
  • 📌 1011 загрузок
  • 🏢️ ВлГУ им. Александра Григорьевича и Николая Григорьевича Столетовых
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Методология проектирования микропроцессорных систем» pdf
Владимирский государственный университет имени Александра Григорьевича и Николая Григорьевича Столетовых (ВлГУ) ПРОЕКТИРОВАНИЕ МИКРОПРОЦЕССОРНЫХ СИСТЕМ Конспект лекций (Дерябин В.М., Сташин В.В.) Оглавление Введение..........................................................................................................................................................................................4 1 Методология проектирования микропроцессорных систем...................................................................................................4 1.1 Системный этап........................................................................................................................................................................5 1.2 Выбор структуры МПС...........................................................................................................................................................5 1.3 Выбор микропроцессора.........................................................................................................................................................5 1.4 Разработка аппаратурной части МПС....................................................................................................................................5 1.5 Разработка системы ввода-вывода..........................................................................................................................................6 1.6 Разработка УСО.......................................................................................................................................................................6 1.7 Изготовление УСО...................................................................................................................................................................6 1.8 Система отладки.......................................................................................................................................................................6 1.9 Этап наладки аппаратуры........................................................................................................................................................7 1.10 Этап отладки основного и тестового программного обеспечения....................................................................................7 1.11 Этап комплексной отладки....................................................................................................................................................7 1.12 Этап оформления технической документации....................................................................................................................7 2 Средства разработки и отладки для однокристальных микроконтроллеров.........................................................................7 2.1 Внутрисхемные эмуляторы.....................................................................................................................................................7 2.2 Симуляторы............................................................................................................................................................................10 2.3 Отладочные мониторы...........................................................................................................................................................10 2.4 Платы развития.......................................................................................................................................................................10 2.5 Эмуляторы ПЗУ.......................................................................................................................................................................11 2.6 Отладочные микроконтроллеры...........................................................................................................................................12 2.7 Интегрированные среды разработки....................................................................................................................................12 3 Методика разработки прикладного программного обеспечения МК-систем.....................................................................13 3.1 Формализованный подход к разработке прикладных программ.......................................................................................13 3.2 Процедуры и подпрограммы.................................................................................................................................................15 3.3 Правила записи программ на языке ассемблера.................................................................................................................16 3.4 Ввод, редактирование, трансляция и отладка прикладных программ в кросс-системах разработки............................17 3.5 Отладка прикладного программного обеспечения микроконтроллеров...........................................................................18 4 Структурная организация и система команд микроконтроллера КМ1816ВЕ51.................................................................19 4.1 Структурная схема МК51......................................................................................................................................................19 4.2 Система прерываний..............................................................................................................................................................27 5 Примеры программ обработки данных в МК51....................................................................................................................30 5.1 Примеры использования команд передачи данных............................................................................................................30 5.2 Примеры использования команд арифметических операций............................................................................................32 5.3 Примеры использования команд логических операций.....................................................................................................33 6 Организация взаимодействия микроконтроллера с объектом управления..........................................................................34 6.1 Ввод информации с датчиков................................................................................................................................................34 6.2 Устранение дребезга контактов............................................................................................................................................36 6.3 Подсчет числа импульсов......................................................................................................................................................37 6.4 Опрос группы двоичных датчиков.......................................................................................................................................39 7 Вывод управляющих сигналов из МК.....................................................................................................................................41 7.1 Формирование статических сигналов..................................................................................................................................41 7.2 Формирование импульсных сигналов..................................................................................................................................41 8 Масштабирование.....................................................................................................................................................................42 9 Реализация функции времени..................................................................................................................................................42 9.1 Программное формирование временной задержки............................................................................................................42 9.2 Формирование временной задержки на основе таймеров.................................................................................................44 9.3 Измерение временных интервалов.......................................................................................................................................45 10 Преобразование кодов............................................................................................................................................................46 10.1 Простейшие преобразования..............................................................................................................................................46 10.2 Преобразования параллельных и последовательных кодов.............................................................................................48 11 Цифро-аналоговые и аналого-цифровые преобразования..................................................................................................49 11.1 Цифро-аналоговое преобразование....................................................................................................................................49 11.2 Аналого-цифровое преобразование....................................................................................................................................50 2 Основные термины и сокращения АЛУ АЦП БИС БПр БСА ВП ВПД ВПП ВСЭ ЖКИ ЗУ ИС КМОП МК МК51 МК52 МП МПК МПС МЦ ОЗУ ОМЭВМ ОС ПЗУ ПО РМП РПД РПП РРТС РСФ РУД РУС РУСТ СК СППЗУ ССП ТТЛ Т/С УАПП УСАПП УС УСО УУ УФ ПЗУ ЦАП ШИМ - Арифметико-логическое устройство - Аналого-цифровой преобразователь - Большая интегральная схема - Бенчмарковская программа - Блок-схема алгоритма - Внешняя память - Внешняя память данных - Внешняя память программ - Внутрисхемный эмулятор - Жидкокристаллический индикатор - Запоминающее устройство - Интегральная схема - Комплементарная структура металл-оксид-полупроводник - Микроконтроллер - Семейство совместимых с Intel 8051 микроконтроллеров - Семейство совместимых с Intel 8052 микроконтроллеров - Микропроцессор - Микропроцессорный комплект - Микропроцессорная система - Машинный цикл - Оперативное запоминающее устройство - Однокристальная микроЭВМ - Операционная система - Постоянное запоминающее устройство - Программное обеспечение - Регистр масок прерывания - Резидентная память данных - Резидентная память программ - Регистр режима таймеров/счётчиков - Регистр специальных функций - Регистр-указатель данных - Регистр-указатель стека - Регистр управления/статуса таймера - Счётчик команд - Стираемое постоянное запоминающее устройство - Слово состояния программы - Транзисторно-транзисторная логика - Таймер/счетчик - универсальный асинхронный приёмо-передатчик - Универсальный синхронно-асинхронный приёмо-передатчик - Управляющее слово - Устройство сопряжения с объектом - Устройство управления - Постоянное запоминающее устройство, стираемое ультрафиолетовым излучением - Цифроаналоговый преобразователь - Широтно-импульсная модуляция BCD СОМ-порт EEPROM - Binary-Coded Decimal (двоично-десятичный код) - Communications Port (коммуникационный порт) - Electrically Erasable Programmable Read-Only Memory (электрически стираемое перепрограммируемое постоянное запоминающее устройство) - Personal Computer (персональный компьютер) фирмы IBM - Inter-Integrated Circuit (последовательная асимметричная шина) - Структура металл-оксид-полупроводник с n-каналом - Program Status Word (слово состояния программы) - Стандарт последовательного радиального интерфейса - Стандарт последовательного магистрального интерфейса - Stack Pointer (регистр-указатель стека) - Универсальный синхронно-асинхронный приёмо-передатчик (УСАПП) - Универсальный асинхронный приёмо-передатчик (УАПП) IBM PC IIC nМОП PSW RS-232 RS-485 SP USART UART 3 Введение Однокристальные микроЭВМ (ОМЭВМ) часто называют микроконтроллером (МК), так как их архитектура ориентирована на выполнение логических операций. Особенность архитектуры МК следующая: 1. Cтруктурно-логическая организация МК не является классической (фон-Неймановской), а именно, обращение к памяти данных и памяти программ осуществляется разными командами, а для обращения к внешней памяти данных и памяти программ используются разные сигналы. Кроме АЛУ, УУ, тактового генератора и регистров, МК содержит небольшую память данных, таймеры, массивы защёлок, сторожевой таймер, супервизор питания, параллельные порты (порт - это регистр с выводом во внешнюю среду), часы реального времени, ЦАП, АЦП с мультиплексором, контроллеры последовательных интерфейсов. 2. Особенности интерфейса: внешний интерфейс чрезвычайно узок, так как МК предназначен и эффективен только в том случае, если задача решается с помощью его внутренних ресурсов. Расширение системы возможно, но за счёт снижения быстродействия и использования большого числа внешних линий для организации магистрали. Управляющие сигналы для внешней памяти программ и памяти данных различны. 3. Систему команд МК можно считать полной, но она расширена не за счёт арифметических команд, а за счет команд логической обработки данных (побитовой). Существуют разные команды для обращения и памяти данных, памяти программ и к портам, а также для обращения к внутренней и внешней памяти. Имеется группа команд, совмещающая операции ввода и вывода с логической обработкой информации. 1 Методология проектирования микропроцессорных систем Здесь рассматриваются этапы проектирования микропроцессорных устройств и систем. Для решения поставленной задачи целесообразно привлекать схемотехника, программиста и специалиста в отрасли для которой создается устройство. При разработке систем на основе МП (МПС) необходимо придерживаться определенных правил и рекомендаций, несоблюдение которых является причиной многих неудачных проектов. Возможны различные варианты построения МПС, каждому из которых будут соответствовать специфические подходы к проектированию: - простые МПС, разработка которых может выполнена одним специалистом; - МПС, требующие для разработки большие по составу группы. Модель процесса проектирования простых МПС представлена в форме сетевого графа. Средняя часть графа содержит четыре параллельных и в известных пределах независимых ветви: разработка и изготовление систем вводавывода; разработка остальной аппаратной части; разработка математического обеспечения; разработка тестового обеспечения, необходимого для проверки работоспособности МПС. 12 11 1 2 5 3 8 4 9 6 7 13 14 10 1 — системный этап, 2 — выбор структуры МПС, 3 — выбор МП, 4 — разработка аппаратурной части, или заказ ядра, 5 — разработка системы ввода-вывода, 6 — изготовление УСО, 7 — наладка аппаратуры, 8 — написание тестового и диагностического программного обеспечения, 9 — наладка диагностического программного обеспечения, 10 — наладка тестового программного обеспечения, 11 — написание основного программного обеспечения, 12 — отладка основного программного обеспечения, 13 — комплексная отладка, 14 — изготовление технической документации. В рассматриваемой модели в самом начале разработки предусмотрен системный этап, необходимый для детального изучения назначения системы. Следует обратить внимание на то, что системная разработка заканчивается до выбора МП, а не после. Определяющее значение для времени выполнения проекта имеет время изготовления плат процессора и памяти, или получения уже готовых плат. В последнем случае до поступления плат можно выполнить разра ботку и изготовление оборудования системы ввода-вывода (устройств сопряжения с объектом - УСО), необходимого для сопряжения МП с внешними объектами, и составить план его проверки. После получения плат процессора и памяти и изготовления МПС осуществляется двухступенчатая проверка. На первом этапе в память МПС загружаются диагностические программы для проверки работоспособности и настрой- 4 ки специализированного оборудования ввода-вывода. При правильном функционировании системы можно загрузить программы реального применения и, используя их совместно с оборудованием инструментальной системы, окончательно проверить работу МПС. 1.1 Системный этап. С самого начала должны быть определены и документированы основные характеристики разрабатываемого устройства (системы). Всякая неясность и неоднозначность обязательно приведут к последующим проблемам. Разработчики и изготовитель МПС могут интерпретировать характеристики не так, как заказчик, и это может привести к необходимости переделки всей уже выполненной работы. Результатом этого этапа должна быть структурная схема МПС. Очевидно, что здесь же должны быть определены все входные и выходные сигналы, их электрические и времен ные характеристики. Системный этап предполагает рассмотрение разрабатываемой МП-системы управления во взаимосвязи и взаимовлиянии с объектом управления, источниками питания и окружающей средой. При разработке простых МПС и МПС средней сложности желательно на этом этапе провести формализацию задания, чтобы форму задания функциональных характеристик заказчика заменить более удобной (привычной) для разработчика. Это может быть конкретизированное или формализованное описание, которое представляется для согласования заказчику. В результате должно быть достигнуто полное понимание и единое толкование этого документа и тер минов. В то же время можно внести предложения по улучшению разрабатываемой системы, которые могут заинтересовать заказчика. 1.2 Выбор структуры МПС. Выбор структуры МПС прост, но ответственен. Выбирать одномагистральную или многомагистральную структуру следует на основании анализа сложности, требуемого быстродействия и возможностей последующей модификации системы. Многие задачи могут быть решены однокристальным микроконтроллером (МК). 1.3 Выбор микропроцессора. Выбор МП – достаточно сложная процедура, при которой нужно учитывать множество факторов. Если, например, доступна только одна модель МП, то проблема выбора сводится к ответу на вопрос: можно ли построить МПС с требуемыми характеристиками на основе этого МП. При разработке МПС с предполагаемым большим объемом выпуска выбор, а затем проверка правильности принятого решения потребуют значительного времени. Одним из главных критериев при выборе МП является быстродействие. Время выполнения операции сложения в МП может служить лишь грубой оценкой. Наибольшая точность оценки, безусловно, может быть получена только из анализа использования МП в задачах, аналогичных предполагаемому применению. Самым распространенным методом такой оценки является использование бенчмарковских программ (БПр). БПр – это программа из смеси команд, которая по составу соответствует классу предполагаемой задачи для микропроцессора. Обычная длина БПр – (100…200) команд. В состав ее обязательно должны входить операции по вводу и выводу информации. В качестве БПр для задач, связанных с выполнением вычислений, могут, например, использоваться программы арифметической обработки. Важным достоинством процедуры выбора МП на основе БПр является то, что она не только определяет время решения задачи на конкретном микропроцессоре, но и вскрывает достоинства и недостатки его системы команд для заданной области применения. Предварительный просмотр сводной таблицы с характеристиками доступных микропроцессоров обычно позволяет выбрать 3–4 модели, которые в дальнейшем и следует исследовать на соответствие требованиям технического задания. Начинать анализ целесообразно с МП со средним быстродействием. Получив БПр от фирмы-производителя (или составив её самостоятельно), следует проверить её правильность на числовых примерах, а затем вычислить время её выполнения для трёх случаев: простейшего, среднего и наихудшего. Если проверка покажет, что БПр дает неудовлетворительные временные показатели, то следует использовать один из двух возможных подходов: – повторить разработку для этого же МП, но перераспределить при этом программные и аппаратурные средства таким образом, чтобы обеспечить требуемые характеристики по быстродействию; – выбрать более быстродействующий МП. Если быстродействие микро-ЭВМ превышает необходимое, то, значит, имеются возможности для сокращения аппаратурных затрат переложением функций соответствующего устройства на программные средства. При проектировании следует помнить, что большее быстродействие достигается и более дорогой ценой. 1.4 Разработка аппаратурной части МПС. Разработка аппаратурной части МПС должна начинаться с разработки ее процессора, поскольку в дальнейшем она может использоваться для проверки других устройств. Особенностью процессора МПС является его реализация на базе одной или нескольких стандартных БИС МПК, схема соединения и режимы работы которых регламентированы техническими условиями на этот МП. Поэтому разработка процессора складывается обычно из ряда этапов по разработке вспомогательного оборудования, которое позволяет упростить проверку и отладку процессора. Первым должен быть разработан и изготовлен генератор тактовых импульсов. Генератор может быть единственным элементом, необходимым для запуска МП. Если МПС будет реализована на большом числе ИС, а рабочая программа достаточно сложна, то потребуется разработка и изготовление пульта. Пульт должен иметь индикацию состояния адресной шины и шины данных. Наконец, необходимо предусмотреть средства для ввода данных и команд в ОЗУ непосредственно с пульта. Проверку следует начать в выполнения команды условного перехода, которая передает управление самой себе. Это позволит, во-пер- 5 вых, убедиться в работоспособности МП, во-вторых, исследовать временную диаграмму работы МП с помощью осциллографа. На основе памяти в 16 слов можно проверить выполнения всех команд, а позже проверить работоспособность остальной аппаратуры МПС. Запоминающие устройства занимают большую часть БИС МПС; их стоимость может составлять до 70 % аппаратурных затрат МПС. В систему памяти входят внутренние и внешние ЗУ. Обычный состав внутренней памяти – несколько БИС постоянных, полупостоянных и оперативных ЗУ. Различные БИС ЗУ подключаются одинаковым образом к шинам адреса и данных, их количество ограничено нагрузочной способностью шин; однако в состав МПК входят буферные схемы, позволяющие снять эти ограничения. Программы МПС и константы, как правило, хранятся в ПЗУ как в наиболее надежном и дешевом типе памяти. Отладка программ должна проводиться при использовании оперативного или полупостоянного ЗУ (обычно флэш). 1.5 Разработка системы ввода-вывода. Характеристики МПС в значительной степени определяются организацией обмена информацией между МП, основной памятью и внешними устройствами. Сложность этого этапа обуславливается тем, что связь БИС, входящих в МПК, обычно функционально и структурно строго регламентирована руководящими техническими материалами. Специфика МПС, предназначенной для конкретного применения, определяется исключительно внешними устройствами МПС и их связью с МП и основной памятью. На аппаратуру, обеспечивающую этот интерфейс, в некоторых случаях приходится от 60 до 80 % общих аппаратурных затрат. В функции интерфейса обычно входят операции по дешифрации адреса устройства, синхронизации обмена; согласование информационных и управляющих сигналов, дешифрация кода команды, генерирование запросов на прерывание процессора и др. Использование более эффективных методов обмена с помощью системы прерываний или режима прямого до ступа в память связано с введением дополнительных аппаратурных затрат и поэтому должно быть оправдано требованиями конкретного применения МПС. Если от системы прерываний требуется выбор одного из нескольких внешних устройств, то она может быть предельно упрощена за счет программной реализации ее функций. При больших объёмах передаваемой информации удельный вес затрат времени и памяти на вход в режим прерывания и выход из него становится слишком большим, в таких случаях может оказаться более эффективным режим прямого доступа в память. Разработка средств обеспечения обмена информацией заключается в выборе способа передачи информации, определении методов реализации отдельных функций канала и покрытии структурных решений компонентами какой-либо системы элементов. 1.6 Разработка УСО. Сопряжение МП с объектом требует разнообразных преобразований сигналов. Как правило, имеется возможность использовать стандартные модули УСО. Широкая номенклатура УСО предлагается отечественными и зарубежными изготовителями, но электронная техника является бурно развивающейся отраслью в промышленности, предлагаемые модули могут не устраивать по цене, интерфейсу, техническим характеристикам, и вообще, необходимо поддерживать инженерное творчество. Основания для разработки УСО: – несмотря на широкий ассортимент УСО отечественного и зарубежного производства, требуется разработка новых типов УСО. Это происходит из-за следующих причин: а) метрологические характеристики отличаются от современных требований, б) интерфейс связи с микропроцессором отличается от требуемого; – стандартные модули УСО, как правило, универсальные. Универсальность обеспечивает массовость производства и невысокую цену. Специализированные УСО очень дорогие; – электронная техника бурно развивается, поэтому существующие и даже лучшие технические характеристики УСО могут быть достигнуты меньшей ценой, габаритами, массой, трудоемкостью изготовления и настройки с применением современной элементной базы. 1.7 Изготовление УСО. Изготовление УСО вручную допускается только для макетов. Изготовление УСО в единичном экземпляре или в малой серии необходимо заказывать на специализированном предприятии. Для этого необходимо подготовить всю техническую документацию в электронной форме. Некоторые фирмы имеют средства приобрести специальный станок для производства единичных и малосерийных печатных плат. 1.8 Система отладки. У многих разработчиков бытует неправильное мнение, что программное обеспечение может составляться без какой-либо аппаратуры. Уже на самых ранних этапах проектирования МПС совершенно необходимо иметь дополнительное оборудование для проверки и отладки программ. Очень часто программное обеспечение, разрабатываемое в конце, зависит от качества ранее разработанных программ. В качестве мощного вспомогательного средства в руках разработчика может быть выступать система отладки. В случае простой МПС системой отладки может быть микроЭВМ – прототип, дополненная некоторым оборудованием и программами для упрощения отладки. Важным элементом системы отладки программного обеспечения являются программы, моделирующие работу УСО. Использование моделирующих программ требует некоторых аппаратурных затрат. Во-первых, должны моделироваться все входные сигналы, во-вторых, необходимо контролировать все выходные сигналы, поэтому требуется их запоминание и вывод в удобной форме. 6 1.9 Этап наладки аппаратуры. Наладка аппаратуры МПС невозможна без диагностических программ. Диагностические программы разрабатываются под конкретную аппаратуру. Для диагностирования аппаратуры необходимы дополнительные устройства: тумблеры, светодиоды, приборы и т.п. 1.10 Этап отладки основного и тестового программного обеспечения. Отладка может производиться в симуляторе, но только до определённого момента, пока не потребуется участие аппаратуры разрабатываемой МПС. Но в этом случае аппаратуру можно смоделировать (если симулятор имеет такие средства). Более удобным средством является внутрисхемный эмулятор. Он, в отличие от симулятора, точно воспроизводит временные характеристики программ. Для наладки аппаратуры в сложных случаях требуется запоминающий осциллограф или сигнатурный анализатор. 1.11 Этап комплексной отладки. Этот этап предполагает пробную эксплуатацию изготовленной МПС сначала на решении заранее просчитанных тестовых задач. Если возможно, то производится пробная эксплуатация в реальных условиях. Приёмочные испытания - после системного этапа они следующие по ответственности. Для испытания готовится специальная программа, которая утверждается специальной организацией. Испытание контролируется независимыми экспертами. 1.12 Этап оформления технической документации. Этот этап готовится на протяжении всей разработки. На данном этапе все разделы технической документации собираются и оформляются. Содержание технической документации определяется техническим заданием. 2 Средства разработки и отладки для однокристальных микроконтроллеров В последнее время все большее распространение в прикладных системах получают однокристальные микроконтроллеры. Они отличаются от классических микропроцессоров тем, что на кристалле имеют память и периферийные устройства (последовательный канал, таймер, АЦП). Такая интеграция безусловно удобна — она решает множество практических проблем на аппаратном уровне, упрощает прикладное программирование. Однако применение однокристальных микроконтроллеров зачастую связано с дополнительными трудностями, возникающими в процессе разработки и отладки программ. Например, некоторые микроконтроллеры, имеющие встроенную память программ и дан ных, выпускаются в корпусах с малым количеством выводов и не имеют снаружи привычной шины адреса/данных, у них есть только линии портов ввода/вывода. Для построения простых малогабаритных устройств это хорошо, но возникает и масса вопросов: как отлаживать системы, содержащие эти микросхемы, как прогнать программу по шагам и еще много разных «как?». Данная статья является попыткой некоторой систематизации современных средств отладки прикладных систем. Она не претендует на полноту обзора, но в ней обозначены основные направления и тенденции в развитии средств разработки и отладки. В ситуации, когда разработка новой и не слишком тривиальной системы ведется без инструментальных средств отладки, разработчик, как правило, находится в положении стороннего наблюдателя, пытающегося понять и повлиять на поведение «черного ящика» — микроконтроллера, живущего своей жизнью. Не обладая такими средствами, соответствующими отлаживаемой системе, разработчик вынужден тратить много сил и времени на борьбу с неизбежными ошибками и сбоями, имеющими природу «реализации». И только используя инструментальные средства отладки, адекватные сложности разрабатываемой системы, разработчик имеет возможность сконцентрировать свои усилия на преодолении проблем «задачи», а не проблем «реализации», и рассчитывать на достижение требуемого и надежного функционирования разрабатываемой системы. К числу основных инструментальных средств отладки относятся: • внутрисхемные эмуляторы, • программные симуляторы, • платы развития (оценочные платы), • мониторы отладки, • эмуляторы ПЗУ, • отладочные версии микроконтроллеров, • внутрикристальные эмуляторы. Помимо перечисленных основных инструментальных средств отладки существуют также и комбинированные устройства и наборы, компенсирующие недостатки основных средств, взятых порознь. 2.1 Внутрисхемные эмуляторы. Внутрисхемный эмулятор — программно-аппаратное средство, способное замещать собой эмулируемый процессор в реальной схеме. Это наиболее мощное и универсальное отладочное средство. Хороший внутрисхемный эмулятор делает процесс функционирования отлаживаемого контроллера прозрачным, то есть легко контролируемым, произвольно управляемым и модифицируемым по воле разработчика. Функционально внутрисхемные эмуляторы делятся на две группы: стыкуемые с внешней вычислительной машиной (как правило, IBM PC) и работающие автономно. Автономные внутрисхемные эмуляторы имеют индивидуальные вычислительные ресурсы, средства ввода/вывода, не требуют для нормальной работы стыковки с какими-либо 7 внешними вычислительными средствами, но не лишены и некоторых недостатков: это или существенно более высокая цена, или пониженные функциональные и сервисные возможности по сравнению с аналогичными возможностями моделей, стыкуемых с IBM PC. Стыковка внутрисхемного эмулятора с отлаживаемой системой производится при помощи эмуляционного кабеля со специальной эмуляционной головкой, вставляемой вместо микроконтроллера в отлаживаемую систему. Если микроконтроллер нельзя удалить из отлаживаемой системы, то использовать эмулятор можно только в том случае, если этот микроконтроллер имеет отладочный режим, при котором все его выводы находятся в третьем состоянии. Тогда для подключения эмулятора используют специальный адаптер-клипсу, подключающийся непосредственно к выводам эмулируемого микроконтроллера. Эмулятор содержит следующие функциональные блоки: • узел эмуляции микроконтроллера; • эмуляционную память; • подсистему точек останова; • отладчик. Более сложные модели могут содержать дополнительно: • процессор точек останова; • трассировщик; • профилировщик (анализатор эффективности программного кода); • таймер реального времени; • программно-аппаратные средства, обеспечивающие возможность чтения и модификации ресурсов эмулируемого процессора «на лету»; • программно-аппаратные средства, обеспечивающие синхронное управление, необходимые для эмуляции в мультипроцессорных системах. Различные модели внутрисхемных эмуляторов могут предоставлять пользователю возможности по контролю функционирования отлаживаемых устройств и управлению их работой с разными ограничениями. Например, это может быть некорректное обрабатывание прерываний в пошаговом режиме или запрет на использование последовательного порта и т.п., что может рассматриваться как приемлемая либо как чрезмерная плата за предоставленные возможности. Однако необходимо иметь в виду, что для большинства широко используемых микроконтроллеров существуют доступные и для отечественных разработчиков внутрисхемные эмуляторы, которые не имеют ограничений по использованию каких-либо ресурсов отлаживаемых микроконтроллеров. 2.1.1 Отладчик. Отладчик является своеобразным мостом между разработчиком и отладочным средством. Состав и объем информации, проходящей через средства ввода/вывода, доступность ее для восприятия, контроля и при необходимости для коррекции и модификации напрямую зависят от свойств и качества отладчика. Хороший отладчик позволяет осуществлять: • загрузку отлаживаемой программы в память сие темы; • вывод на монитор состояния и содержимого всех регистров и памяти и при необходимости их модификации; • управление процессом эмуляции. Более мощные отладчики, обычно их называют высокоуровневыми (High-Level Debuggers), помимо этого позволяют: • вести символьную отладку благодаря тому, что отладчик «знает» адреса всех символьных переменных, массивов и структур (за счет использования специальной информации, поставляемою компилятором). При этом пользователь может оперировать более приемлемыми для человека символьными именами, не утруждая себя запоминанием их адресов; • контролировать, анализировать не только дисассемблированный текст, но и исходный текст программы, написанной на языке высокого уровня, даже с собственными комментариями. Такой отладчик позволяет пользователю одновременно контролировать ход выполнения программы и видеть соответствие между исходным текстом, образом программы в машинных кодах и состоянием всех ресурсов эмулируемого микроконтроллера. Следует отметить, что высокоуровневый отладчик выполняет все свои функции только в том случае, если используется кросс-компилятор, поставляющий полную и правильную отладочную информацию (не все компиляторы, особенно их пиратские версии, поставляют такую информацию). При этом формат ее представления должен быть «знаком» отладчику. 2.1.2 Эмуляционная память. Наличие эмуляционной памяти дает возможность ее использования в процессе отладки вместо ПЗУ в отлаживаемой системе и, более того, позволяет отлаживать программу без обращения к реальной системе или ее макету. При необходимости внесения изменений в отлаживаемую программу достаточно загрузить новую или модифицированную программу в память эмулятора вместо того, чтобы заниматься перепрограммированием ПЗУ. Некоторые модели эмуляторов позволяют пользователю «подставлять» вместо ПЗУ эмуляционную память не только целиком, но и поблочно (в некоторых моделях минимальный размер блока может достигать 1 байт), в порядке, определенном пользователем. Для этого пользователю достаточно задать распределение памяти данных и памяти программ, в соответствии с которым 8 процессор будет получать доступ и к содержимому ПЗУ в отлаживаемой системе, и к содержимому эмуляционной памяти внутрисхемного эмулятора. Такая память обычно называется памятью с возможностью мэппинга. 2.1.3 Трассировщик. Трассировщик представляет собой логический анализатор, работающий синхронно с процессором и фиксирующий поток выполняемых инструкций и состояния выбранных внешних сигналов. Существуют модели внутрисхемных эмуляторов, которые позволяют трассировать не только внешние сигналы, но и состояния внутренних ресурсов микроконтроллера, например регистров. Такие эмуляторы используют специальные версии микроконтроллеров (эмуляционные кристаллы). 2.1.4 Процессор точек останова. Процессор точек останова позволяет останавливать выполнение программы или выполнять иные действия, например, запускать или останавливать трассировщик при реализации заданных пользователем условий. В отличие от механизма обычных точек останова процессор позволяет формировать и отслеживать условия практически любой степени сложности. При этом эмулируемый процесс не выводится из масштаба реального времени. 2.1.5 Профилировщик. Профилировщик, или иначе анализатор эффективности программного кода, позволяет получить по результатам прогона отлаживаемой программы следующую информацию о количестве обращений к различным участкам программы и времени, затраченном на выполнение различных участков программы. Анализ статистической информации, поставляемой профилировщиком, позволяет легко выявлять «мертвые» или перенапряженные участки программ и в результате оптимизировать структуру отлаживаемой программы. Некоторые модели внутрисхемных эмуляторов могут предоставлять пользователям и другие дополнительные возможности, например построение необходимых для отладки мультипроцессорных систем многоэмуляторных комплексов, которые способны синхронно управлять (с одного компьютера) несколькими эмуляторами. Возможности «реального» внутрисхемного эмулятора можно проиллюстрировать на примере модели АСЕ-52С, разработанной фирмой «ФИТОН». 2.1.6 Основные характеристики АСЕ-52С. Эмулятор АСЕ-52С предназначен для отладки и тестирования аппаратуры и ПО-систем, выполненных на базе МК семейства INTEL MCS-51, и рассчитан на совместную работу с компьютерами IBM PC XT/AT/386/486/Pentium. Связь эмулятора с компьютером по последовательному каналу. Обеспечена точная эмуляция без использования каких-либо ресурсов МК. АСЕ-52С имеет 64К встроенной памяти программ и 64К памяти данных с возможностью мэппинга. В состав эмулятора входят аппаратные средства отладки систем реального времени: трассировщик и процессор точек останова. Дополнительно устанавливается аппаратный анализатор эффективности программного кода (Performance Analyzer). Возможна организация многоэмуляторных комплексов, ориентированных на отладку мультипроцессорных систем. В состав такого комплекса может входить от 2 до 15 эмуляторов, подключаемых на один СОМ-порт компьютера, причем помимо стандартных функций обеспечены режимы согласованного запуска и останова эмуляции: • эмуляция МК INTEL 80(031, 80(032, 8X(C)51, 8X(C)52, 80C51FX, 80C51GB, 8044, Philips 80C552, Atmel 89C2051 и всех существующих отечественных аналогов на частотах до 16 МГц; • эмуляция до 64К памяти программ и 64К внешней памяти данных; мэппинг блоками по 256 байт; • 128К безусловных точек останова по обращению к памяти программ, аппаратная поддержка пошагового режима для языков высокого уровня; • аппаратный трассировщик на 2048 фреймов; • аппаратный процессор точек останова; • аппаратный анализатор эффективности программного кода (Performance Analyzer); • опционально: синхронная работа до 15 эмуляторов на одном канале RS-232. 2.1.7 Программное обеспечение для АСЕ-52С. • Полная символьная отладка для ассемблеров и компиляторов «PLYM» и «С» фирм INTEL, AVOCET SYSTEMS, ARCHIMEDES SOFTWARE /IAR SYSTEMS, FRANKLIN SOFTWARE/KEIL ELECTRONIC • Гибкость управления — все действия можно выполнять, пользуясь: - командной строкой и разветвленным меню; функциональными клавишами F1...F10 и их комбинациями с [Control], [Shift] и [Alt]; возможностью непосредственно изменять любые данные на экране; манипулятором «мышь»; - клавиатурными макросами (как в редакторе Multi-Edit); - пакетными заданиями (подобно Batch-файлам в DOS); - пользовательским меню (наподобие User Menu в NC). • Гибкий многооконный интерфейс, позволяющий создавать оптимальные конфигурации экрана для своих проектов. • Поддержка многоэмуляторного (сетевого) режима работы. • Дополнительные возможности: переопределение раскладки клавиатуры; переназначение кнопок «мыши»; редактирование локальных меню в окнах. 9 Широкий набор функциональных возможностей делает внутрисхемные эмуляторы наиболее мощным и универсальным средством отладки. 2.2 Симуляторы. Симулятор — программное средство, способное имитировать работу микроконтроллера и его памяти. Как правило, симулятор содержит в своем составе отладчик, модель центрального процессора и памяти, модель встроенных устройств ввода/вывода. Загрузив программу в симулятор, пользователь может запускать ее в пошаговом или непрерывном режиме, задавать условные или безусловные точки останова, контролировать и свободно модифицировать содержимое ячеек памяти и регистров симулируемого микропроцессора. В зависимости от класса используемого отладчика различные симуляторы могут поддерживать высокоуровневую символьную отладку программ. Некоторые модели симуляторов могут содержать ряд дополнительных программных средств, например интерфейс внешней среды. Его наличие позволяет пользователю создавать и гибко использовать модель внешней среды микроконтроллера, функционирующую и воздействующую на отлаживаемую программу по заданному алгоритму. Во всех программных симуляторах исполнение программ, загруженных в симулятор, происходит в масштабе времени, отличном от реального. Однако возможность ведения отладки даже в условиях отсутствия макета отлаживаемого устройства делает программные симуляторы весьма эффективным средством отладки. Отдельно необходимо подчеркнуть, что существует целый класс ошибок, которые могут быть обнаружены только при помощи симулятора. 2.3 Отладочные мониторы. Отладочный монитор — специальная программа, загружаемая в память отлаживаемой системы. Она вынуждает процессор пользователя выполнять кроме прикладной задачи еще и отладочные функции: • загрузку прикладных кодов пользователя в свободную от монитора память; • установку точек останова; • запуск и останов загруженной программы в реальном времени; • проход программы пользователя по шагам; • просмотр, редактирование содержимого памяти и управляющих регистров. Программа монитора обязательно должна работать в связке с внешним компьютером или пассивным терминалом, на котором и происходят визуализация и управление процессом отладки. Повторим, что отладочные мониторы используют тот процессор, который уже стоит на плате пользователя. Достоинством этого подхода являются очень малые затраты при сохранении возможности вести отладку в реальном времени. Главный недостаток — отвлечение ресурсов микроконтроллера на отладочные и связные процедуры, например: монитор занимает некоторый объем памяти, прерывания, последовательный канал. Объем отвлекаемых ресурсов зависит от искусства разработчика монитора. В последнее время появились изделия, которые практически не занимают аппаратных ресурсов процессора. О них рассказано в разделе «Эмуляторы ПЗУ». 2.4 Платы развития. Платы Развития, или, как принято их называть в зарубежной литературе, оценочные платы (Evaluation Boards), являются своеобразными конструкторами для макетирования прикладных систем. В последнее время при выпуске новой модели кристалла микроконтроллера фирма-производитель обязательно изготавливает и соответствующую плату Развития. Обычно это печатная плата с установленным на ней микроконтроллером и всей необходимой для него стандартной обвязкой. На этой плате также устанавливают схемы связи с внешним компьютером. Как правило, там же имеется свободное поле для монтажа прикладных схем пользователя. Иногда имеется уже готовая разводка для установки дополнительных устройств, рекомендуемых фирмой, например ПЗУ, ОЗУ, ЖКИ-дисплей, клавиатура, АЦП и др. Кроме учебных или макетных целей такие доработанные пользователем платы выгодно использовать (экономия времени) в качестве одноплатных контроллеров, встраиваемых в малосерийную продукцию (5-20 шт.). Для большего удобства платы Развития комплектуются еще и простейшим средством отладки на базе монитора отладки. Здесь проявились два разных подхода: один используется для микроконтроллеров, имеющих внешнюю шину, а второй — для микроконтроллеров без внешней шины. В первом случае отладочный монитор поставляется фирмой в виде микросхемы ПЗУ, которая вставляется в специальную розетку на плате Развития. Плата также имеет ОЗУ для программ пользователя и канал связи с внешним компьютером или терминалом. Примером может служить плата Развития фирмы Intel для микроконтроллера 8051. Во втором случае плата Развития имеет встроенные схемы программирования внутреннего ПЗУ микроконтроллера, которые управляются от внешнего компьютера. Программа монитора просто заносится в ПЗУ микроконтроллера совместно с прикладными кодами пользователя. Прикладная программа при этом должна быть специально подготовлена: в нужные ее места вставляют вызовы отладочных подпрограмм монитора, затем осуществляют пробный прогон. Чтобы внести в программу исправления, пользователю надо стереть ПЗУ и произвести повторную запись. Готовую прикладную программу получают из отлаженной путем удаления всех вызовов мониторных функций и самого монитора отладки. Примерами могут служить платы Развития фирмы Microchip для своих PIC-контроллеров. Такой же принцип и у плат для отладки микроконтроллеров 80С750 Philips или 89С2051 Atmel. Иногда помимо монитора платы Развития комплектуются еще и программами отладки, которые запускаются на внешнем компьютере в связке с монитором. Эти программы в последнее время заметно усложнились и зачастую имеют высокопрофессиональный набор отладочных функций, например отладчик-симулятор или различные элементы, 10 присущие в чистом виде интегрированным средам разработки. В состав поставляемых комплектов могут входить и программы прикладного характера, наиболее часто встречающиеся на практике. Возможности по отладке, предоставляемые комплектом «плата Развития плюс монитор» безусловно не столь универсальны, как возможности внутрисхемного эмулятора, да и некоторая часть ресурсов микропроцессора во время отладки отбирается для работы монитора. Тем не менее, наличие законченного набора готовых программно-аппаратных средств, позволяющих без потери времени приступить к монтажу и отладке прикладной системы, во многих случаях является решающим фактором. Стоимость такого комплекта в несколько раз меньше более универсального эмулятора. В качестве примера приведем некоторые характеристики одной из плат Развития, выпускаемой фирмой «ФИТОН». 2.4.1 Контроллер-конструктор на базе Philips 80С552. Плата KIT-552 — полностью КМОП. Она предназначена для ускорения процесса создания и мелкосерийного тиражирования малогабаритных устройств, в том числе с батарейным питанием. Установленный на плате кристалл Philips 80С552 включает в себя аппаратно-программное ядро 8051 и множество полезных, часто используемых на практике аппаратных средств (см. 80С552). Схема KIT-552 позволяет подключать алфавитный ЖКИ и матрицу клавиш пользователя. Предусмотрены специальные режимы экономии питания. 2.4.2 Плата KIT-552. • Микроконтроллер Philips 80С552. • ПЗУ— от 8 до 32К. • ОЗУ- от 8 до 32К. • Интерфейс шины IIC. • EEPROM (подключено к PC) для энергонезависимого хранения данных объемом от 128 байт до 8 кбайт. • Последовательные каналы коммуникации: оптоизолированный интерфейс RS232 (1) для подключения к IBM PC или интерфейс RS-485 (2) для подключения к локальной сети. • Порт для подключения многострочных алфавитных ЖКИ со встроенным управлением на базе HD44780. Регулировка контраста. • Порт для подключения до 33 клавиш управления размещенных в узлах матрицы (113). Их замыкание вызывает прерывание или вывод процессор; из режима Power Down. • Автономный RC-таймер с настраиваемой выдержкой для периодического вывода процессора и; режима Power Down при мониторинге с низким энергопотреблением. • Питание платы от одного не стабилизированного источника 6-16 В (можно использовать стандартный сетевой адаптер). Допускается питание 4,6-6,0 В в обход встроенного стабилизатора. • токи потребления: Active - 25 мА, Idle - 3,7 мА (11 МГц); Active - 12 мА, Idle - 1,6 мА (4 МГц); Power Down - не более 30 мкА. • Общий размер — 140×69×16 мм. • Размер макетного поля 69×50 мм. 2.4.3 Микроконтроллер 80С552. • Тактовая частота — от 1,2 до 30 МГц. • Встроенное ОЗУ — 256 байт. • Два стандартных таймера Т0 и Т1. 16-битовый таймер Т2 со схемами аппаратного измерения интервалов времени по четырём каналам одновременно. Аппаратная генерация — до восьми диаграмм дискретных сигналов одновременно. • АЦП — 8 каналов, 10 бит, 37 мкс. • Два ШИМ-генератора с 8-бит разрешением. • Пять стандартных портов ввода/вывода. • Стандартный UART. • Аппаратный интерфейс шины PC. * Сторожевой таймер ТЗ. • Прерывания — 15 источников с двумя уровнями приоритета каждый. В комплект KIT-552 входит руководство по применению самой платы и всех установленных кристаллов. К руководству прикладывается дискета с исходными текстами программ-драйверов, предназначенных для обслуживания шины PC, EEPROM и последовательного канала RS-232. Имеются программы по форматному выводу на ЖКИ, обслуживанию клавиатуры и управлению режимами энергопотребления. Разработку и отладку прикладных программ рекомендуется производить с помощью внутрисхемного отладчика ICD-5132" или внутрисхемного эмулятора АСЕ-52" (с адаптером POD-552"). 2.5 Эмуляторы ПЗУ. Эмулятор ПЗУ — программно-аппаратное средство, позволяющее замещать ПЗУ на отлаживаемой плате и подставляющее вместо него ОЗУ, в которое может быть загружена программа с компьютера через один из стандартных каналов связи. Это устройство позволяет пользователю избежать многократных циклов перепрограммирования ПЗУ. Эмулятор ПЗУ имеет смысл только для микроконтроллеров, которые в состоянии обращаться к внешней памяти программ. Это устройство сравнимо по сложности и стоимости с платами Развития. Его главное достоинство — универсальность. Эмулятор ПЗУ может работать с любыми типами микроконтроллеров. 11 Ранние эмуляторы ПЗУ позволяли только загружать программу, запускать ее и останавливать, используя общий сброс. Затем появились усложненные модели с аппаратной выработкой на осциллограф сигналов трассировки по достижении определенного адреса. Эмулируемая память в таких изделиях была доступна для просмотра и модификации, но очень важный контроль за внутренними управляющими регистрами микроконтроллера был до недавнего времени невозможен. Однако появились модели интеллектуальных эмуляторов ПЗУ, которые позволяют «заглядывать» внутрь микроконтроллера на плате пользователя. Многие из них по возможностям управления отладкой стали похожими на внутри схемный эмулятор. Фирма Cactus даже представляет свой фактически интеллектуальный эмулятор ПЗУ как внутрисхемный эмулятор ряда микропроцессоров — настолько невозможно отличить работу одного от работы другого. В действительности процессор здесь не замещается, а используется тот, что стоит на плате пользователя. Интеллектуальные эмуляторы ПЗУ представляют собой совокупность устройств: обычного эмулятора ПЗУ, монитора отладки и схем быстрого переключения шины с одного на другой. Этим создается такой же эффект, как если бы монитор отладки был установлен на плате пользователя. При этом он не занимает у микроконтроллера никаких аппаратных ресурсов, кроме небольшой зоны программных шагов, примерно 4К. Например, такое устройство разработала фирма «Фитон» для всех существующих и будущих микроконтроллеров, которые имеют ядро от 8051, но дополнительно насыщены различными устройствами ввода/вывода. Это устройство поддерживает множество самых разных микроконтроллеров фирм Philips, Siemens, OKI. 2.6 Отладочные микроконтроллеры. Отладочные, или перепрограммируемые, микроконтроллеры — это микроконтроллеры, имеющие встроенное ПЗУ, допускающее многократное повторение цикла «программирование/стирание» (очистка ПЗУ). Не вдаваясь в технологические особенности, следует отметить, что наибольшее распространение в настоящее время имеют микропроцессоры, допускающие стирание содержимого ПЗУ ультрафиолетовым излучением (УФ ПЗУ), или электрически перепрограммируемые. Количество гарантированных циклов перепрограммирования для микропроцессоров с УФ ПЗУ определяется суммарным предельно допустимым уровнем излучения и колеблется от 100 до 200 раз. Количество гарантированных циклов перепрограммирования для микроконтроллеров с электрически перепрограммируемыми ПЗУ обычно не меньше 1 000 000 раз, время гарантированного сохранения информации не менее 10 лет. Технология применения отладочных микроконтроллеров без использования инструментальных средств отладки сводится к традиционному методу проб и ошибок. 2.7 Интегрированные среды разработки. Строго говоря, интегрированные среды разработки не относятся к числу средств отладки, тем не менее обойти вниманием данный класс программных средств, существенно облегчающий и ускоряющий процесс разработки и отладки микропроцессорных систем, было бы неправильно. При традиционном подходе начальный этап написания программы строится следующим образом. Исходный текст набирается при помощи какого-либо текстового редактора. По завершении набора работа с текстовым редактором прекращается и запускается кросс-компилятор. Как правило, вновь написанная программа содержит синтаксические ошибки, и компилятор сообщает о них на консоль оператора. • Вновь запускается текстовый редактор, оператор должен найти и устранить выявленные ошибки, При этом сообщения о характере ошибок, выведенные компилятором, уже не видны, так как экран занят текстовым редактором. • Этот цикл может повторяться не один раз. Если программа не слишком мала и тривиальна, собирается из различных частей, подвергается редактированию или модернизации, то даже этот начальный этап может потребовать очень много сил и времени программиста и снизить энтузиазм разработчика. Избежать большого объема рутины и существенно повысить эффективность процесса разработки и отладки позволяют появившиеся и быстро завоевывающие популярность так называемые интегрированные среды (оболочки) разработки (Integrated Development Environment, IDE). Как правило, хорошая интегрированная среда позволяет объединить имеющиеся средства отладки (внутрисхемный эмулятор, программный симулятор, программатор) и при этом обеспечивать работу программиста с текстами программ в стиле «турбо». Работа в интегрированной среде предоставляет программисту следующие возможности: • использовать встроенный многофайловый текстовый редактор, специально ориентированный на работу с исходными текстами программ. Диагностика выявленных при компиляции ошибок и исходный текст программы, доступный редактированию, выводятся одновременно в многооконном режиме; • организовать и вести параллельную работу над несколькими проектами. Менеджер проектов позволяет использовать любой проект в качестве шаблона для вновь создаваемого проекта. Опции используемых компиляторов и список исходных файлов проекта устанавливаются в диалоговых меню и сохраняются в рамках проекта, устраняя необходимость работы с неудобными batch-файлами. Перекомпиляции подвергаются только редактировавшиеся модули; • загружать отлаживаемую программу в имеющиеся средства отладки и работать с ними без выхода из оболоч ки; • подключать к оболочке практически любые программные средства. Подобные функциональные возможности в сочетании с дружественным интерфейсом в состоянии существенно облегчить жизнь разработчику и ускорить его работу. 12 3 Методика разработки прикладного программного обеспечения МК-систем 3.1 Формализованный подход к разработке прикладных программ. Если целевая функция контроллера сформулирована, т.е. задача на разработку поставлена, то для получения текста исходной программы необходимо выполнить ряд последовательных действий: 1) подробное описание задачи; 2) анализ задачи; 3) инженерную интерпретацию задачи, желательно с привлечением того или иного аппарата формализации (граф автомата, сети Петри, матрицы состояний и связности и т.п.); 4) разработку общей блок-схемы алгоритма (БСА) работы контроллера; 5) разработку детализированных БСА отдельных процедур, выделенных на основе модульного принципа составления программ; 6) детальную проработку интерфейса контроллера и внесение исправлений в общую и детализированные БСА; 7) распределение рабочих регистров и памяти МК; 8) формирование текста исходной программы. В результате работы по тем первым пунктам данного перечня получают так называемую функциональную спецификацию прикладной программы МК, в которой основное внимание уделяется детализации способов формирования входной и выходной информации. На языке схем алгоритмов разработчик описывает метод, выбранный для решения поставленной задачи. Довольно часто бывает, что одна и та же задача может быть решена различными методами. Способ решения задачи, выбранный на этапе ее инженерной интерпретации, на основе которого формируется БСА, определяет не тальк качество разрабатываемой прикладной программы, но и качественные показателем конечного изделия. Разработка БСА очень похожа на разработку аппаратурных средств систем автоматики и обработки данных. В основу разработки БСА положена та же самая процедура модульного проектирования, которая традиционно используется разработчиками аппаратурных средств. Отличие состоит в том, что при разработке аппаратурных средств в качестве “строительного “ материала используются логические схемы, триггеры, регистры, и другие интегральные элементы, а при создании программного обеспечения разработчик оперирует командами, подпрограммами. Таблицами и другими программными объектами из арсенала средств обработки данных. Так как алгоритм есть точно определенная процедура, предписывающая контроллеру однозначно определенные действия по преобразования “сырых” исходных данных в обработанные выходные данные, то разработка БСА требует предельной точности и однозначности используемой атрибутики: символических имен переменных, констант (установок), подпрограмм(модулей), символических адресов таблиц, портов ввода/вывода и т.т. Основное внимание при разработке БСА следует уделить тому разделу функциональной спецификации прикладной программы, в котором приводится описание аппаратуры сопряжения МК с объектом управления. (Это описание для успешной разработки программного обеспечения должно быть детализировано вплоть до электрических и временных характеристик каждого входного и выходного сигнала из устройства.). Секрет успеха разработки прикладной программы МК заключается в использовании метода декомпозиции, при котором вся задача последовательно разделяется на меньшие функциональные модули, каждый из которых можно анализировать, разрабатывать и отлаживать отдельно от других. При выполнении прикладной программы в МК управление без всяких двусмысленностей передается от одного функционального модуля к другому. Схема связности этих функциональных модулей, каждый из которых реализует некоторую процедуру, образует общую (или системную) БСА прикладной программы. Это разделение задачи на модули и субмодули выполняется последовательно до такого уров ня, когда разработка БСА модуля становится простым и понятным делом. Метод последовательной декомпозиции обладает достаточной гибкостью, что позволяет привести степень детализации БСА в соответствие со сложностью процедуры. Не следует стесняться при выполнении декомпозиции дойти до модулей, которые почти тривиальны. Ведь именно эту цель (получение очень простого и “прозрачного” алгоритма модуля) преследует разработчик, когда он стре мится заставить МК надежно выполнять требуемую работу по управлению объектом. Язык графических образов БСА можно использовать на любом уровне детализации описания модуля вплоть до того, что каждому оператору БСА будет соответствовать единственная команда МК. Структурное программирование есть процесс построения прикладной программы из строгого набора программных модулей, каждый из которых реализует определенную процедуру обработки данных. Программные модули должны иметь только одну точку входа и выхода. Только в этом случае отдельные модули можно разрабатывать и отлаживать независимо, а затем объединять в законченную прикладную программу с минимальными проблемами их взаимосвязей. Источником подавляющего большинства ошибок программирования является использование модулей, имеющих один вход и несколько выходов. При необходимости организации множественных ветвлений в программе декомпозицию задачи выполняют таким образом, чтобы каждый функциональный модуль имел только один вход и один выход. Для этого условные операторы (имеющие два выхода) или включают внутрь модуля, объединяя их с операторами обработки, или выносят в систему межмодульных связей, формируя тем самым БСА более высокого ранга. В международном стандарте на программный продукт HIPO (Hierarchy-Input-Process-Output)("хай-по") декларируется аналогичный подход к разработке прикладных программ. Разработка БСА функционального модуля программы имеет ярко выраженный итерактивынй характер, т.е. требует многократных проб, прежде чем возникает уверенность, что алгоритм реализации процедуры правильный и завер- 13 шенный. Вне зависимости от функционального назначения процедуры при разработке ее БСА необходимо придерживаться следующей очередности работы: 1. Определить, что должен делать модуль (это уже было сделано при разработке системной БСА, но теперь разработчик имеет дело с фрагментом прикладной программы, а не с целой программой, и, следовательно, может потребоваться доопределение и уточнение целевого назначения процедуры). 2. Определить способы получения модулем исходных данных (от датчиков через порты ввода, или из таблиц в памяти, или через рабочие регистры). Для реализации ввода исходных данных в модуль в его БСА надо включить соответ ствующие операторы. 3. Определить необходимость какой-либо предварительной обработки введенных исходный данных(маскирование, сдвиг, масштабирование, перекодировка). Если до использования “сырых” данных требуется их предобработка, то в состав БСА включаются соответствующие операторы. 4. Определить способ преобразования входных данных в требуемые выходные. Используя операторы процедур и условные операторы принятия решения, отобразить на языке БСА выбранный метод содержательной обработки исходных данных. 5. Определить способы выдачи из модуля обработанных данных (передать в память, или в вызывавшую программу, или в порты вывода информации). Необходимые действия отобразить в БСА. 6. Определить необходимость какой-либо постобработки выводимых данных (изменение формата, перекодирование, масштабирование, маскирование). Ввести в БСА операторы подготовки данных для вывода из модуля. 7. Вернуться к п.1 настоящего перечня работ и проанализировать полученный результат. Выполнить итеративную корректировку БСА с целью сделать ее простой, логичной, стройной и обладающей четким графическим образом. 8. Проверить работоспособность алгоритма на бумаге путем подстановки в него действительных данных. Убедиться в его сходимости и результативности. 9. Рассмотреть предельные случаи и попытаться определить граничные значения информационных объектов, с которыми оперирует алгоритм, за пределами которых он теряет свойства конечности, сходимости или результативности. (Особое внимание при этом следует уделить анализу возможных ситуаций переполнения разрядной сетки МК, изменения знака результата операции, деления на переменную, которая может принять нулевое значение.) 10. Провести мысленный эксперимент по определению работоспособности алгоритма в реальном масштабе времени, когда стохастические события, происходящие в объекте управления, могут оказать влияние на работу алгоритма. При этом самому тщательном анализу следует подвергнуть реакцию алгоритма на возможные прерывания с целью определения критических операторов, которые необходимо защитить от прерываний. Кроме того, в ходе этого мысленного эксперимента следует проанализировать логику алгоритма с целью определения таких последовательностей операторов, при выполнении которых МК может “не заметить” кратковременных событий в объекте управления. При обнаружении таких ситуаций в логику БСА следует внести коррективы. Практика разработки программного обеспечения для МК показали, что последовательное использование описанной поэтапной процедуры проектирования алгоритмов, составляющей основу метода структурного программирования, позволяет уверенно получать работоспособные прикладные программы. Дисциплинированное следование этой поэтапной процедуре проектирования прикладных программ обеспечивает успех проекта! В противном случае “Вы рискуете заболеть страшным программным заболеванием, которое называется “вползающие особенности”. Эта инфекция возникает тогда, когда неадекватная спецификация задачи позволяет вползать в программу организмам, называемым “изящные особенности”. Те изменения, которые легко учесть на этапе планирования, могут потребовать огромных усилий на этапе реализации программы. Болезнь эта к моменту обнаружения становится уже серьезной и приводит к фатальному концу много программных проектов. Чаще всего носителями этой болезни являются профессиональные программисты, которые способны заразить ею программирующих профессионалов. Если Вы стали жертвой “вползающих особенностей”, то должны или начать заново разрабатывать функциональную спецификацию программного обеспечения, или быть готовыми к исключительно высоким трудозатратам на этапе отладки прикладной программы. Преобразование разработанной БСА в исходный текст программы – дело несложное. Но прежде, чем приступить к написанию программы, необходимо специфицировать память и выбрать язык программирования. Спецификация памяти (рабочих регистров) заключается в определении адреса первой команды прикладной программы, действительных начальных адресов стека, таблиц данных, буферных зон передачи параметров между процедурами, подпрограмм обслуживания прерываний и т.д. при этом следует помнить, что в МК память программ и память данных физически и логически разделены. Диапазон языков написания исходного текста прикладной программы простирается от машинного кода до почти естественного языка. В машинном коде или на языке ассемблера программировать труднее и дольше, чем на алгоритмическом языке высокого уровня, но зато получается более короткий код программы, требуется меньшая емкость память памяти программы и выполняется такая программа быстрее. Объектные коды, полученные путем трансляции исходных программ, написанных на алгоритмическом языке высокого уровня, занимают в памяти МК-системы много больше мести и требуют большего времени на исполнение. Выбор языковых средств составления исходных программ в каждом конкретном применении зависит от характеристик прикладной задачи, опыта программиста и допустимых затрат на разработку. По нашему мнению, огромное большинство прикладных задач управления объектами вследствие того, что они должны решаться в реальном времени, предъявляет столь высокие требования по быстродействию, что для их решения 14 языковым средством написания прикладных программ еще долгие годы будет оставаться язык ассемблера. Это положение о преимущественном использовании языка ассемблера подкрепляется и тем обстоятельством, что однокристальные МК имеют ограниченный объем РПП и, следовательно, критичны к длине прикладных программ. 3.2 Процедуры и подпрограммы. При разработке МК-систем могут быть использованы два способа организации прикладных программ: монолитный и модульный. При первом способе вся прикладная программа МК разрабатывается как единое целое, а при втором строится из отдельных программных блоков, каждый из которых реализует некоторую процедуру обработки данных или управления. Взаимосвязь блоков определяется разработчиком при монтаже этих блоков БСА и законченной прикладной программы. Отдельные фрагменты прикладной программы МК могут быть получены в виде линейной последовательности блоков, другие (многократно используемые) обычно оформляются в виде подпрограмм, к которым прикладная программа, называемая основной, имеет возможность обратиться по мере необходимости. Подпрограмма должна обладать следующими свойствами: выполнять законченную процедуру обработки данных, иметь только один вход и один выход не обладать эффектом последействия, при котором текущее выполнение подпрограммы оказывало бы влияние на ее последующие выполнения. Вызов подпрограммы. Обращение к подпрограмме осуществляется по команде вызова CALL MARK, где MARK – символическое имя процедуры. Имя процедуры чаще всего используется в качестве метки, отмечающей одну из команд (чаще всего первую) подпрограммы. Для МК51 мнемоническое значение CALL является обобщенным и транслируется в одну из команд ACALL или LCALL в зависимости от адресного расстояния вызываемой подпрограммы. По команде CALL в стеке сохраняется значение счетчика команд, а возврат из подпрограммы осуществляется в то место основной программы, откуда был осуществлен вызов (к команде основной программы, следующей за командой CALL). Для этого любая подпрограмма должна заканчиваться командой возврата RET, осуществляющей восстановление содержимого счетчика команд из стека. Достаточно часто возникает необходимость такой организации вычислительного процесса, при которой подпрограмма вызывает другую подпрограмму, та в свою очередь вызывает следующую и т.д. Этот процесс называется сложение подпрограмм. Число подпрограмм, которые могут быть вызваны таким образом (глубина вложенности подпрограмм), ограничивается только емкостью стека. Сохранение параметров основной программы. Иногда при обращении к подпрограмме возникает необходимость сохранить не только адрес возврата в основную программу, но и содержимое отдельных рабочих регистров. Удобным способом для этого является переключение банка регистров. Например, если основная программа использует банк регистров. Например, если основная программа использует банк регистров 0, то подпрограмма может использовать банк регистров 1. Однако переключение банка регистров не обеспечивает сохранение содержимого аккумулятора, что приводит к необходимости создавать в одном из рабочих регистров или в РПД “копию” аккумулятора. Параметризуемые подпрограммы. Для успешной работы любой подпрограммы необходимо однозначно определить способ передачи в нее исходных данных и способ вывода результата ее работы. Подпрограмма, которой требуется дополнительная информация в виде параметров ее настройки или операндов, называется параметризуемой. Примером параметризуемой подпрограммы может служить подпрограмма временной задержки, если основной программе требуется реализация временных задержек различной длительности. Основная программа при этом должна обеспечить передачу в подпрограмму установок, обеспечивающих требуемое время задержки. Получили распространение три способа передачи параметров: через память, через регистры общего назначения и через регистр признаков. При передаче входных параметров через память основная программа обязательно содержит команды загрузки некоторых ячеек памяти. А подпрограмма – команды считывания из этих ячеек. При передаче выходных параметров подпрограмма должна загрузить некоторые ячейки памяти, а основная программа – считать. Передача параметров через регистры осуществляется аналогичным образом. Третий способ передачи параметров – через регистр признаков – удобно использовать при передаче выходных параметров (например, в подпрограммах сравнения чисел). В этом случае подпрограмма должна установить (или сбросить) соответствующие признаки, а основная программа – проанализировать их значение. В МК51 имеется 128 флагов пользователя, доступных для модификации и анализа. Кроме перечисленных способов передачи параметров в МК51 имеется еще возможность передачи параметров через стек. Этот способ, в частности, позволяет использовать в качестве параметра содержимое счетчика команд. Использование процедур, оформленных в виде подпрограмм, при разработке программного обеспечения имеет ряд достоинств. Прежде всего относительно простые модули, выделенные из сложной программы, могут программироваться несколькими разработчикам с целью сокращения времени проектирования. Еще более важным является то, что любая подпрограмма допускает автономную отладку. Это, как правило. Многократно сокращает время отладки всего прикладного программного обеспечения. И, наконец, механизм использования подпрограмм, реализующих требуемый набор процедур, уменьшает длину прикладной программы, что имеет своим следствием уменьшение требующейся емкости программ. Существенным является и то обстоятельство. Что отлаженные процедуры организуются разработчиками в библиотеки параметризуемых подпрограмм и могут быть многократно использованы в проектной работе. Отметим, что библиотека параметризуемых подпрограмм строится на основе соглашения о едином способе обмена параметрами. 15 3.3 Правила записи программ на языке ассемблера. Исходный текст программы на языке ассемблера имеет определенный формат. Каждая команда (и псевдокоманда) представляет собой четырехзвенной конструкции: МЕТКА: ОПЕРАЦИЯ ОПЕРАНДЫ ;КОММЕНТАРИЙ Звенья (поля) могут отделяться друг от друга произвольным числом пробелов. Метка. В поле метки размещается символическое имя ячейки памяти, в которой хранится отмеченная команда или операнд. Метка представляет собой буквенно-цифровую комбинацию, начинающуюся с буквы. Используются только буквы латинского алфавита. Ассемблер МК51 допускает использование в метках символа подчеркивания (_). Длина метки не должна превышать 31 символ. Метка всегда завершается двоеточием (:). Псевдокоманды ассемблера не преобразуются в двоичные коды, а потому не могут иметь меток. Исключение составляют псевдокоманды резервирования памяти и определения данных (DS, DB, DW). У псевдокоманд, осуще ствляющих определение символических имен, в поле метки записывается определяемое символическое имя, после которого двоеточие не ставится. В качестве символических имен и меток не могут быть использованы мнемокоды команд, псевдокоманд и операторов ассемблера, а также мнемонические обозначения регистров и других внутренних блоков МК. Операция. В поле операции записывается мнемоническое обозначение команды МК или псевдокоманды ассемблера, которое является сокращением (аббревиатурой) полного английского наименования выполняемого действия. Например, MOV (move) - переместить, JMP (jump) - перейти, DB (define byte) – определить байт. Для МК51 используется строго определенный и ограниченный набор мнемонических кодов. Любой другой набор символов, размещенный в поле операции, воспринимается ассемблером как ошибочный. Операнды. В этом поле определяются операнды (или операнд), участвующие в операции. Команды ассемблера могут быть без-, одно- или двухоперандными. Операнды разделяются запятой (,). Операнд может быть задан непосредственно или в виде его адреса (прямого или косвенного). Непосредственный операнд представляется с обязательным указанием префикса непосредственного операнда (#). Прямой адрес операнда может быть задан мнемоническим обозначением (IN A, P1), числом (INC 40), символическим именем. (MOV A, MEMORY). Указанием на косвенную адресацию служит префикс @. В командах передачи управления операндом может являться число (LCALL 0135H), метка (JMP LABEL), косвенный адрес (JMPP @A) или выражение (JMP $-2, где $ - текущее содержимое счетчика команд). Используемые в качестве операндов символические имена и метки должны быть определены, а числа представлены с указанием системы счисления, для чего используется суффикс (буква, стоящая после числа): В – для двоич ной, Q – для восьмеричной, D – для десятеричной и Н – для шестнадцатеричной. Число без суффикса по умолчанию считается десятичным. Обработка выражений в процессе трансляции. Ассемблер МК51 допускает использование выражений в поле операндов, значения которых вычисляются в процессе трансляции. Выражение представляет собой совокупность символических имени и чисел, связанных операторами ассемблера. Операторы ассемблера обеспечивают выполнение арифметических («+» - сложение, «-» - вычитание, «*» - умножение, «/» - целое деление, «MOD» – деление по модулю) и логических («OR» - ИЛИ, «AND» - И , «XOR» – исключа ющее ИЛИ, «NOT» - отрицание) операций в формате двухбайтовых слов. Например, запись ADD A,#((NOT 13)+1) эквивалентна записи ADD A,#0F3H и обеспечивает сложение содержимого аккумулятора с числом минус 13, представленным в дополнительном коде. Широко используются также операторы LOW и HIGH, позволяющие выделить младший и старший байты двухбайтнового операнда. Комментарий. Поле комментария может быть использовано программистом ля текстового или символического пояснения логической организации прикладной программы. Поле комментария полностью игнорируется ассемблером, а потому в нем допустимо использовать любые символы. По правилам языка ассемблера поле комментария начинается после точки с запятой (;). Псевдокоманды ассемблера. Ассемблирующая программа транслирует исходную программу в объектные коды. Хотя транслирующая программа берет на себя многие их рутинных задач программиста, таких как присвоение действительных адресов, преобразование чисел, присвоение действительных значений символьным переменным и т.п., программист все же должен указать ей некоторые параметры: начальный адрес прикладной программы, конец ассемблируемой программы, форматы данных и т.п. Всю эту информацию программист вставляет в исходный текст своей прикладной программы в виде псевдокоманд (директив) ассемблера, которые только управляют процессом трансляции и не преобразуются в коды объектной программы. Псевдокоманда ORG 10Н задает ассемблеру адрес ячейки памяти (10Н), в которой должна быть расположена следующая за ней команда прикладной программы. Псевдокомандой EQU можно любому символическому имени, используемому в программе. Поставить в соответствие определенный операнд. Например, запись: PET EQU 13 приводит к тому, что в процессе ассемблирования всюду, где встретиться символическое имя PET, оно будет заменено числом 13. 16 Символические имена операндов, переопределяемых в процессе исполнения программы, определяются псевдокомандой SET: ALFA SET 3 …… ALFA SET ALFA+1 Ассемблер позволяет определить символическое имя как адрес внутренних (псевдокоманда DATA), внешних (XDATA) данных или адрес бита (псевдокоманда BIT). Например, директива ERROR_FLAG BIT 25H,3 определяет символическое имя ERROR_FLAG как третий бит ячейки ОЗУ с адресом 25Н. Псевдокоманда DB обеспечивает занесение в память программ константы, представляющей собой байт. Псевдокомандой END программист дает команду ассемблеру указание об окончании трансляции. В результате трансляции должна быть получена карта памяти программ, где каждой ячейке памяти поставлен с соответствие хранящийся в ней код. В соответствии с форматом команд для представления их объектных кодов отводятся одна, две или три ячейки памяти программ. В первой ячейке всегда располагается код операции, во второй (а для МК51 и в третьей) – непосредственный операнд, адрес прямоадресуемого операнда, смещение. Для команд LCALL и LJMP во втором и третьем байтах объектного кода указывается адрес передачи управления (во втором – старшая часть, в третьем - младшая). 3.4 Ввод, редактирование, трансляция и отладка прикладных программ в кросс-системах разработки Написанием текста программы заканчивается первый этап разработки прикладного программного обеспечения – “от постановки задач к исходной программе” и начинается следующий – “от исходной программы к объектному модулю”. Для простых программ объектный код может быть получен вручную (ручная трансляция). Однако для более сложных программ требуются специальные средства автоматизации подготовки программ. Обычно такие средства используют большие емкости памяти и широкий набор периферийных устройств, в силу чего они не могут быть резидентными и используются только в кросс-режиме на универсальных мини-ЭВМ и микроЭВМ (СМ-1800, СМ-1810, СМ-4, ЕС-1841). В минимальный состав программного обеспечения кросс-средств входят: – системная программа для ввода исходного текста прикладной программы, его редактирования и записи на внешний носитель информации – так называемый редактор текстов, или символический редактор (наиболее распространенные названия CREDIT, EDITER, ED); – программа-транслятор, обеспечивающая преобразование исходного текста прикладной программы в объектный модуль (ASM48, ASM51). Более мощные кросс-средства предполагают наличие редактора внешних связей (LINK), позволяющего включать в программу модули, разработанные независимо друг от друга, и программу, обеспечивающую настройку переме щаемых программных модулей на абсолютные адреса (LOCATE). Для ввода исходного текста прикладной программы необходимо вызвать редактор текстов, указав ему тип но сителя, на котором будет создан исходный файл. Чаще всего в качестве носителя используется накопитель на гибком магнитном диске. Ниже приводится фрагмент диалога с микроЭВМ при подготовке программ в среде ДОС1800 на микроЭВМ СМ-1800, обеспечивающий создание исходного файла PROBL1 на гибком магнитном диске, расположенном на дисководе 1. Вызов редактора: -CREDIT:F1:PROBL1.ASM<> ISIS-II CRT-BASED EDITER VX.Y NEW FILE МАКРОФАЙЛ 3 ввод текста программы; запись созданного файла на дискету: ;ПОСЛЕДНЯЯ СТРОКА ПРОГРАММЫ<> 3<> *EX<> EDITED :F1:PROBA1.ASM Кросс-система автоматически выдает на экран выделенные сообщения. В двойных угловых скобках указаны мена функциональных клавиш, нажимаемых оператором. Для трансляции исходного текста программы необходимо вызвать транслятор, указав ему файл с исходным текстом, место размещения объектного кода, а также условия формирования и вывода листинга. Например, диалог -ASM48 :F1:PROBA1.ASM<> === DOS-MACRO ASSEMBLER === 17 обеспечивает формирование объектного кода в файле PROBL1.HEX и листинга в файле PROB1.LST на гибком магнитном диске. После окончания трансляции при отсутствии синтаксических ошибок выдается сообщение ASSEMBLY COMPLETE NO ERRORS или сообщение ASSEMBLY COMPLETE NNN ERRORS(LLL) с указанием числа ошибок (NNN) и номера последней ошибочной строки (LLL) при наличии синтаксических ошибок. Все обнаруженные ошибки исправляются в исходном тексте прикладной программы (это относится к ошибкам, обнаруженным на этапе отладки). Для этого необходимо вновь вызвать редактор текста и осуществить редактирование исходного текста программы, а затем выполнить повторную трансляцию. Если исходный текст прикладной программы не имел внешних ссылок и содержал директиву ORG, то после успешного завершения трансляции этап разработки программного обеспечения “от исходной программы к объектному модулю” можно считать законченным. 3.5 Отладка прикладного программного обеспечения микроконтроллеров После получения объектного кода прикладной программы неизбежно наступает этап отладки, т.е. установления факта ее работоспособности, а также выявления (локализации) и устранения ошибок. Без этого этапа разработки никакое программное обеспечение вообще не имеет права на существование. Отладка программного обеспечения представляет собой отдельную сложную задачу, которая почти не поддается формализации и требует для своего выполнения высокого профессионализма и глубоких знаний разработчика. Обычно отладка прикладного программного обеспечения осуществляется в несколько этапов. Простые (синтаксические) ошибки выявляются уже на этапе трансляции. Далее необходимо выполнить: – автономную отладку каждой процедуры в статическом режиме, позволяющую проверить правильность проводимых вычислений, правильность последовательности переходов внутри процедуры (отсутствие «зацикливания») и т.п.; – комплексную отладку программного обеспечения в статическом режиме, позволяющую проверить правильность алгоритма управления (по последовательности формирования управляющих воздействий); – комплексную отладку в динамическом режиме без подключения объекта для определения реального времени выполнения программы и ее отдельных фрагментов. Следует иметь в виду, что автономная отладка отдельных модулей настолько проще и эффективнее отладки всей прикладной программы, что переходить к этапу комплексной отладки целесообразно только после исчерпания всех средств автономной отладки. Вышеперечисленные этапы отладки осуществляются обычно с использованием кросс-систем. В состав кросс-систем входят программы-отладчики (обобщенное имя - DEBUG), интерпретирующие (моделирующие) выполнение программ, написанных для МК. Такие программные имитаторы позволяют эффективно отлаживать вычислительные процедуры, а также алгоритм функционирования контроллера. Разработчику предоставлен доступ к любому ресурсу МК, имеется возможность покомандного и пофрагментного исполнения программ и останова по условию, а также подсчета числа тактов выполнения тех или иных фрагмен тов программы, инициирования прерывания, дизассемблирования содержимого памяти программ и т.д. Кросс-отладчики позволяют промоделировать практически все возможные варианты работы программы и тем самым убедиться в ее работоспособности. На этом этапе возможна проверка работоспособности программы при нештатных ситуациях в условиях поступления некорректных входных воздействий (для применений с повышенными требованиями по безопасности). Наиболее мощные имитаторы должны позволять моделировать и среду обитания МК, т.е. различного рода объекты и датчики, подключаемые к нему. При этом появляется возможность выполнять комплексную отладку программного обеспечения, не опасаясь, что возможные ошибки приведут к входу из строя технических средств разрабатываемой системы. Главным недостатком кросс-системы является невозможность прогона программы в реальном масштабе времени, т.е. со скоростью, близкой к скорости выполнения программ в самом МК, а также невозможность комплексирования аппаратурных и программных средств разрабатываемой системы. В силу этих причин достоверность прикладных программ, отлаженных в кросс-режиме недостаточно высока. Отдельные фрагменты программного обеспечения, требующие отладки в реальном времени, могут быть проверены на отладочном модуле. Отладочный модуль представляет собой небольшую, как правило, одноплатную микроЭВМ (правильнее, микроконтроллер), построенную на однотипном МК. Однако при отладке приходится учитывать ограничения, связанные с тем, что часть ресурсов отладочного модуля (пространство адресов памяти программ и памяти данных, некоторые линии портов и уровни прерываний) не может быть использована прикладным ПО, так как вынуждено используется резидентной операционной системой (ОС). Резидентная ОС, или Монитор, - это программа, обеспечивающая взаимодействие оператора с отладочным модулем и предоставляющая ему ряд команд, облегчающих отладку прикладного программного обеспечения. К отладочному модулю может быть также подключено дополнительное оборудование, необходимое разрабатываемой системе (внешняя память, порты, таймеры). Наиболее полная и комплексная отладка прикладного программного обеспечения совместно с аппаратурными средствами контроллера может быть произведена на инструментальной микроЭВМ с так называемым внутрисхемным эмулятором (ВСЭ). Прототип разрабатываемой системы через панельку (сокет) для установки МК плоским многожильным кабелем соединяется с ВСЭ, который в свою Очередь обеспечивает доступ ко всем техническим средствам инструментальной микроЭВМ. При этом почти все ресурсы МК остаются в распоряжении прикладного программного 18 обеспечения. Под управлением микроЭВМ ВСЭ позволяет прогонять прикладную программу или ее отдельные фрагменты в реальном темпе, останавливать выполнение программы по многим признакам, делать трассировку внешних сигналов МК и системы во время исполнения программы. Достоверность программного обеспечения, отлаженного на инструментальной микроЭВМ с помощью ВСЭ, высока, хотя и не равна единице. В любом случае для доводки прикладного программного обеспечения контроллера необходимы комплексные и всесторонние испытания разработанной системы в реальном окружении и во всевозможных режимах. 4 Структурная организация и система команд микроконтроллера КМ1816ВЕ51 Микроконтроллер семейства МК51 (КМ1816ВЕ51, прототип - Intel 8051) выполнен на основе nМОП технологии и выпускается в корпусе, имеющем 40 внешних выводов. Цоколевка корпуса МК51 и наименования выводов показаны на Рисунок 1. Для работы МК51 требуется один источник электропитания +5 В. Через четыре программируемых параллельных порта ввода/вывода МК51 взаимодействует со средой в стандарте ТТЛ-схем с тремя состояниями выхода. Корпус МК51 имеет два вывода для подключения кварцевого резонатора, четыре вывода для сигналов, управляющих режимом работы МК и восемь линий порта 3, которые могут быть запрограммированы пользователем на вы полнение специализированных (альтернативных) функций обмена информацией с внешней средой. Рисунок 1 - Цоколёвка корпуса МК51 и наименование выводов 4.1 Структурная схема МК51. Основу структурной схемы МК51 (Рисунок 2) образует внутренняя двунаправленная 8-битная шина, которая связывает между собой все основные узлы и устройства: резидентную память, АЛУ, блок регистров специальных функций, устройство управления и порты ввода/вывода. Рассмотрим основные элементы структуры и особенности организации вычислительного процесса в МК51. 19 Рисунок 2 - Структурная схема МК51 4.1.1 Арифметически-логическое устройство. 8-битовое АЛУ может выполнять арифметические операции сложения, вычитания, умножения и деления; логические операции И, ИЛИ, исключающее ИЛИ, а также операции циклического сдвига, сброса, инвертирования и т.п. В АЛУ имеются программно недоступные регистры Т1 и Т2, предназначенные для временного хранения операндов, схема десятичной коррекции и схема формирования признаков. Важной особенностью АЛУ является его способность оперировать не только байтами, но и битами. Отдельные программно-доступные биты могут быть установлены, сброшены, инвертированы, переданы, проверены и использованы в логических операциях. Эта способность АЛУ оперировать битами столь важна, что во многих описаниях МК51 говорится о наличие в нем «булевского процессора». Для управления объектами часто применяются алгоритмы, содер- 20 жащие операции над входными и выходными булевскими переменными (истина/ложь), реализация которых средствами обычных микропроцессоров сопряжена с определенными трудностями. Резидентная память программ (РПП) и внешнее расширение памяти программ (ВПП) адресуется 16-разрядным счетчиком команд (СК), так как в ВПП могут храниться константы, то к ней можно обратиться и через регистр указатель данных (РУД). Таким образом, АЛУ может оперировать четырьмя типами информационных объектов: булевскими: (1 бит), цифровыми (4 бита), байтовыми (8 бит) и адресными (16 бит). В АЛУ выполняется 51 различная операция пересылки или преобразования этих данных. Так как используется 11 режимов адресации (7 для данных и 4 для адресов), то путём комбинирования «операция/режим адресации» базовое число команд 111 расширяется до 255 из 256 возможных при однобайтном коде операции. При тактовой частоте 12 МГц время выполнения обычной команды 1 мкс. 4.1.2 Резидентная память. Память программ и память данных, размещенные на кристалле МК51 физически и логически разделены, имеют различные механизмы адресации, работают под управлением различных сигналов и выполняют разные функции. Память программ (ПЗУ или СППЗУ) имеет ёмкость от 4 до 64 Кбайт и предназначена для хранения команд, констант, управляющих слов инициализации, таблиц перекодировки входных и выходных переменных и т.п. РПП имеет 16-битовую шину адреса, которая обеспечивает доступ через счётчик команд или регистр-указатель данных. Последний выполняет функции базового регистра при косвенных переходах по программе или используется в командах, опе рирующих с таблицами. Память данных (ОЗУ) предназначена для хранения переменных в процессе выполнения прикладной программы, адресуется одним байтом и имеет емкость 128 байт. Кроме того, к адресному пространству РПД примыкают адреса регистров специальных функций (РСФ), которые перечислены в Таблица 1. Память программ, так же как и память данных, может быть расширена до 64 Кбайт путём подключения внешних БИС памяти. Таблица 1 - Блок регистров специальных функций Символ Наименование Адрес *АСС Аккумулятор 0Е0Н *B Регистр-расширитель аккумулятора 0F0H *PSW Слово состояния программы 0D0H SP Регистр-указатель стека 81Н DPTR Регистр-указатель данных DPH - старший байт 83Н DPL - младший байт 82Н *Р0 Порт 0 80Н *Р1 Порт 1 90Н *Р2 Порт 2 0А0Н *РЗ Порт 3 0В0Н *IP Регистр приоритетов 0В8Н *IE Регистр маски прерываний 0А8Н TMOD Регистр режима таймера/счетчика 89U *TCON Регистр управления/статуса таймера 88Н TH0 Таймер 0 (старший байт) 8СН TL0 Таймер 0 (младший байт) 8АН TH1 Таймер 1 (старший байт) 8DH TL1 Таймер 1 (младший байт) 8ВН *SCON Регистр управления приемопередатчиком 98Н SBUF Буфер приемопередатчика 99Н PCON Регистр управления мощностью 87Н Примечание - Регистры, имена которых отмечены знаком (*), допускают адресацию отдельных битов. 4.1.3 Аккумулятор и ССП. Аккумулятор является источником операнда и местом фиксации результата при выполнении арифметических, логических операций и ряда операций передачи данных. Кроме того, только с использованием аккумулятора могут быть выполнены операции сдвигов, проверка на ноль, формирование флага паритета и т.п. Архитектура, ориентирован- 21 ная на аккумулятор, эффективна только для последовательных алгоритмов, когда результат предыдущей операции используется сразу в последующей операции. При выполнении многих команд в АЛУ формируется ряд признаков операции (флагов), которые фиксируются в регистре ССП. В Таблица 2 приводится перечень флагов ССП, даются их символические имена и описываются условия их формирования. Таблица 2 - Формат слова состояния программы (ССП) Символ Позиция Имя и назначение С PSW.7 Флаг переноса. Устанавливается и сбрасывается аппаратурными средствами или программой при выполнении арифметических и логических операций AC PSW.6 Флаг вспомогательного переноса. Устанавливается и сбрасывается только аппаратурными средствами при выполнении команд сложения и вычитания и сигнализирует о пере носе или заёме в бите 3 F0 PSW.5 Флаг 0. Может быть установлен, сброшен или проверен программой как флаг, специфицируемый пользователем RS1 RS0 PSW.4 PSW.3 Выбор банка регистров. Устанавливается и сбрасывается программой для выбора рабочего банка регистров (смотри примечание) OV PSW.2 Флаг переполнения. Устанавливается и сбрасывается аппаратурно при выполнении арифметических операций - PSW.1 Не используется Р PSW.0 Флаг паритета. Устанавливается и сбрасывается аппаратурно в каждом цикле команды и фиксирует нечетное/четное число единичных бит в аккумуляторе, т.е. выполняет контроль по четности Примечание - Выбор рабочего банка регистров RS1 RS0 Банк Границы адресов банка 00Н - 07Н 1 1 08H - 0FH 1 2 10Н - 17Н 1 1 3 18Н - 1FH Наиболее «активным» флагом ССП является флаг переноса (С), который принимает участие и модифицируется в процессе выполнения множестве операций, включая сложение, вычитание и сдвиги. Кроме того, флаг переноса выполняет функции «булевого аккумулятора» в командах манипулирующих с битами. Флаг переполнения (OV) фиксирует арифметическое переполнение при операциях над целыми числами со знаком и делает возможным использование арифметики в дополнительных кодах. АЛУ не управляет флагами селекции банка регистров (RS0, RS1), их значение полностью определяется прикладной программой и используется для выбора одного из четырёх регистровых банков. Широкое распространение получило представление о том, что в микропроцессорах, архитектура которых опирается на аккумулятор, большинство команд работают с ним, используя адресацию «по умолчанию» (неявную). В МК51 дело обстоит иначе. Хотя процессор в МК51 имеет в своей основе аккумулятор, однако он может выполнять множество команд и без участия аккумулятора. Например, данные могут быть переданы из любой ячейки РПД в любой регистр, любой регистр может быть загружен непосредственным операндом и т.д. Многие логические операции могут быть выполнены без участия аккумулятора. Кроме того, переменные могут быть инкрементированы, декрементированы и проверены (test) без использования аккумулятора. Флаги и управляющие биты могут быть проверены и изменены аналогично. 4.1.4 Регистры-указатели. 8-битовый указатель стека (РУС) может адресовать любую область РПД. Его содержимое инкрементируется прежде, чем данные будут запомнены в стеке в ходе выполнения команд PUSH и CALL. Стек использует специальные команды: CALL - команда вызова подпрограммы, RET – команда возврата из подпрограммы, RETI – команда возврата из прерывания. Содержимое РУС декрементируется после выполнения команд POP и RET. Подобный способ адресации элементов стека называют прединкрементным/постдекрементным. В процессе инициализации МК51 после сигнала СБР в РУС автоматически загружается код 07Н. Это значит, что если прикладная программа не переопределяет стек, то первый элемент данных в стеке будет располагаться в ячейке РПД с адресом 08Н. DPTR - двухбайтный регистр-указатель данных (РУД) обычно используется для фиксации 16-битного адреса в операциях с обращением к внешней памяти. Командами МК51 регистр-указатель данных может быть использован или как 16-битный регистр, или как два независимых 8-битных регистра (DPH и DPL). DPTR = (DPH)(DPL). 22 4.1.5 Таймер/счетчик. В составе средств МК51 имеются регистровые пары с символическими именами TH0, TL0 и ТН1, TL1, на основе которых функционируют два независимых программно-управляемых 16-битных таймера/счетчика событий. Эти два независимых программно-управляемых 16-разрядных счётчика могут подсчитывать как сигналы внутреннего тактового генератора (после предварительного делителя частоты) в режиме таймера или подсчитывать внешние импульсы (поступающие на вывод микросхемы в режиме счетчика). 4.1.6 Буфер последовательного порта. UART - универсальный синхронно-асинхронный приёмо-передатчик (УСАПП), аппаратура которого автоматически принимает и передаёт байт данных по последовательному каналу: линии приёма RXD (Р3.0) и передачи TXD (P3.1). Регистр с символическим именем SBUF представляет собой два независимых регистра - буфер приёмника и буфер передатчика. Загрузка байта в SBUF немедленно вызывает начало процесса передачи через последовательный порт. Когда байт считывается из SBUF, это значит, что его источником является приёмник последовательного порта. В процессе приёма последовательной информации выставляется флаг приёма и вырабатывается запрос прерывания. 4.1.7 Регистры специальных функций. Регистры с символическими именами IP, IE, TMOD, TCON, SCON и PCON используются для фиксации и программного изменения управляющих битов и битов состояния схемы прерывания, таймера/счётчика, приёмо-передатчика последовательного порта и для управления мощностью электропитания МК51. Их организация будет описана ниже при рассмотрении особенностей работы МК51 в различных режимах. Для обращения к регистрам специальных функций (РСФ) отведена область резидентной памяти данных со 128 по 251 ячейки. В частности, в ячейках регистра специальных функций располагаются: аккумулятор А, расширитель аккумулятора В, таймер/счетчик, регистры масок, условий, порты. Область памяти, в которой расположены РСФ, доступна для побитового обращения. Отдельные биты этой области РПД имеют свои индивидуальные адреса. 4.1.8 Порты ввода/вывода информации. Все четыре параллельных порта МК51 предназначены для ввода или вывода информации побайтно или побитно. Расширенные версии имеют до шести портов. Схемотехника портов ввода/вывода МК51 для одного бита показана на Рисунок 3 (порты 1 и 2 имеют примерно такую же структуру, как и порт 3). Каждый порт содержит управляемые регистр-защелку, входной буфер и выходной драйвер. Рисунок 3 - Схемотехника портов ввода/вывода МК51: а - порт 0, б - порт 3 Выходные драйверы портов 0 и 2, а также входной буфер порта 0 используются при обращении к внешней памяти (ВП). При этом через порт 0 в режиме временного мультиплексирования сначала выводится младший байт адреса ВП, а затем выдается или принимается байт данных. Через порт 2 выводится старший байт адреса в тех случаях, когда разрядность адреса равна 16 бит. Все выводы порта 3 могут быть использованы для реализации альтернативных функций, перечисленных в Таблица 3. Альтернативные функции могут быть задействованы путем записи «1» в соответствующие биты регистра-защелки (РЗ.0-РЗ.7) порта 3. 23 Таблица 3 - Альтернативные функции порта 3 Символ Позиция Имя и назначение RD РЗ.7 Чтение. Активный сигнал низкого уровня формируется аппаратурно при обращении к ВПД WR РЗ.6 Запись. Активный сигнал низкого уровня формируется аппаратурно при обращении к ВПД Т1 РЗ.5 Вход таймера/счетчика 1 или тест-вход Т0 РЗ.4 Вход таймера/счетчика 0 или тест-вход INT0 РЗ.3 Вход запроса прерывания 1. Воспринимается сигнал низкого уровня или срез INT1 РЗ.2 Вход запроса прерывания 0. Воспринимается сигнал низкого уровня или срез TXD РЗ.1 Выход передатчика последовательного порта в режиме УАПП. Выход синхронизации в режиме сдвигающего регистра RXD РЗ.0 Вход приемника последовательного порта в режиме УАПП. Ввод/вывод данных в режиме сдвигающего регистра Порт 0 является двунаправленным, а порты 1, 2 и 3 — квазидвунаправленными. Каждая линия портов может быть использована независимо для ввода или вывода информации. К каждой линии порта 0 можно подключить две ТТЛ нагрузки, а к линиям портов 1, 2, 3 – по одной. Потребляемый входной ток не превышает 100 мкА. Для того чтобы некоторая линия порта использовалась для ввода, в D-триггер регистра-защёлки порта должна быть записана «1», которая закрывает МОП-транзистор выходной цепи. По сигналу СБР в регистры-защёлки всех портов автоматически записываются единицы, настраивающие их тем самым на режим ввода. Все порты могут быть использованы для организации ввода/вывода информации по двунаправленным линиям передачи. Однако порты 0 и 2 не могут быть использованы для этой цели в случае, если МК-система имеет внешнюю память, связь с которой организуется через общую разделяемую шину адреса/данных, работающую в режиме временного мультиплексирования. Запись в порт. При выполнении команды, которая изменяет содержимое регистра-защёлки порта, новое значение фиксируется в регистре в последнем цикле команды. Однако опрос, содержимого регистра-защёлки выходной схемой осуществляется в первом цикле команды и, следовательно, новое содержимое регистра-защёлки появляется на выходных контактах порта только в следующем машинном цикле. Нагрузочная способность портов. Выходные линии портов 1, 2 и 3 могут работать на одну ТТЛ-схему. Линии порта 0 могут быть нагружены на два входа ТТЛ-схем каждая. Линии порта 0 могут работать и на nМОП-схемы, однако при этом их необходимо подключать на источник электропитания через внешние нагрузочные резисторы за исключением случая, когда шина порта 0 используется в качестве шины адреса/данных внешней памяти. Входные сигналы для МК51 могут формироваться ТТЛ-схемами или nМОП-схемами. Допустимо использование в качестве источников сигналов для МК51 схем с открытым коллектором или открытым стоком. Однако при этом время изменения входного сигнала при переходе из 0 в 1 окажется сильно затянутым. Особенности работы портов. Обращение к портам ввода/вывода возможно с использованием команд, оперирующих с байтом, отдельным битом и произвольной комбинацией бит. При этом в тех случаях, когда порт является одновременно операндом и местом назначения результата, устройство управления автоматически реализует специальный режим, который называется «чтение-модификация-запись». В системе команд имеются команды, осуществляющие режим «чтение-модификация-запись», то есть выполняющие логическую обработку содержимого порта при выводе информации. Сказанное выше означает, что ввод информации с внешних выводов в аккумулятор производится без логической обработки по команде IN, причем для правильного ввода в регистре-защёлке должна содержаться единица. Этот режим обращения предполагает ввод сигналов не с внешних выводов порта, а из его регистра-защёлки, что позволяет исключить неправильное считывание ранее выведенной информации. Подобный механизм обращения к портам реализован в следующих командах: ANL - логическое И, например, ANL P1,А; ORL - логическое ИЛИ, например ORL Р2,А; XRL - исключающее ИЛИ, например XRL РЗ,А; JBC - переход, если в адресуемом бите единица, и последующий сброс бита, например JBC P1.1,LABEL; CPL - инверсия бита, например CPL РЗ.3; INC - инкремент порта, например INC P2; DEC - декремент порта, например DEC P2; DJNZ - декремент порта и переход, если его содержимое не равно нулю, например DJNZ P3,LABEL; MOV PX.Y, С - передача бита переноса в бит Y порта X; SETB PX.Y - установка бита Y порта X; CLR PX.Y - сброс бита Y порта X. 24 Совсем не очевидно, что последние три команды в приведённом списке являются командами «чтение-модификация-запись». Однако это именно так. По этим командам сначала считывается байт из порта, а затем записывается но вый байт в регистр-защёлку. Причиной, по которой команды «чтение-модификация-запись» обеспечивают раздельный доступ к регистру-защёлке порта и к внешним выводам порта, является необходимость исключить возможность неправильного прочтения уровней сигналов на внешних выводах. Предположим для примера, что линия Y порта Х соединяется напрямую с базой мощного транзистора и выходной сигнал на ней предназначен для управления им. Когда в данный бит записана «1», то транзистор включается. Если для проверки состояния исполнительного механизма (в нашем случае - мощного транзистора) прикладной программе требуется прочитать состояние выходного сигнала в том же бите порта, то считывание сигнала с внешнего вывода порта, а не из D-триггера регистра-защёлки порта, приведёт к неправильному результату: единичный сигнал на базе транзистора имеет относительно низкий уровень (около 1 В) и будет интерпретирован в МК как сигнал «0». Команды «чтение-модификация-запись» реализуют считывание из регистра-защёлки, а не с внешнего вывода порта, что обеспечивает получение правильного значения «1». 4.1.9 Таймер/счетчик. Два программируемых 16-битных таймера/счетчика (Т/С0 и Т/С1) могут быть использованы в качестве таймеров или счётчиков внешних событий, которые доступны по записи и чтению как два байта каждый. Установка режимов работы таймеров осуществляется командами записи соответствующих битов в специальный регистр (TMOD). У таймеров существует четыре режима работы. Состояние таймеров отображается в специальном регистре (TCON). Режимы работы определяют, какие импульсы будет считать счётчик (внутреннего генератора или внешнего), а также задает начало и окончание счёта. Регистр состояния указывает на переполнение счётчиков, а также имеет биты запроса преры вания от счётчиков по разным уровням, а также биты включения и выключения счётчиков. Таймеры могут использоваться для формирования временных задержек, генерирования периодических импульсов или прерываний, формирования таймаута. В семействе МК52 имеется третий таймер, который отличается большим количеством режимов работы и содержит кроме счётчика 16-разрядный регистр и 16-разрядный компаратор кодов. Этот таймер имеет выход из микросхемы. Это позволяет организовать аппаратное расширение счётчиков или формировать импульсные сигналы на выходе, в частности, ШИМ-сигналы. При работе в качестве таймера содержимое Т/С инкрементируется в каждом машинном цикле, т.е. через каждые 12 периодов генератора. При работе в качестве счётчика содержимое Т/С инкрементируется под воздействием перехода из «1» в «0» внешнего входного сигнала, подаваемого на соответствующий (Т0, Т1) вывод МК51. Опрос значения внешнего входного сигнала выполняется один раз в каждом машинном цикле. Содержимое счётчика будет увеличено на 1 в том случае, если в предыдущем цикле был считан входной сигнал высокого уровня (1), а в следующем — сигнал низкого уровня (0). Новое (инкрементированное) значение счётчика будет сформиро вано в цикле, следующем за тем, в котором был обнаружен переход сигнала из «1» в «0». Так как на распознавание перехода требуется два машинных цикла, то максимальная частота подсчёта входных сигналов равна 1/24 частоты генератора. На длительность периода входных сигналов ограничений сверху нет. Для гарантированного прочтения входного считаемого сигнала он должен удерживать значение «1» как минимум в течение одного машинного цикла МК51. Для управления режимами работы Т/С и для организации взаимодействия таймеров с системой прерывания используются два регистра специальных функций (РРТС и РУСТ), описание которых приводится в Таблица 4 и Таблица 5, соответственно. Как следует из описания управляющих бит РРТС, для обоих Т/С режимы работы 0, 1 и 2 одинаковы. Режимы 3 для Т/СО и Т/С1 различны. Рассмотрим кратко работу Т/С во всех четырёх режимах. Таблица 4 - Регистр режима работы таймера/счётчика Символ Позиция Имя и назначение GATE TMOD.7 для T/C1 Управление блокировкой. Если бит установлен, то таймер/счётчик «x» разрешен до тех TMOD.3 для T/C0 пор, пока на входе «INTx» высокий уровень и бит управления «TRx» установлен. Если бит сброшен, то T/C разрешается, как только бит управления «TRx» устанавливается C/T TMOD.6 для T/C1 Бит выбора режима таймера или счётчика событий. Если бит сброшен, то работает TMOD.2 для T/C0 таймер от внутреннего источника сигналов синхронизации. Если бит установлен, то работает счётчик от внешних сигналов на входе «Tx» М1 TMOD.5 для T/C1 Режим работы (смотри примечание) TMOD.1 для T/C0 М0 TMOD.4 для T/C1 TMOD.0 для T/C0 25 Примечание М1 М0 Режим работы «TLx» работает как 5-битный предделитель 1 16-битный таймер/счетчик. «THx»и «TLx» включены последовательно 1 8-битный автоперезагружаемый таймер/счётчик. «THx» хранит значение, которое должно быть перезагружено в «TLx» каждый раз по переполнению 1 1 Таймер/счётчик 1 останавливается. Таймер/счётчик 0: TL0 работает как 8-битный таймер/счётчик, и его режим определяется управляющими битами таймера 0. TH0 работает только как 8-битный таймер, и его режим определяется управляющими битами таймера 1 Таблица 5 - Регистр управления/статуса таймера Символ Позиция Имя и назначение TF1 TCON.7 Флаг переполнения таймера 1. Устанавливается аппаратурно при переполнении таймера/счетчика. Сбрасывается при обслуживании прерывания аппаратурно. TR1 TCON.6 Бит управления таймера 1. Устанавливается/сбрасывается программой для пуска/останова TF0 TCON.5 Флаг переполнения таймера 0. Устанавливается аппаратурно. Сбрасывается при обслуживании прерывания TR0 TCON.4 Бит управления таймера 0. Устанавливается/сбрасывается программой для пуска/останова таймера/счетчика IE1 TCON.3 Флаг фронта прерывания 1. Устанавливается аппаратурно, когда детектируется срез внешнего сигнала ЗПР1(INT1). Сбрасывается при обслуживании прерывания IT1 TCON.2 Бит управления типом прерывания 1. Устанавливается/сбрасывается программно для спецификации запроса ЗПР1 (срез/низкий уровень) IE0 TCON.1 Флаг фронта прерывания 0. Устанавливается по срезу сигнала ЗПР0. Сбрасывается при обслуживании прерывания IT0 TCON.0 Бит управления типом прерывания 0. Устанавливается/сбрасывается программно для спецификации запроса ЗПР0 (срез/низкий уровень) Режим 0. Перевод любого Т/С в режим 0 делает из него 8-битный счётчик, на вход которого подключен 5-битный предделитель частоты на 32. Работу T/C в режиме 0 на примере T/C1 иллюстрирует Рисунок 4,а. В этом режиме таймерный регистр имеет разрядность 13 бит. При переходе из состояния «все единицы» в состояние «все нули» устанавливается флаг прерывания от таймера TF1. Входной синхросигнал таймера 1 разрешён (поступает на вход T/C), когда управляющий бит TR1 установлен в «1» и, либо управляющий бит GATE (блокировка) равен «0», либо на внешний вывод запроса прерывания INT1 поступает уровень «1». Отметим попутно, что установка бита GATE в 1 позволяет использовать таймер для измерения длительности импульсного сигнала, подаваемого на вход запроса прерывания. Режим 1. Работа любого T/C в режиме 1 такая же, как и в режиме 0, за исключением того, что таймерный регистр имеет разрядность 16 бит. Режим 2. В режиме 2 работа организована таким образом, что переполнение (переход из состояния «все еди ницы» в состояние «все нули») 8-битного счетчика TL1 приводит не только к установке флага TF1 (Рисунок 4,б), но и автоматически перезагружает в TL1 содержимое старшего байта (ТН1) таймерного регистра, которое предварительно было задано программным путём. Перезагрузка оставляет содержимое ТН1 неизменным. В режиме 2 Т/С0 и Т/С1 работают совершенно одинаково. Режим 3. В режиме 3 Т/С0 и Т/С1 работают по-разному. Т/С1 сохраняет неизменным свое текущее содержимое. Иными словами, эффект такой же, как и при сбросе управляющего бита TR1 в ноль. Работу Т/С0 в режиме 3 иллюстрирует Рисунок 4,в. В режиме 3 TL0 и ТН0 функционируют как два независимых 8-битных счётчика. Работу TL0 определяют управляющие биты Т/С0 (C/T, GATE, TR0), входной сигнал INT0 и флаг переполнения TF0. Работу ТН0, который может выполнять только функции таймера (подсчёт машинных циклов МК), определяет управляющий бит TR1. При этом ТН0 использует флаг переполнения TF1. Режим 3 используется в тех случаях применения МК51, когда требуется наличие дополнительного 8-битного таймера или счётчика событий. Можно считать, что в режиме 3 МК51 имеет в своем составе три таймера/счетчика. В том случае, если Т/С0 используется в режиме 3, Т/С1 может быть или включен, или выключен, или переведён в свой собственный режим 3, или может быть использован последовательным портом в качестве генератора частоты передачи, или, наконец, может быть использован в любом применении, не требующем прерывания. 26 Рисунок 4 - Таймер/счётчик событий: а - Т/С1 в режиме 0: 13-битный счётчик; б - Т/С1 в режиме 2: 8-битный автоперезагружаемый счётчик; в - Т/СО в режиме 3: два 8-битных счётчика 4.2 Система прерываний. В МК51 возможны как внешние, так и внутренние прерывания. Для приёма внешних прерываний используются линии портов в альтернативном режиме. Количество внутренних прерываний зависит от числа встроенных узлов, запрашивающих прерывания. В базовом варианте пять внутренних прерываний, а в более сложных контроллерах в несколько раз больше. Внутренние прерывания вырабатываются таймером/счетчиком 0, таймером/счетчиком 1, последовательным портом. В контроллерах обычно существует два уровня приоритетов прерываний, устанавливаемых программно одним битом для каждого прерывания в регистре приоритетов прерываний – IP. Внутри каждого уровня приоритеты распределяются жёсткой логикой опроса источников (определены производителем). У системы прерываний имеется параметр: время отклика. Время отклика – это время, которое проходит между началом сигнала запроса прерывания и началом выполнения первой команды подпрограммы обслуживания прерывания. Это время случайное и оценивается в расчётах по максимальной величине. Оно складывается из времени завершения исполнения текущей команды (самая длинная команда умножения или деления составляет 48 машинных тактов) и времени исполнения аппаратной команды вызова подпрограммы по вектору (24 машинных такта). Прерывания могут быть запрещены (Disable) или разрешены (Enable) как все вместе, так и в раздельности и осуществляется это в регистре масок прерываний – IE. В нём имеется один бит разрешения/запрета (1/0) всех прерываний. Если этот бит установлен в единицу, то только тогда реализуются остальные биты регистра. По системному сбросу запрещены все прерывания. При входе в подпрограмму обслуживания прерывания автоматически запрещаются все прерывания низшего и текущего уровней. Если программист хочет разрешить прерывания, то он должен установить соответствующие биты в IE. Упрощенная схема прерываний МК51 показана на Рисунок 5. 27 Рисунок 5 - Схема прерываний МК51 Внешние прерывания INT0 и INT1 могут быть вызваны либо уровнем, либо переходом сигнала из «1» в «0» на входах МК51 в зависимости от значений управляющих бит IT0 и IT1 в регистре TCON. От внешних прерываний устанавливаются флаги IE0 и IE1 в регистре TCON, которые инициируют вызов соответствующей подпрограммы обслуживания прерывания. Сброс этих флагов выполняется аппаратурно только в том случае, если прерывание было вызвано по переходу (срезу) сигнала. Если же прерывание вызвано уровнем входного сигнала, то сбросом флага IE управляет соответствующая подпрограмма обслуживания прерывания путём воздействия на источник прерывания с целью снятия им запроса. Флаги запросов прерывания от таймеров TF0 и TF1 сбрасываются автоматически при передаче управления подпрограмме обслуживания. Флаги запросов прерывания RI и TI устанавливаются блоком управления УАПП аппаратурно, но сбрасываться должны программой. Прерывания могут быть вызваны или отменены программой, так как все перечисленные флаги программно-доступны и могут быть установлены/сброшены программой с тем же результатом, как если бы они были установлены/сброшены аппаратурными средствами. В блоке регистров специальных функций есть два регистра, предназначенных для управления режимом прерываний и уровнями приоритета. Форматы этих регистров, имеющих символические имена IE и IP описаны в Таблица 6 и Таблица 7, соответственно. Возможность программной установки/сброса любого управляющего бита в этих двух регистрах делает систему прерываний МК51 исключительно гибкой. Таблица 6 - Регистр масок прерывания (РМП) Символ Позиция Имя и назначение ЕА IE.7 Снятие блокировки прерываний. Сбрасывается программно для запрета всех прерываний независимо от состояний IE4 – IE0 - IE.6 IE.5 Не используются ES IE.4 Бит разрешения прерываний от УАПП. Установка/сброс программой для разрешения/запрета прерываний от флаговT1 или R1 ЕТ1 IE.3 Бит разрешения прерывания от таймера 1. Установка/сброс программой для разрешения/запрета прерываний от таймера 1 ЕХ1 IE.2 Бит разрешения внешнего прерывания 1. Установка/сброс программой для разрешения/запрета прерываний ЕТ0 IE.1 Бит разрешения прерывания от таймера 0. Работает аналогично IE.3 ЕХ0 IE.0 Бит разрешения внешнего прерывания 0. Работает аналогично IE.2 28 Таблица 7 - Регистр приоритетов прерываний Символ Позиция Имя и назначение - IP.7 - IP.5 Не используются PS IP.4 Бит приоритета УАПП. Установка/сброс программой для присваивания прерыванию от УАПП высшего/низшего приоритета РТ1 IP.3 Бит приоритета таймера 1. Установка/сброс программой для присваивания прерыванию от таймера 1 высшего/низшего приоритета РХ1 IP.2 Бит приоритета внешнего прерывания 1. Установка/сброс программой для присваивания высшего/низшего приоритета внешнему прерыванию INT1 РТ0 IP.1 Бит приоритета таймера 0. Работает аналогично IP.3 РХ0 IP.0 Бит приоритета внешнего прерывания 0. Работает аналогично IP.2 Флаги прерываний опрашиваются в начале каждого машинного цикла. Ранжирование прерываний по уровню приоритета выполняется в течение следующего машинного цикла. Система прерываний сформирует аппаратурно вызов (LCALL) соответствующей подпрограммы обслуживания, если она не заблокирована одним из следующих условий: 1) в данный момент обслуживается запрос прерывания равного или более высокого уровня приоритета; 2) текущий машинный цикл — не последний в цикле выполняемой команды; 3) выполняется команда RETI или любая команда, связанная с обращением к регистрам IE или IP. Отметим, что если флаг прерывания был установлен, но по одному из перечисленных выше условий не получил обслуживания и к моменту окончания блокировки уже был сброшен, то запрос прерывания теряется и нигде не запоминается. По аппаратурно сформированному коду LCALL система прерывания помещает в стек только содержимое счётчика команд (PC) и загружает в счётчик команд адрес вектора соответствующей подпрограммы обслуживания. По адресу вектора должна быть расположена команда безусловной передачи управления (JMP) к начальному адресу подпрограммы обслуживания прерывания. Подпрограмма обслуживания в случае необходимости должна начинаться командами записи в стек (PUSH) слова состояния программы (PSW), аккумулятора, расширителя, указателя данных и т.д. и заканчиваться командами восстановления их из стека (POP). Подпрограммы обслуживания прерывания обязательно завершаются командой RETI, по которой в счётчик команд перезагружается из стека сохраненный адрес возврата в основную программу. Команда возврата из прерываний Return Interrupt (RETI) восстанавливает состояние регистра масок прерываний. Команда RET также возвращает управление прерванной основной программе, но при этом не снимает блокировку прерываний, что приводит к необходимости иметь программный механизм анализа окончания процедуры обслуживания данного прерывания. Внешние прерывания могут быть вызваны как срезом внешнего сигнала, так и нулевым его уровнем в зависимости от установленного программистом режима. 29 5 Примеры программ обработки данных в МК51 5.1 Примеры использования команд передачи данных. Пример 01. Передать содержимое буфера SBUF универсального асинхронного приёмо-передатчика (УАПП) в резидентную память данных (РПД) по косвенному адресу из R0: MOV @R0,SBUF ; Передача принятого по последовательному каналу ; байта в РПД Пример 02. Загрузить в указатель данных начальный адрес 7F00Н массива данных, расположенного в ВПД: MOV DPTR,#7F00H ; Загрузка начального значения указателя данных Пример 03. Загрузить управляющее слово в регистр управления таймером: MOV TCON,#00000101B Пример 04. Сбросить все флаги пользователя (область РПД с адресами 20Н-2FН): MOV R0,#20H ; Задание начального адреса области флагов MOV R1,#0FH ; Счетчик (длина области флагов) LOOP: MOV @R0,#0 ; Сброс одного байта (8 флагов) INC R0 ; Переход к следующему байту DJNZ R1,LOOP ; Цикл Пример 05. Запомнить в ВПД содержимое регистров банка 0. Начальный адрес ВПД – 5000Н: MOV PSW,#01000B ; Выбор банка регистров 1 MOV R0,#8 ; Загрузка числа байтов (8) в счетчик MOV DPTR,#5000H ; Определение начального адреса ВПД MOV R1,#0 ; Определение начального адреса РПД LOOP: MOV A,@R1 ; Пересылка содержимого ячейки РПД, ; указанной R1, в аккумулятор MOVX @DPTR,A ; Пересылка из аккумулятора в ячейку РПД, ; указанную DPTR INC R1 ; Переход к следующему регистру INC DPTR ; Приращение указателя адреса ВПД DJNZ R0,LOOP ; R0=R0-1, если R0>0, то повторить Пример 06. Обращение к памяти программ. Часто необходимо иметь в памяти программ таблицы готовых решений. Для возможности работы с такими таблицами, хранящимися в РПП и ВПП, имеются специальные команды об ращения к памяти программ – MOVC. Поясним использование этих команд на следующем примере. Требуется составить подпрограмму вычисления синуса угла Х (Х меняется в пределах от 0 до 89 с дискретностью в 1). Наиболее быстрое вычисление функции можно получить путем выборки готового значения синуса из таблицы. Такая таблица для диапазона 0-89 займет 90 байтов при погрешности 0.4 %. Каждый байт таблицы будет содержать дробную часть двоичного представления синуса. Исходным параметром для подпрограммы служит значение угла Х, находящееся в аккумуляторе: ;ВЫЧИСЛЕНИЕ SIN(X) ПО ТАБЛИЦЕ ЗНАЧЕНИЙ ;ВХОД: (А) ← В ПРЕДЕЛАХ ОТ 0 ДО 89 ГРАДУСОВ ;ВЫХОД (А) ← ДРОБНАЯ ЧАСТЬ ЗНАЧЕНИЯ СИНУСА SIN: INC MOVC RET A A,@A+PC ; Инкремент аккумулятора ; Загрузка значения синуса из таблицы ; Возврат ;ТАБЛИЦА ЗНАЧЕНИЙ СИНУСА SINUS: DB ;SIN(0)=0 DB 00000100B ;SIN(1)=0.017 DB 00001001B ;SIN(2)=0.035 …… DB 11111111B ;SIN(89)=0.999 Примечательно, что данная программа обходится без использования указателя данных DPTR. Инкремент А перед обращением к таблице необходим из-за наличия однобайтной команды возврата, расположенной между командой MOVC и началом таблицы значений синуса. Пример 07. Операции со стеком. Механизм доступа к стеку МК51: перед загрузкой в стек содержимое регистра-указателя стека (SP) инкрементируется, а после извлечения из стека декрементируется. По сигналу системного сброса в SP заносится начальное значение 07Н. Для переопределения SP можно воспользоваться командой MOVSP, #1FН. Таким образом, стек может располагаться в любом месте РПД. Стек используется для организации обращений к подпрограммам и при обработке прерываний, может быть использован для передачи параметров подпрограмм и для временного хранения содержимого регистров специальных функций. Подпрограмма обработки прерывания должна сохранить в стеке содержимое тех регистров, которые она сама будет использовать, а перед возвратом в прерванную программу должна восстановить их значения. Подпрограмма обработки внешнего прерывания уровня 0 может, например, иметь следующую структуру: ORG 3 ; Задание адреса вектора прерывания SJMP SUBINO ; Переход на подпрограмму обработки ORG 30H SUBINO: PUSH PSW ; Сохранение в стек PSW PUSH ACC ; Сохранение аккумулятора PUSH B ; Сохранение В PUSH DPL ; Сохранение DPTR PUSH DPH MOV PSW,#1000B ; Выбор банка регистров 1 ……. ; В теле подпрограммы количество записей в стек ……. ; должно быть равно количеству чтений из стека POP DPH ; Восстановление DPTR POP DPL POP B ; Восстановление В POP ACC ; Восстановление аккумулятора POP PSW ; Восстановление PSW (в том числе и регистрового банка) RETI ; Возврат из подпрограммы обработки прерывания Если предположить, что SP перед возникновением прерывания содержал значение 1FН, то размещение регистров в стеке после входа в подпрограмму обработки будет таким, как на Рисунок 6. Рисунок 6 - Содержимое стека после выполнения команды CALL и серии команд PUSH Рисунок 7 - Протокол передачи и распределения битов порта 1 5.2 Примеры использования команд арифметических операций Пример 08. Сложить два двоичных многобайтных числа. Оба слагаемых располагаются в РПД, начиная с младшего байта. Начальные адреса слагаемых заданы в R0 и R1. Формат слагаемых в байтах задан в R2: CLR C ; Сброс переноса LOOP: MOV A,@R0 ; Загрузка в аккумулятор текущего байта первого слагаемого ADDC A,@R1 ; Сложение байтов с учетом переноса MOV @R0,A ; Размещение байта результате INC R0 ; Продвижение указателей INC R1 DJNZ R2,LOOP ; Цикл, если не все байты просуммированы При сложении чисел без знака на переполнение укажет флаг С, а в случае сложения чисел со знаком – фалг OV. Время суммирования составит (1+7N) мкс, где N – формат операндов в байтах. Пример 09. Умножение. Команда MUL вычисляет произведение двух целых беззнаковых чисел, хранящихся в регистрах А и В. Младшая часть произведения размещается в А, а старшая – в регистре-расширителе В. если содержимое В оказывается равным нулю, то флаг ОV сбрасывается, иначе – устанавливается. Флаг переноса всегда сбрасыва ется. Например, если аккумулятор содержал число 200 (0С8Н), а расширитель 160 (0А0Н), то в результате выполнения 32 команды MUL АВ, получится произведение 32000 (7D00Н). Аккумулятор будет содержать нуль, а расширитель – 7DH, флаг OV будет установлен, а флаг С – сброшен. Пусть требуется умножить целое двоичное число произвольного формата на константу 173. Исходное число размещается в РПД, адрес младшего байта находится в регистре R0. Формат числа в байтах хранится в регистре R1: MOV A,#0 ; Сброс аккумулятора LOOP: ADD A,@R0 ; Загрузка множимого MOV B,#173 ; Загрузка множителя MUL AB ; Умножение MOV @R0,A ; Запись младшего байта частичного произведения INC R0 ; Приращение адреса MOV A,B ; Пересылка старшего байта частичного произведения ; в Аккумулятор XCH A,@R0 ; Предварительное формирование очередного ; байта произведения DJNZ R1,LOOP ; Цикл, если не все байты исходного числа ; умножены на константу Полученное произведение размещается на месте исходного числа и занимает в РПД на один байт больше. Вре мя вычисления составляет (1+13N) мкс, где N - формат исходного числа в байтах. Пример 10. деление. Команда DIV позволяет производить деление содержимого аккумулятора на содержимое регистра-расширителя. После деления аккумулятор содержит целую часть частного, а расширитель – остаток. Флаги OV и С сбрасываются. При делении на нуль устанавливается флаг переполнения, а частное остается неопределенным. Команда деления может быть использована для быстрого преобразования двоичных чисел в двоично-кодированные (BCD- числа). В качестве примера рассмотрим программу, которая переводит двоичное число, содержащееся в аккумуляторе, в BCD-код. При таком преобразовании может получиться трехразрядное BCD-число. Старшая цифра (число сотен) будет размещена в регистре R0, а две младшие – в аккумуляторе: MOV B,#100 ; Загрузка 100 в «В» для вычисления количества сотен в числе DIV AB ; Аккумулятор содержит число сотен, т. е. старшую цифру MOV R0,A ; Пересылка в R0 старшей цифры XCH A,B ; Пересылка остатка исходного числа в аккумулятор MOV B,#10 ; Загрузка 10 в «В» для вычисления количества десятков в числе DIV AB ; Аккумулятор содержит число десятков, «В» - число единиц SWAP A ; Размещение числа десятков в старшей тетраде аккумулятора ADD A,B ; Подсуммирование остатка (числа единиц), теперь аккумулятор ; содержит две младшие цифры Время преобразования составляет 16 мкс. 5.3 Примеры использования команд логических операций для маскирования байтов Пример 11. Выбрать нулевой регистровый банк: ANL PSW,#11100111B ; Сброс битов RS1 и RS0 Пример 12. Установить биты 0-3 порта 1: ORL P1,#00001111B ; Запись «1» в Р1.0, Р1.1, Р1.2, Р1.3 Пример 13. Сбросить биты 0, 2,6 порта 2: ANL P2,#10111010B ; Сброс битов 0, 2,6 порта 2 Пример 14. Проинвертировать биты порта Р1, соответствующие единичным битам аккумулятора: XRL P1,A ; «Исключительно ИЛИ» порта 1 и аккумулятора Пример 15. Проинвертировать биты 7,6,5 порта 0: XRL P0,#11100000B ; «Исключительно ИЛИ» порта 0 и константы Пример 16. Проинвертировать биты 0-3 аккумулятора: XRL A,#0FH ; «Исключительно ИЛИ» аккумулятора и константы Пример 17. Управление группой бит порта. В РПД находится массив распакованных десятичных цифр. Требуется передать массив внешнему устройству в соответствии с протоколом, поясняемым Рисунок 7. для передачи четырех бит данных используются младшие линии порта 1. Линии Р1.4 и Р1.5 используются как сигналы квитирова ния. Передачу данных на выход МК сопровождает сигал на линии Р1.4. Внешнее устройство, приняв данные, сообщает об этом в МК сигналом на входе Р1.5. Биты Р1.6-Р1.7 в процессе передачи данных не должны изменять своего значения. Исходными параметрами для программы являются начальный адрес массива (R0) и длина массива (R1). Неиспользуемые в программе биты порта 1 необходимо сохранить в неизменном виде: ORL P1,#00100000B ; Настройка Р1.5 на ввод LOOP: MOV A,@R0 ; Загрузка байта в аккумулятор ANL P1,#11100000B ; Сброс данных и строба ORL P1,A ; Выдача данных ORL P1,#00010000B ; Выдача строба WAIT: JNB P1.5,WAIT ; Ожидание ответа 33 INC DJNZ R0 R1,LOOP ; Продвижение указателя адреса ; Цикл, если не все данные переданы 5.3.1 Примеры операций с битами: Пример 18. Программная реализация процедуры передачи байта последовательным кодом в МК51 реализуется так: MOV R7,#8 ; Инициализация счетчика циклов RRC A ; Присвоение флагу переноса значения бита А.0 MOV P1.0,C ; Передача бита DJNZ R7,LOOP ; Цикл, если не все биты переданы Время исполнения программы – 41 мкс, время передачи бита – 5 мкс (скорость 200 кбит/с). Пример 19. Вычислить булеву функцию трех переменных Y=XVW(XV). Переменные X,V и W поступают на лини 2, 1 и 0 порта 1, соответственно. Результат Y необходимо вывести на линию 3 порта 1: Y BIT P1.3 ; Спецификация битов порта 1 X BIT P1.2 V BIT P1.1 W BIT P1.0 LOOP: MOV C,X ; Ввод Х ANL C,/V ; X V MOV F0,C ; Запоминание результата в F0 MOV C,X ; Ввод Х ORL C,V ; XV ANL C,W ; W(XV) ORL C,F0 ; (W(XV))(X V) MOV Y,C ; Вывод результата Флаг F0 используется для промежуточного хранения первой конъюнкции XY. Время выполнения программы составляет 14 мкс. Пример 20. Организовать последовательную передачу данных из аккумулятора на нулевой вывод порта 2. Передачу необходимо вести в манчестерском коде (каждый бит передается двумя интервалами: первый интервал содержит инверсию бита, второй – прямое значение): MOV R0,#8 ; Инициализация счетчика битов LOOP: RRC A ; Перенос бита (A.0) в (C) CPL C ; Инверсия бита MOV P2.0,C ; Передача инверсного значения бита в линию 0 порта 2 CPL C ; Восстановление прямого значения бита NOP ; Три пустых команды для выравнивания NOP ; длительности интервалов NOP MOV P2.0,C ; Передача прямого значения бита в линию 0 порта 2 DJNZ R0,LOOP ; Цикл, если не все биты переданы Передача осуществляется младшими битами вперед. Длительность одного интервала равно шести машинным циклам (6 мкс), время передачи бита равно 12 мкс, время передачи байта – 96 мкс (скорость 83 Кбит/с или 10.4 КБайт/с). 6 Организация взаимодействия микроконтроллера с объектом управления 6.1 Ввод информации с датчиков. 6.1.1 Опрос двоичного датчика. Ожидание события В устройствах и системах логического управления объектами события в объекте управления фиксируются с использованием разнообразных датчиков цифрового и аналогового типов. Наибольшее распространение имеют двоичные датчики типа да/ нет, например концевые выключатели, которые подключаются к МК как показано на Рисунок 8. Ожидание статического сигнала. Типовая процедура ожидания события (WAIT) состоит из следующих действий: ввода сигнала от датчика, анализа значения сигнала и передачи управления в зависимости от состояния датчика. На Рисунок 9 представлена блок-схема алгоритма процедуры ожидания события, фиксируемого замыканием контакта двоичного датчика. Конкретная программа реализации процедуры зависит не только от типа МК, но и от того, каким образом датчик подключен к МК. Он может быть подключен к одной из линий портов МК или к специальным тестируемым входам (Т0, Т1, ЗПР0, ЗПР1). Например, при подключении датчика к линии бита 3 порта 1 (именуется Р3.1) программа реализации процедуры ожидания замыкания контакта будет иметь вид: WAITO: JNB P1.3,WAITO ; ожидание размыкания контакта датчика 34 Другим частным случаем типовой процедуры ожидания события является процедура ожидания замыкания контакта, которая может быть реализована следующим образом: WAITC: JB P1.3,WAITC ; ожидание замыкания контакта датчика Режим прерывания целесообразно использовать только для опроса особо важных датчиков с целью уменьшения времени реакции на исключительную (аварийную ) ситуацию в объекте управления. Рисунок 8 - Схема подключения двоичного датчика (а) и сигнал на его входе (б) Рисунок 9 - Блок-схема процедуры ожидания события 6.1.2 Ожидание импульсного сигнала. Схема подключения датчика импульсного сигнала аналогична схеме на Рисунок 8. Особенность процедуры ожидания импульсного сигнала состоит в том, что МК должен обнаружить не только факт появления, но и факт окон чания сигнала. Для программирования этой процедуры удобно использовать рассмотренные выше процедуры ожидания события, смонтировав их последовательно в линейную программу. Оформлять процедуры WAITC и WAITO в виде подпрограмм нецелесообразно, так как это удлиняет программу, а длина и, следовательно, время исполнения программы определяют длительность импульса, который может быть обнаружен программой. Последовательность склеивания процедур WAITC и WAITO зависит от формы импульса. Для «отрицательного» импульса ( 1→ 0 →1 ) процедура WAITC предшествует процедуре WAITO , для «положительного» ( 0 → 1 → 0 ) следует за ней. Ниже приведены примеры программной реализации процедуры ожидания «отрицательного» импульсного сигнала при подключении датчика к биту 3 порта 1 при условии, что начальное состояние входа – единичное: WAITC: JB P1.3,WAITC ; Ожидание Р1.3 = 0 WAITO: JNB P1.3,WAITO ; Ожидание Р1.3 = 1 Программная реализация цикла ожидания накладывает ограничения на длительность импульса: импульсы длительностью меньше времени выполнения цикла ожидания могут быть «не замечены» МК. Минимально допустимые длительности импульсов для различных способов подключения импульсного датчика к МК приведены в Таблица 8. Таблица 8 - Минимально допустимые длительности импульсов Способ подключения датчика к МК51 P1, P2, BUS/P0 T0, T1 ЗПР0, ЗПР1 Максимально допустимая длительность импульса отрицательного положительного 10/2 12,5/2 5/2 5/2 10/2 5/2 Для обнаружения кратковременных импульсов можно использовать способ фиксации импульса на внешнем триггере флага (Рисунок 10). На вход МК в этом случае поступает не кратковременный сигнал с датчика, а флаг, фор- 35 мируемый триггером. Триггер устанавливается по фронту импульса, а сбрасывается программным путем – выдачей специального управляющего воздействия. Длительность импульса при этом будет ограничена снизу только быстродействием триггера. Текст программы приведен ниже: FLAGIN: WAITC: ANL ORL JB ; Процедура ввода флага P2,#OFEH ; Формирование импульса сброса триггера P2,#01H P3.4,WAITC ; Ожидание прихода импульса на вход Т0 (Р3.4) Рисунок 10 - Схема фиксации короткого импульса на триггере флага Рисунок 11 - Схема подавления дребезга контактов с помощью RS-триггера 6.2 Устранение дребезга контактов. При работе МК с датчиками, имеющими механические или электромеханические контакты (кнопки, клавиши, реле, и клавиатуры), возникает явление, называемое дребезгом. Это явление заключается в том, что при замыкании контактов возможно появление отскока (BOUNCE) контактов, которое приводит к переходному процессу. При этом сигнал с контакта может быть прочитан МК как случайная последовательность нулей и единиц. Подавить это нежелательное явление можно схемотехническими средствами с использованием буферного триггера (Рисунок 11), но чаще это делается программным путем. Наибольшее распространение получили два программных способа ожидания установившегося значения: 1) подсчёт заданного числа совпадающих значений сигнала; 2) временная задержка. Схемы процедур подавления помех от дребезга контактов (DEBOUNCE) при вводе сигнала «0» показаны на Рисунок 12. 1. Суть первого способа состоит в многократном считывании сигнала с контакта. Подсчет удачных опросов (т.е. опросов, обнаруживших, что контакт устойчиво замкнут) ведется программным счетчиком. Если после серии удачных опросов встречается неудачный, то подсчет начинается сначала. Контакт считается устойчиво замкнутым (дребезг устранен), если последовало N удачных опросов. Число N подбирается экспериментально для каждого типа используемых датчиков и лежит в пределах от 5 до 50. Пример программного подавления дребезга контакта приводится для случая, когда датчик импульсного сигнала подключен к входу Т0 (Р3.4), счет удачных опросов ведется в регистре R3, N=20: DBNC: DBNC1: MOV JB DJNZ R3,#20 ; Инициализация счетчика P3.4,DBNC ; Если контакт разомкнут, то начать отсчет опросов сначала R3,DBNC1 ; Повторять пока R3 не станет равным 0 2. Устранение дребезга контакта путем введения временной задержки заключается в следующем. Программа, обнаружив замыкание контакта К, запрещает опрос состояния этого контакта на время, заведомо большее длительно сти переходного процесса. Программа, соответствующая блок-схеме процедуры на Рисунок 12,б, написана для случая подключения датчика к входу Т0 (Р3.4) и программной реализации временной задержки. Временная задержка (в пределах от 1 до 10 мс) подбирается экспериментально для каждого типа датчиков и реализуется подпрограммой DELAY. 36 Рисунок 12 - Блок-схемы процедур подавления дребезга контактов путём многократного считывания (а) и с использованием временной задержки (б) 6.3 Подсчет числа импульсов. Часто в управляющих программах возникает необходимость ожидания цепочки событий, представляемой по следовательностью импульсных сигналов от датчиков. Рассмотрим две типовые процедуры: подсчет числа импульсов между двумя событиями и подсчет числа импульсов за заданный интервал времени. 6.3.1 Подсчет числа импульсов между двумя событиями. Эту типовую процедуру удобно проиллюстрировать на конкретном примере. А) Реализуем программный счетчик импульсов между двумя событиями. Предположим, что необходимо подсчитать число деталей, сошедших с конвейера от момента его включения до момента выключения. Факт схода детали с конвейера фиксируется фотоэлементом, на выходе которого формируется импульсный сигнал (Рисунок 13) и подаётся на вход Т0 (Р3.4). Пусть R0 – счетчик деталей. Для простоты реализации программы считаем, что общее количество деталей не превышает 255: MOV R0, #0 ; Обнуление счётчика деталей; JB P3.4, $ ; Ожидание включения конвейера (P3.4 = 0); COUNT: JNB P3.5, $ ; Ожидание начала импульса (P3.5 = 1); JB P3.5, $ ; Ожидание завершения импульса (P3.5 = 0); INC R0 ; Инкремент счетчика деталей; JNB P3.4, COUNT ; Продолжить, если конвейер включен (P3.4 = 0). EXIT: …… ; Выход из процедуры По окончании выполнения процедуры в регистре R0 фиксируется число деталей, представленное в двоичном коде. Примечание: Символ «$» обозначает текущую строку, т. е. при выполнении условия переход осуществляется к той же строке программы. Например, следующие строки эквивалентны: LABEL: JB P3.4, LABEL ; Если P3.4=1, то выполнить снова JB P3.4, $ ; Если P3.4=1, то выполнить снова 37 Рисунок 13 - Схема подключения датчиков микроконтроллеру Б) Используем аппаратурный счетчик импульсов между двумя событиями. Процедура подсчета импульсов может быть реализована иначе, если использовать вход Т1 (Р3.5) не как тестовый, а как вход встроенного в МК счетчика событий (16-разрядный Таймер/Счетчик 1). В аккумуляторе А и расширителе В фиксируется число деталей, представленное в двоичном коде (максимальное количество деталей 65535): EXIT: MOV MOV MOV JB SETB JNB CLR MOV MOV …… TMOD,#01000000B TL1,#0 TH1,#0 P3.4,$ TCON.6 P3.4,$ TCON.6 A,TL1 B,TH1 ; Настройка счетчика 1 ; Сброс счетчика деталей (счетчик 1) ; Ожидание пуска конвейера ; Пуск счетчика 1 ; Ожидание останова конвейера ; Останов счетчика 1 ; Младший байт числа деталей в аккумулятор ; Старший байт числа деталей в регистр В ; Выход из процедуры 6.3.2 Подсчет числа импульсов за заданный промежуток времени. При решении задачи преобразования число-импульсного кода в двоичный код, при измерении частоты и ли длительности импульсов, а также в ряде других задач может возникнуть необходимость подсчета числа импульсов за заданный промежуток времени. Эта процедура может быть реализована тремя различными способами: А) Программной реализацией временного интервала и программным подсчетом числа импульсов на входе МК; Б) Программной реализацией временного интервала и аппаратурным подсчетом числа импульсов (на внутреннем таймере/счетчике); В) Аппаратурной реализацией временного интервала и программным подсчетом число импульсов. Г) Аппаратурная реализация временного интервала с аппаратурным подсчетом числа импульсов. А. Первый способ (смотри п. 6.3.1 ) неэффективен и значительно сложнее других, а потому не рассматривается. Второй и третий являются альтернативными, когда свободен только один таймер/счетчик. Б. При аппаратурной реализации подсчета числа событий импульсный датчик должен быть подключен ко входу Т1 (Р3.5) микроконтроллера. Подсчет импульсов производится аппаратурным счетчиком событий T/С1, а отсчет заданного временного интервала – подпрограммой DELAY: STDLY: EXIT: 38 MOV MOV MOV SETB CALL CLR MOV MOV …… TMOD,#01010001B TL1,#0 TH1,#0 TCON.6 DELAY TCON.6 A,TL1 B,TH1 ; Настройка счетчика 1 ; Сброс счетчика 1 ; Пуск счетчика 1 ; Временная задержка ; Останов счетчика 1 ; Младший байт числа деталей в аккумулятор ; Старший байт числа деталей в регистр В ; Выход из процедуры В. При аппаратурной реализации отсчета временного интервала подсчет импульсов производится программным счетчиком R1, а отсчет заданного временного интервала таймером Т/С0: CTLDYT: MOV TMOD,#00000001B ; Настройка режима таймера 0 MOV TL0,A ; Установка таймера 0 на задержку 65536 мс MOV TH0,A MOV R1,A ; Сброс счетчика импульсов R1 SETB TCON.4 ; Пуск таймера 0 WAITC: JB TF0,STP ; Если временной интервал истёк, то к остановке JB P3.4,WAITC ; Ожидание импульса JNB P3.4,$ INC R1 ; Инкремент счетчика импульсов R1 JMP WAITC ; К продолжению счёта STP: CLR TCON.4 ; Останов таймера 0 EXIT: …… ; Выход из процедуры В приведенном примере таймер настроен на максимально возможный временной интервал 65,536 мс, счетчик импульсов реализован в регистре R1. Проверка истечения заданного временного интервала осуществляется по флагу переполнения таймера (TF0). Прерывание должно быть замаскировано. Поскольку аппаратурный таймер не может реализовать временные задержки длительностью более 65 мс, «длинные» временные задержки должны реализовываться программно, например, они могут «набираться» из интервалов в 65 мс (или меньших, например, 10 мс) с подсчетом числа прерываний от таймера. Г. Четвертый (полностью аппаратурный ) способ подсчета числа импульсов требует использования двух аппаратурных счетчиков. На Т/С1 можно выполнять подсчет числа импульсов, а на Т/С0 – отсчет заданного интервала. Датчик импульсов должен быть подключен к входу Т1: TIME: EQU NOT(10000)+1 ; Определение константы TIME ; для отсчета интервала 10 мс MOV TMOD,#01010001B ; Настройка Т/С, 16 бит, Т/С0-таймер, Т/С1-счетчик CLR A ; Сброс аккумулятора MOV TH1,A ; Сброс Т/С1 MOV TL1,A MOV TH0,#HIGH(TIME) ; Загрузка в Т/С0 константы TIME MOV TL0,#LOW(TIME) ORL TCON,#50H ; Пуск Т/С1 и Т/С0 WAIT: JBC TCON.5,EXIT ; Проверка переполнения Т/С0 SJMP WAIT ; Цикл, если TF0=0 EXIT: MOV B,TH1 ; Старший байт числа импульсов в регистр В MOV A,TL1 ; Младший байт числа импульсов в аккумулятор …… ; Выход из процедуры 6.4 Опрос группы двоичных датчиков. Микроконтроллеры чаще всего имеют дело не с одним датчиком, как в рассмотренных выше примерах, а с группой автономных (логически независимых) или взаимосвязанных (формирующих двоичных код) датчиков (группу взаимосвязанных датчиков называют композицией). При этом МК может выполнять процедуру опроса датчиков и передачи управления отдельным фрагментам прикладной программы в зависимости от принятого кода. Программную реализацию процедуры ожидания заданного кода (WTCODE) рассмотрим для случая подключения группы из восьми взаимосвязанных статических датчиков ко входам порта 1 МК. Сравнение принятого кода с за данным осуществляется операцией «Исключительно ИЛИ». В приведенном примере заданное число равно 10: WTCODE: MOV A,#10 ; Загрузка в аккумулятор заданного кода WAIT: CJNE A,P1,WAIT ; Если кодовая комбинация на входах порта 1 ; не совпала с заданным значением, то ждать EXIT: …… ; Выход из процедуры При опросе композиции двоичных датчиков передачу управления удобно осуществлять по таблице переходов. Ниже приводится текст программы, осуществляющей передачу управления одной из восьми прикладных программ PR0G0-PROG7 (которые расположены в пределах одной страницы памяти программ) в зависимости от кодовой комбинации, набранной на переключателях, подключенных к входам Р1.0-Р1.2: GOCODE: MOV DPTR,BASE ; Загрузка в DPTR начального адреса ; таблицы переходов IN A,P1 ; Ввод байта ANL A,#00000111B ; Выделение младших трёх бит MOV B,#3 ; Формирование адреса (умножение на 3) MUL AB 39 JMP @A+DPTR ; Передача управления строке в таблице переходов LJMP PROG0 ; Переход к метке PROG0, длина команды 3 байта …… …... LJMP PROG7 ; Переход к метке PROG7, длина команды 3 байта Программа обеспечивает опрос и выделение сигналов от трех датчиков путем маскирования (обнуления) старших бит аккумулятора. Адрес строки таблицы, в которой хранятся адреса переходов, вычисляется командой JMP @A+DPTR как сумма начального адреса таблицы BASE и кода, принятого от датчиков, умноженного на 3 (т. к. команды JMP PROGх в таблице переходов - трёхбайтовые). BASE: При работе с композицией датчиков часто возникает необходимость осуществлять передачу управления не только в зависимости от двоичного эквивалента принятого кода, как в рассмотренном примере, но и в зависимости от соотношения принятого кода и некоторой заранее определенной уставки. Пусть, например, в порте 1 от группы двоичных датчиков формируется восьмибитовый двоичный код. Если код равен десятичному эквиваленту 135, то необходимо передать управление программе с меткой LABELA, а если не равен – программе с меткой LABELB: MOV A,#135 ; Загрузка уставки CJNE A,P1,LABELB ; Сравнение и передача управления LABELA: …… 6.4.1 Опрос группы импульсных датчиков. Эта процедура состоит из последовательности действий: ожидания замыкания одного из контактов, устранения дребезга, ожидания размыкания замкнутого контакта. Программная реализация процедуры для случая подключения четырех импульсных датчиков ко входам 0-3 порта 1 будет иметь вид: KBRD: DBNC: WAIT: EXIT: IN CPL ANL JZ MOV CALL IN CPL ANL JNZ …… A,P1 A A,#00001111B KBRD R2,A DELAY A,P1 A A,#00001111B WAIT ; Ввод кода ; Инверсия кода ; Есть замкнутый контакт? ; Если ни один контакт не замкнут, то ждать, иначе ; Передача принятого кода в R2 ; Устранение дребезга (задержкой) ; Ввод кода ; Инверсия кода ; Есть замкнутый контакт? ; Если контакт замкнут, то ждать, иначе ; Выход из процедуры Анализ состояния контактов осуществляется наложение маски на принятый от датчиков код. Для датчиков, формирующих «отрицательный» импульс, принятый код удобно предварительно инвертировать. Для группы импульсных датчиков, представляющих собой клавишный регистр, процедура KBRD должна быть дополнена процедурами идентификации нажатой клавиши и защиты от одновременного нажатия двух и более клавиш. Идентификация нажатой клавиши может осуществляться двумя способами по таблице или программно. При табличном способе перекодирования в памяти программ должна находиться таблица двоичных эквивалентов кодов клавиш. Программное преобразование унитарного кода, принятого от клавиатуры, в двоичный может быть выполнено методом сдвигов исходного унитарного кода и подсчетом числа сдвигов на счетчике до появления первого переноса. Схема алгоритма такой процедуры приведена на Рисунок 14. Программа будет иметь вид: IDNKEY: MOV A,R2 ; Передача принятого кода в аккумулятор MOV R1,#0 ; Сброс счетчика сдвигов CLR C ; Сброс флага переноса ROTATE: RRC A ; Сдвиг унитарного кода JC CHECK ; Если возник перенос, то проверка ; на множественное нажатие INC R1 ; Инкремент счетчика сдвигов JMP ROTATE ; Продолжение сдвигов CHECK: JZ EXIT ; Если (А)=0, то выход из процедуры MOV R1,#0FFH ; Занесение в R1 кода одновременного ; нажатия нескольких клавиш EXIT: …… ; Выход из процедуры Результат формируется в регистре R1. В программе предполагается, что в R2 находится инверсия унитарного кода, принятого от группы датчиков процедурой KBRD. В результате работы программы IDNKEY в R1 буде сформирован двоичный код нажатой клавиши или экстракод FFH «Нажато несколько клавиш». 40 Рисунок 14 - Блок-схема процедуры преобразования кода 7 Вывод управляющих сигналов из МК 7.1 Формирование статических сигналов. Для управления исполнительным механизмом, работающим по принципу включено/выключено, на соответствующей выходной линии порта МК необходимо сформировать статический сигнал 0 или 1, что реализуется командами вывода непосредственного операнда, содержащего в требуемом бите значение 0 или 1. В случае параллельного управления группой автономных исполнительных механизмов, подключенных к выходному порту, формируется не двоичное управляющее воздействие, а управляющее слова (УС), имеющее формат байта, каждому разряду которого ставится в соответствие 1 или 0 в зависимости от того, какие исполнительные механизмы должны быть включены, а какие выключены. Управляющие слова удобно формировать командами логических операций над содержимым порта. Команда ANL используется для сброса тех битов УС, которые в операнде (маске) заданы нулем. Команда ORL используется для установки битов УС. Командой XRL осуществляется инверсия битов в соответствии с выражением x1 = x. Для формирования сложных последовательностей УС удобно пользоваться табличным способом, при котором все возможные УС упакованы в таблицу, а прикладная программа МК вычисляет адрес требуемого УС, выбирает его из таблицы и передает в порт вывода. 7.2 Формирование импульсных сигналов. Управляющее воздействие типа «импульс» можно получить последовательной выдачей сигналов включить и отключить с промежуточным вызовом подпрограммы временной задержки: PULS: ; Выдача «положительного» импульса (0→1→0) в линию 3 порта 1 ON: SETB P1.3 ; Включение исполнительные механизма (Р1.3 ← 1) CALL DELAY ; Временная задержка OFF: CPL P1.3 ; Отключение исполнительные механизма (Р1.3 ← 0) …… Длительность импульса определяется временной задержкой, реализуемой подпрограммой DELAY. Другие линии порта 1 не затрагиваются. 7.2.1 Генерация периодического управляющего воздействия (меандра). Для генерации меандра удобно воспользоваться процедурой выдачи импульсного управляющего воздействия (PULS) и подпрограммой реализации временной задержки, равной половине периода сигнала (DLYX). MEANDR: CPL P1.3 ; Инверсия состояния линии Р1.3 ACALL DLYX ; Временная задержка SJMP MEANDR ; Цикл Бесконечный периодический сигнал формируется в линии 3 порта 1. На остальных линиях порта 1 сигналы остаются неизменными. 41 7.2.2 Формирование апериодического управляющего сигнала. Последовательность импульсных сигналов с произвольной длительностью и скважностью может быть получена аналогичным образом, т.е. путем чередования процедур выдачи изменяемого значения сигнала (0 или 1) и вызова подпрограмм временных задержек заданных длительностей. 8 Масштабирование При вводе и выводе информации часто возникает задача согласования диапазона представления чисел в МК и во внешней аппаратуре, обеспечивающей связь МК с объектом управления. Эта задача называется масштабированием и сводится к операции умножения/деления числа на некоторую константу k. Масштабирование двоичных кодов, вводимых с цифровых датчиков для последующей обработки в МК или выводимых из МК на исполнительный механизм, можно выполнять с использованием стандартных команд или подпрограмм умножения и деления. Однако во многих применениях более эффективным (по быстродействию и длине программы) может оказаться способ умножения числа на константу путем сдвигов. Данный способ основан на том, что сдвиг двоичного кода числа на один бит влево (в сторону старших бит) эквивалентен его умножению на 2, а сдвиг на один бит вправо – делению на 2. Поясним на двух простых примерах этот прием выполнения процедуры масштабирования. Пусть необходимо двоичный код Х, полученный от цифрового датчика, умножить на константу 2.5. Результат масштабирования числа может быть получен в соответствии с выражением 2.5 Х= 2Х + Х/2, т.е. путём суммирования сдвинутых влево и вправо двоичных кодов числа Х: CLR C ; Сброс флага переноса IN A,P1 ; Ввод числа Х MOV R2,A ; Создание копии Х в R2 RL A ; Умножение Х на 2 MOV R3,A ; Создание копии 2Х в R3 MOV A,R2 ; Восстановление Х в аккумуляторе RRC A ; Деление Х на 2 ADDC A,R3 ; Результат в аккумуляторе Пусть требуется сформированное в аккумуляторе МК управляющее слово Y перед выдачей его в ЦАП умножить (с целью согласования масштабов УС и его аналогового эквивалента) на константу 17. Операция умножения на 17 может быть (в соответствии с выражением 17Y = 16Y + Y) заменена четырьмя операциями сдвига и сложением: MOV R3,A ; Создание копии Y в R3 RL A ; А ← 2Y RL A ; А ← 4Y RL A ; А ← 8Y RL A ; А ← 16Y ADD A,R3 ; А ← 16Y+Y Для упрощения примеров программ они составлены в предположении, что при умножении не происходит переполнения одного байта (результат меньше 255). В МК51 проблема масштабирования частично снимается, так как имеются быстрые команды умножения и деления байтов (MUL и DIV). 9 Реализация функции времени 9.1 Программное формирование временной задержки. 9.1.1 Временная задержка малой длительности. Процедура реализации временной задержки использует метод программных циклов. При этом в некоторый рабочий регистр загружается число, которое затем в каждом проходе цикла уменьшается на 1. Так продолжается до тех пор, пока содержимое рабочего регистра не станет равным нулю, что интерпретируется программой как момент выхода из цикла. Время задержки при этом определяется числом, загруженным в рабочий регистр, и временем выполнения команд, образующих программный цикл. Схема алгоритма такой программы показана на Рисунок 15. Программа имеет символическое имя DELAY. Предположим, что в управляющей программе необходимо реализовать временную задержку 100 мкс. Фрагмент программы, реализующей временную задержку, требуется оформить в виде подпрограммы, так как предполагается, что основная управляющая программа будет производить к ней многократные обращения для формирования выходных импульсных сигналов, длительность которых кратна 100 мкс: DELAY: COUNT: 42 MOV DJNZ RET R2,#X ; (R2) ← X R2,COUNT ; Декремент R2 и цикл, если не ноль ; Возврат Рисунок 15 - Блок-схема процедуры формирования временной задержки малой длительности Для получения требуемой временной задержки необходимо определить число Х, загружаемое в рабочий регистр. Определения числа Х выполняется на основе расчета времени выполнения команд, образующих данную под программу. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки. В описании команд МК указывается, за сколько машинных циклов (МЦ) исполняется каждая команда. На основании этих данных определяется суммарное число машинных циклов в подпрограмме: CALL - 2 МЦ, MOV - 2МЦ, DJNZ - 2МЦ, RET - 2МЦ. Если каждый машинный цикл выполняется за 1 мкс, то подпрограмма выполняется за время TD = 2+2+2Х+2 = 6+2Х мкс. Для реализации временной задержки 100 мкс число Х = (100-6)/2 = 47. В данном случае при загрузке в регистр R2 числа 47 требуемая временная задержка (100 мкс) реализуется точно. Если число Х получается дробным, то временную задержку можно реализовать лишь приблизительно. Для более точной подстройки в подпрограмму могут быть включены «пустые» команды NOP, время выполнения каждой из которых равно 1 мкс. Минимальная временная задержка, реализуемая подпрограммой DELAY, составляет TDMIN = 8 мкс (Х=1). Временную задержку меньшей длительности программным путем можно реализовать, включая в программу цепочки команд NOP (1МЦ = 1 мкс). Максимальная длительность задержки, реализуемая подпрограммой DELAY, составляет TDMAX = 518 мкс (Х=0, что соответствует 256 циклам). Для реализации задержки большей длительности можно рекомендовать увеличить тело цикла включением дополнительных команд или использовать метод вложенных циклов. Так, например, если в подпрограмму DELAY пред командой DJNZ вставить дополнительно две команды NOP, то максимальная задержка составит TDMAX = 6+Х(2+2) = 6+4×256 = 1 030 мкс (т.е. в два раза больше). 9.1.2 Временная задержка большой длительности. Схема алгоритма программной реализации временной задержки большой длительности методом вложенных циклов показана на Рисунок 16. Там же обозначено, сколько раз выполняется каждый фрагмент программы. Числа X и Y выбираются из соотношения Т= 2+2+Х(2+2Y+2)+2, где Т – реализуемый временной интервал в микросекундах. Максимальный временной интервал, реализуемый таким способом, при Х=Y=256 составляет 132 102 мкс, т.е. приблизительно 132 мс. В качестве примера рассмотрим подпрограмму, реализующую временную задержку 100 мс: DELAY: MOV R1,#199 ; Загрузка Х LOOPEX: MOV R2,#248 ; Загрузка Y LOOPIN: DJNZ R2,LOOPIN ; Декремент R2 и внутренний цикл если (R2) не равно 0 DJNZ R1,LOOPEX ; Декремент R1 и внешний цикл если (R1) не равно 0 MOV R3,#244 ; Точная подстройка LOOPAD: DJNZ R3,LOOPAD ; временной задержки (+494 мкс) RET ; Возврат Здесь два вложенных цикла реализуют временную задержку длительностью 6+199(4+2×248) = 99 506 мкс, а дополнительный цикл LOOPAD реализует задержку 494 мкс [2+2+2×244+2 мкс] и тем самым обеспечивает точную подстройку временного интервала 10 мс. 43 Рисунок 16 - Блок-схема процедуры временной задержки большой длительности 9.1.3 Временная задержка длительностью 1 с. Из рассмотренного примера видно, что секунда является очень большим интервалом времени по сравнению с частотой тактирования МК. Такие задержки сложно реализовать методом вложенных циклов, поэтому их обычно набирают из точно подстроенных задержек меньшей длительности. Например, задержку в 1 с можно реализовать десятикратным вызовом подпрограммы, реализующей задержку 100 мс: ONESEC: MOV R3,#10 LOOP: CALL DELAY DJNZ R3,LOOP Погрешность подпрограммы составляет +55 мкс. Для очень многих применений это достаточно высокая точность, хотя реализованные на основе этой программы часы астрономического времени за сутки «убегут» примерно на 5 с. 9.2 Формирование временной задержки на основе таймеров. 9.2.1 Задержка малой длительности. Недостатком программного способа реализации временной задержки является нерациональное использование ресурсов МК: во время формирования задержки МК практически простаивает, так как не может решать никаких задач управления объектом. В то же время аппаратурные средства МК позволяют реализовать временные задержки на фоне основной программы работы. В МК51 на вход таймера/счетчика (Т/С) могут поступать сигналы синхронизации с частотой 1 МГц (Т/С в режиме таймера) или сигналы от внешнего источника (Т/С в режиме счетчика). Оба эти режима могут быть использова ны для формирования задержек. Если использовать Т/С в режиме таймера полного формата (16 бит), то можно получить задержки в диапазоне от 1 до 65 536 мкс. В качестве примера рассмотрим организацию временной задержки длительностью 50 мс в МК51. Предполагается, что бит IE.7 установлен. Организация перехода к метке NEXT при переполнении Т/С0: ORG 0BH ; Адрес вектора прерывания от Т/С0 CLR TCON.4 ; Останов Т/С0 RETI ; Выход из подпрограммы ; обработки прерывания ORG 100H ; Начальный адрес программы 44 NEXT: MOV MOV MOV SETB SETB SETB …… TMOD,#01H TL0,#LOW(NOT(50000-1)) TH0,#HIGH(NOT(50000-1)) TCON.4 IE.1 PCON.0 ; Настройка Т/С0 ; Загрузка таймера ; дополнительным кодом числа 50 000(мкс) ; Старт Т/С0 ; Разрешение прерывания от Т/С0 ; Перевод МК51 в режим холостого хода Отсчёт временного интервала начинается командой SETB TCON.4 (старт таймера). Появление сигнала прерывания по переполнению таймера соответствует истечению временного интервала 50 000 мкс. Погрешность перехода к метке NEXT будет составлять около +6 мкс (время выполнения команды передачи управления по вектору прерывания: 0BH, команды останова Т/С0: CLR TCON.4 и возврата из подпрограммы обработки прерывания: RETI). 9.3 Измерение временных интервалов. В задачах управления часто возникает необходимость измерения промежутка времени между двумя событиями. Схема алгоритма типовой процедуры измерения (MEASURE) приведена на Рисунок 17. Обычно события в объекте управления представляются сигналами от двоичных датчиков. Считая событиями фронт и спад импульса, можно определять временные характеристики импульсных сигналов: длительность (τ), период (Т) и скважность (Т/τ). Кроме того, с помощью процедуры MEASURE можно определять скорость перемещения подвижного органа объекта по эталонному (заданной длины) участку. Начало и конец участка должны быть снабжены датчикам (концевыми выключателями). Простейшим способом измерения длительности импульса является программный. Для обнаружения событий (фронт и спад импульсного сигнала) в этом случае используются типовые процедуры WAIT, а отсчет времени ведется программным способом. Для «положительного» импульсного сигнала (0 → 1 → 0), поступающего на вход Т0, программа измерения его длительности будет иметь вид: MSCONT: MOV R7,#0 ; Сброс счетчика WAIT0: JNB T0,WAIT0 ; Ожидание фронта сигнала (0 → 1) на входе Т0 COUNT: INC R7 ; Инкремент счетчика JB T0,COUNT ; Ожидание спада сигнала (1 → 0) EXIT: …… ; Выход из процедуры После выхода из процедуры содержимое счетчика (R7) пропорционально длительности импульса. Рисунок 17 - Блок-схема процедуры измерения времени Для нормальной работы этой программы необходимо, чтобы обращение к ней производилось в моменты, когда на входе Т0 присутствует сигнал нулевого уровня. Верхний предел измеряемой длительности «положительного» импульса составит 255(1+2)1 мкс=765 мкс. Этот предел может быть увеличен включением в цикл COUNT дополнительных команд NOP. Максимальная погрешность измерений 3 мкс. Для измерения длительности сигнала может быть использован таймер. Особенно эффективно использование для это цели таймера в МК51, имеющего вход разрешения счета (альтернативная функция входа ЗПР). Измеряемый сигнал можно, например, подавать на вход ЗПР0 (P3.2), измерение длительности «положительного импульса» будет выглядеть так: 45 WAIT0: WAITC: EXIT: MOV MOV MOV JNB SETB JB CLR …… TMOD,#00001001B TH0,#0 TL0,#0 P3.2,WAIT0 TCON.4 P3.2,WAITC TCON.4 ; Настройка Т/С0 ; Сброс таймера ; Ожидание «1» ; Старт Т/С0 ; Ожидание «0» ; Стоп Т/С0 ; Выход из процедуры Управление программе должно быть передано при условии, что на входе ЗПР0 присутствует низкий уровень. Прерывание от Т/С0 и внешнее прерывание по входу ЗПР0 должны быть запрещены. По завершению программы в Т/С0 будет находиться число, пропорциональное длительности «положительного» импульса на входе ЗПРО. Верхний предел измерения равен 65 536 мкс, а максимальная погрешность 1 мкс. При необходимости измерения временных интервалов большей длительности можно программным способом подсчитывать число переполнений от таймера, т.е. расширять его разрядность за счёт рабочего регистра или ячейки РПД. 10 Преобразование кодов В задачах управления может возникнуть необходимость преобразования информации из одной формы представления в другую. Это связано с тем, что обработка данных в МК осуществляется в параллельном двоичном коде, а поступать в МК и выводиться из него информация может в иной форме представления. Наиболее распространены в задачах логического управления следующие преобразования: - из унитарного кода в двоичный (при вводе информации с клавиатуры или оцифрованных переключателей) и из двоичного в унитарный; - из одной системы счисления в другую (при работе со специальными клавиатурами); - специальные преобразования (для организации индикации и при выводе информации на периферийные устройства); - из последовательного кода в параллельный (при вводе) и из параллельного в последовательный (при выводе); - из аналоговой формы представления в цифровую и наоборот (для связи с аналоговыми датчиками и исполнительным механизмами). 10.1 Простейшие преобразования. 10.1.1 Преобразование унитарного кода в двоичный позиционный. Двоичный эквивалент унитарного кода равен номеру бита, в котором находится единственная единица. Поэтому преобразование унитарного кода в двоичный позиционный удобно осуществлять путем сдвига исходного унитарного кода в сторону младших бит с одновременным подсчетам числа сдвигов. При «выдвигании» из младшего бита значения «1» сдвиги прекращаются, а в счетчике сдвигов будет содержаться двоичный эквивалент унитарного кода (смот ри п, 6.4.1 ). 10.1.2 Преобразования двоичного позиционного кода в унитарный. Необходимость такого преобразования возникает, например, при выборке одного из исполнительных устройств, мультиплексирующих шину BUS (Р0), по его номеру. Пусть, например, требуется преобразовать 3-битный двоичный код из регистра R4 в 8-битный унитарный в А: Преобразование осуществляется путем «вдвигания» единицы из флага переноса в аккумулятор. Результат формируется в аккумуляторе за N сдвигов (где N - эквивалент исходного двоичного кода). Недостатком приведенной программы является то, что для преобразования N=0 понадобится 256 сдвигов. Избежать этого можно, модифицировав программу DECODE следующим образом: DECODE: INC R4 ; Инкремент исходного кода MOV A,#10000000B ; Установка старшего бита аккумулятора ROTATE: RL A ; Сдвиг влево циклический (A.7 → A.0) DJNZ R4,ROTATE ; Декремент позиционного кода и цикл, пока не ноль Преобразование в этом случае осуществляется за N+1 сдвигов. 10.1.3 Преобразование кодов из одной системы счисления в другую. Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 10. Деление должно осуществляться по правилам двоичной арифметики. Пусть требуется выполнить преобразования 8-битного двоичного числа в двоично-десятичное. Исходный двоичный код хранится в аккумуляторе. Результат преобразования состоит из 12 бит: младшие 4 бита - единицы, представляют собой остаток от деления исходного числа на 10; следующие 4 бита – десятки, представляют собой остаток от деления на 10 полученного частного; старшие 4 бита – сотни, являются частным от второго деления: 46 BBD: CALL DIV10 MOV R7,A MOV A,R1 CALL DIV10 SWAP A ORL A,R7 JMP EXIT ; Подпрограмма деления на 10 ; Исходный двоичный код в аккумуляторе ; Результат: в R1 - частное, в аккумуляторе - остаток DIV10: MOV R1,#0 SUB10: ADD A,#(NOT(10)+1) EXIT: INC JC DEC ADD RET …… R1 SUB10 R1 A,#10 ; Деление исходного числа на 10 ; Сохранение остатка в R7 ; Загрузка в аккумулятор частного ; Деление частного на 10 ; Передача остатка в старшую тетраду аккумулятора ; Передача R7 в младшую тетраду аккумулятора ; Выход из процедуры ; Сброс R1 ; Вычитание 10 (сложение с дополнительным ; кодом числа «-10») из делимого ; Инкремент частного ; Цикл, если остаток ≥ 0 ; Восстановление частного ; Восстановление остатка ; Возврат В результате выполнения процедуры в младшей тетраде R1 хранятся сотни, в аккумуляторе – десятки и единицы двоично-десятичного эквивалента исходного двоичного числа. Обратное преобразование (из двоично-десятичного кода в двоичный) осуществляется делением исходного числа на 16 по правилам десятичной арифметики. Программа преобразования приведена ниже. Исходный двоично-десятичный код хранится в аккумуляторе. После окончания работы программы в «А» находится двоичный эквивалент исходного двоично-десятичного числа. Обращаем внимание на то, что команда DIV AB не может быть использована для деления чисел по правилам десятичной арифметики: BDB: CALL DIV16 ; Деление исходного числа на 16 SWAP A ; Передача остатка в старшую тетраду аккумулятора ORL A,R1 ; Загрузка частного в младшую тетраду аккумулятора SWAP A ; Формирование результата в аккумуляторе JMP EXIT ; Выход из процедуры преобразования ; Подпрограмма десятичного деления на 16 ; Делимое – в аккумуляторе ; Результат: частное – в R1, остаток – аккумуляторе DIV16: MOV R1,#0 ; Сброс частного SUB16: ADD A,#84H ; Вычитание из делимого числа 16, ; представленного в двоично-десятичной системе DA A ; Коррекция INC R1 ; Инкремент частного JC SUB16 ; Цикл, если остаток ≥ 0 DEC R1 ; Восстановление частного ADD A,#16H ; Восстановление остатка DA A ; Коррекция RET ; Возврат EXIT …… Кроме рассмотренного способа преобразования чисел из одной системы счисления в другую можно воспользоваться более меленным, но зато и более простым способом «двух счётчиков». При этом способе из исходного кода вы читается, а к новому коду прибавляется по единице до обнуления исходного кода, причем вычитание осуществляется «в старой», а прибавление – в «новой» системе счисления. Пример программы преобразования двоичного числа в двоично-десятичное методом двух счётчиков приводится ниже. Для упрощения программы принято, что исходное двоичное число, заданное в «А», не превышает его десятичного эквивалента 99: BBD: MOV R2,A ; Передача исходного кода в R2 MOV A,#0 ; Сброс аккумулятора CONV: ADD A,#1 ; Инкремент «нового» кода DA A ; Коррекция DJNZ R2,CONV ; Декремент исходного кода и цикл, если не ноль EXIT: …… ; Выход из процедуры После выхода из процедуры в «А» находится двоично-десятичный эквивалент исходного двоичного кода. 47 10.2 Преобразования параллельных и последовательных кодов. 10.2.1 Преобразование данных из параллельного кода в последовательный. Наиболее важным применением процедур преобразования формы представления данных «параллельный/последовательный» является связь с удаленными датчиками, исполнительными механизмами и другими МК по однопроводным линиям передачи информации. Обычно при передаче байта данных в прямом последовательном коде для обеспечения согласования работы приёмника и передатчика используют старт-стопный (асинхронный) режим обмена (смотри протокол UART). Передача последовательного кода байта предваряется посылкой старт-бита (0) и завершается выдачей стоп-бита (1). Процедура выдачи одного бита последовательного кода реализуется выдачей в линию передачи статического сигнала 0 или 1 и вызовом подпрограммы временной задержки заданной длительности: CLR P1.3 ; Выдача старт-бита CALL DELAYT ; Задержка на время Т PSCONV: MOV R7,#8 ; Инициализация счётчика битов ROTATE: RRC A ; Сдвиг вправо, т.е. (С) ← А.0 JC OFF ; Если перенос, то управление передаётся ; процедуре выдачи «1» ON: CLR P1.3 ; Выдача на Р1.3 сигнала «0» JMP DLY ; Задержка OFF: SETB P1.3 ; Выдача на Р1.3 сигнала «1» JMP DLY ; Задержка DLY: CALL DELAYT ; Задержка на время Т DJNZ R7,ROTATE ; Декремент счётчика битов и цикл, если не ноль SETB P1.3 ; Выдача стоп-бита CALL DELAYT ; Задержка на время Т EXIT: …… ; Выход из процедуры В МК51 имеются средства аппаратурного преобразования параллельного кода в последовательный с использованием УАПП. Вся программа преобразования параллельного кода в последовательный сводится при этом к одной команде передачи байта в буфер УАПП: MOV SBUF,A 10.2.2 Преобразование данных из последовательного кода в параллельный. Эта процедура является составной частью процедуры приёма информации в последовательном коде. В МК51 приём последовательного кода в универсальный асинхронный приёмо-передатчик (УАПП) и его преобразование в параллельный код инициируются старт-битом и выполняются аппаратурными средствами без участия программы. Основная программа МК51 должна только считать содержимое буфера УАПП (SBUF) после завершения приёма очередного байта. Завершение приёма УАПП отмечает выставлением флага и, если разрешено, выработкой запроса прерывания. При необходимости (например, нужен дополнительный канал) можно реализовать приём и декодирование программно. При обмене информации в последовательном коде необходима предварительная настройка приёмника на начало слова. При асинхронном обмене процедура настройки сводится к ожиданию старт-бита. После обнаружения стартбита на входе приёмника начинается преобразование кода, совмещенное с процедурой ввода последовательного кода. Схема алгоритма процедуры SPCONV, представлена на Рисунок 18. МК51 обеспечивает приём бита последовательного кода и его распознавание (конкретный вид этого блока зависит от способа представления бита информации в последовательном коде). При длине слова не более 8 бит для формирования параллельного кода удобно воспользоваться аккумулятором, тогда дешифрированный бит «вдвигается» в аккумулятор через флаг переноса. Поскольку последовательный код принимается младшими битами вперед, сдвиг параллельного кода осуществляется вправо. Аккумулятор предварительно сбрасывается, а после N сдвигов (где N - разрядность слова, передаваемого в последовательном коде) в нём фиксируется параллельный код принятого слова данных. Для обеспечения временного согласования работы приёмника и передатчика, а также для снижения вероятности неправильного прочтения сигнала при вводе, стартовый бит после его обнаружения необходимо стробировать в середине интервала его представления. С этой целью программа повторяет анализ старт-бита через время, равное половине периода бита, и если старт-бит не подтвердился, то процедура ожидания повторяется. 48 Рисунок 18 - Блок-схема процедуры преобразования последовательного кода в параллельный Для приёма последовательного кода можно использовать любую линию любого порта, например вход Т0 (Р3.4). Опрос входа Т0 повторяется через время, равное периоду представления бита и смещённое на половину периода относительно его начала. Для синхронизации приёма/передачи подпрограмма DELAYT приёмника должна реализо вать ту же самую задержку, что и подпрограмма DELAYT передатчика: WAIT: SPCONV: LOOP: ROTATE: EXIT: JB CALL JB MOV MOV CLR CALL JNB P3.4,WAIT DELAYX P3.4,WAIT R7,#8 A,#0 C DELAYT P3.4,ROTATE SETB RRC DJNZ …… C A R7,LOOP ; Ожидание старт-бита ; Задержка на время Т/2 ; Если на входе «1», то повторить ; Загрузка счётчика битов, N=8 ; Сброс аккумулятора ; Сброс флага переноса ; Задержка на время Т ; Если на входе «0», то сохранение ; нулевого состояния флага переноса, иначе ; установка флага переноса ; Сдвиг параллельного кода ; и если не ноль, то цикл ; Выход из процедуры 11 Цифро-аналоговые и аналого-цифровые преобразования. 11.1 Цифро-аналоговое преобразование. Преобразование информации из цифровой формы в аналоговую осуществляется путём подключения БИС ЦАП к одному из портов МК. Выдача аналогового управляющего воздействия в этом случае сводится к одной команде, например, OUTL Р1,А. При этом на выходе ЦАП появится напряжение (ток), пропорциональное двоичному коду, загруженному в порт 1. 49 Некоторые объекты управления могут требовать непрерывного управляющего воздействия сложной формы. Для реализации такого воздействия в МК используются цифровые методы интегрирования: на каждом интервале времени Δt непрерывная функция заменяется её средним дискретным значением. Таким образом, управляющее воздействие становится ступенчатым (Рисунок 19) и программа его формирования может быть реализована с использованием процедур выдачи кода и временной задержки заданной длительности. Рисунок 19 - Дискретизация непрерывной функции Если предположить, что для управления некоторым объектом требуется сформировать управляющее воздействие, показанное на Рисунок 19, с периодом дискретизации 100 мкс, то, прежде всего, в памяти программ следует сформировать таблицу (TABL) двоичных эквивалентов дискретных значений функции для каждого из периодов дискретизации. Если допустить, что длина TABL в байтах хранится в её первом байте, а выводимые из таблицы двоичные коды не требуют масштабирования, то программа формирования управляющего воздействия: FANCNV: MOV DPL,#LOW(TABL) ; Запись адреса первого байта таблицы TABL MOV DPH,#H ; в указатель DPTR MOV A,#0 MOVC A,@A+DPTR ; Чтение длины таблицы из памяти программ MOV R2,A ; (R2) ← длина таблицы TABL в счётчик LOOP: INC DPTR ; Продвижение указателя данных MOV A,#0 MOVC A,@A+DPTR ; Чтение кода из TABL OUTL P1,A ; Вывод кода в ЦАП CALL DELAY ; Задержка на величину периода DJNZ R2,LOOP ; Декремент R2, и цикл, если не ноль ЕXIT: …… ; Выход из процедуры 11.2 Аналого-цифровое преобразование. Преобразование аналогового сигнала от датчика в цифровой код, принимаемый и обрабатываемый в МК, можно осуществить несколькими способами: 1 Аппаратурный на основе БИС АЦП, подключаемой к порту МК. В этом случае МК только инициирует АЦП и через заданные периоды дискретизации считывает из него цифровой код. Данный способ характеризуется самым высоким быстродействием, но требует использования БИС АЦП, что далеко не во всех применениях МК является оправданным. 2 Аппаратурно-программный на основе подключаемых внешних БИС и программы, реализующей алгоритм преобразования. 3 Наибольший практический интерес представляет использование МК со встроенным АЦП нужного типа. Обычно это АЦП последовательных приближений или сигма-дельта АЦП. В настоящее время практически в каждом семействе МК имеются изделия со встроенным АЦП, дополненного программируемым усилителем, входным аналоговым мультиплексором и другой вспомогательной аппаратурой. 50
«Методология проектирования микропроцессорных систем» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ
Получи помощь с рефератом от ИИ-шки
ИИ ответит за 2 минуты

Тебе могут подойти лекции

Смотреть все 661 лекция
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot