- •Эрни Каспер Программирование на языке Ассемблера для микроконтроллеров семейства i8051
- •1.Что нужно знать программисту о микроконтроллерах семейства i8051
- •1.1.Общие сведения об архитектуре i8051
- •1.2.Правила записи команд микроконтроллера семейства i8051 на Ассемблере
- •1.3.Форматы и способы адресации данных
- •1.4.Форматы и способы адресации команд
- •1.5.Команды пересылки информации
- •1.6.Команды поразрядной обработки информации
- •1.7.Команды арифметических операций
- •1.8.Управляющие команды
- •2.Директивы ассемблера для микроконтроллеров семейства i8051
- •2.1.Общие понятия о процессах трансляции и компоновки
- •2.2.Обработка имен транслятором и компоновщиком
- •2.3.Директивы резервирования памяти и инициализации данных
- •2.4.Использование выражений в операндах
- •2.5.Директивы условной трансляции
- •2.6.Директивы подстановок
- •2.7.Директивы управления вводом и выводом
- •Глава 3.
- •3.Кросс-средства фирмы 2500 a.D. Software, Inc. Для семейства i8051
- •Глава 4
- •4.Программирование арифметических действий
- •4.1.Кодирование информации в микроконтроллере
- •4.2.Арифметические действия с большими числами
- •4.3.Арифметические действия с отрицательными числами
- •4.4.Контроль точности при программировании арифметических операций
- •Глава 5
- •5.Программирование вычисления функций
- •5.1.Возведение в квадрат и извлечение квадратного корня
- •5.2.Переход от десятичной системы счисления к двоичной и обратно
- •5.3.Вычисление функций при помощи таблиц
- •5.4.Вычисление обратной функции по таблице прямой функции
- •5.5.Компенсация систематических погрешностей при помощи таблиц
- •Глава 6
- •6.Программирование фильтрации сигналов
- •6.1.Особенности цифровой фильтрации сигналов
- •6.2.Программирование простейших фильтров нижних частот
- •6.3.Программирование фильтра для оценки параметров сигнала
- •6.4.Программирование медианного фильтра
- •Глава 7
- •7.Программирование взаимодействия с внешними устройствами
- •7.1.Общие вопросы взаимодействия
- •7.2.Порядок выполнения прерываний в микроконтроллерах семейства i8051.
- •7.3.Синхронизация работы программы внешним или внутренним сигналом
- •7.4.Программирование приема информации от датчиков
- •7.5.Программирование выдачи команд на исполнительные устройства
- •7.6.Программирование ввода и вывода информации для пользователя
- •8.Несколько рекомендаций о стиле программирования
- •8.1.Стиль программирования и использование ресурсов
- •8.2.Оформление исходного текста программы
- •8.3.Системы обозначений, выражения и простые подстановки
- •8.4.Применение подпрограмм и сложных текстовых подстановок
Глава 7
7.Программирование взаимодействия с внешними устройствами
7.1.Общие вопросы взаимодействия
При программировании алгоритмов решения вычислительных задач необходимо учитывать следующие ресурсы микроконтроллера: систему команд, форматы данных, допустимый расход объемов ОЗУ и ПЗУ. Задача программирования взаимодействия с внешними устройствами требует учета ряда дополнительных ограничений. Часто самым существенным ограничением является время решения задачи управления изделием и/или время реакции на внешние сигналы. Для взаимодействия микроконтроллера с внешними устройствами нужно обеспечить выполнение некоторых наборов требований, которые в вычислительной технике называются интерфейсами. Часть этих требований относится к конструкторской и схемотехнической стороне разработки изделия. Предметом данной главы является обеспечение той части требований, которые относятся к программированию.
Задачей программиста является обеспечение логической части интерфейса, заключающейся в выдаче и/или приеме некоторых последовательностей двоичных кодов в определенном масштабе времени и в зависимости от выполнения тех или иных условий. Двоичные коды могут передаваться параллельно (разные биты по разным проводам) или последовательно (все биты по одному проводу). Последовательная передача может начинаться с младших или со старших битов кода. Для экономии времени может осуществляться дуплексная связь, обеспечивающая одновременную передачу и прием по разным линиям связи. Обмен кодами предусматривает не только прием и передачу сигналов, но и отношения подчинения между устройствами. Одно из устройств должно быть ведущим, а другое — ведомым. Для обеспечения достоверности программа должна обеспечивать проверку принимаемых сигналов на соответствие контрольным кодам и выдачу контрольных кодов для проверки передаваемых сигналов в месте приема. В случае обнаружения сбоев при приеме программа должна запрашивать повторную выдачу информации, а при передаче повторять выдачу информации по запросу. Для уменьшения количества линий связи может использоваться мультиплексирование, обеспечивающее обмен с несколькими устройствами по одним и тем же линиям связи. В этом случае сеанс связи со стороны ведущего устройства должен начинаться с выдачи идентификационного кода ведомого устройства. В ответ на этот код соответствующее ведомое устройство должно выдать ведущему устройству сигнал готовности к сеансу. Приведенный (далеко не полный) перечень возможных требований к логической части интерфейса показывает, что программисту есть над чем поработать. Существуют стандартные способы обмена сигналами, описания которых называются протоколами, но мы не будем рассматривать ни эти протоколы, ни их программирование.
Для микроконтроллеров семейства i8051 разработано множество разнообразных наборов микросхем (chip set), обеспечивающих различные прикладные задачи. Можно самостоятельно разрабатывать программы для взаимодействия микроконтроллера с этими микросхемами. Но в отличие от программирования чисто вычислительных задач в данном случае требуются дополнительные знания о логике работы этих устройств. Если есть возможность, то лучше использовать отработанные программы для взаимодействия микроконтроллеров с микросхемами, которые можно назвать драйверами в соответствии с применяемой для компьютеров терминологией. В связи с многочисленностью типов микросхем и разнообразием их применений рассмотрение вопроса программирования драйверов заслуживает отдельной книги. По этой причине в настоящей главе затронуты только наиболее существенные направления работы, которую должен проделать программист, чтобы обеспечить взаимодействие микроконтроллера с остальными частями изделия и с оператором. Приведенные примеры практически не касаются подробностей аппаратной реализации внешних устройств. Здесь мы остановимся только на программировании простейших задач ввода/вывода без использования дополнительных микросхем.
В первую очередь необходимо разобраться, каким образом организовать работу программы в реальном масштабе времени. Для этого программа должна обеспечить определенную цикличность выполнения всех задач во времени и оперативность реакции на внешние сигналы. Выполнение каждой из команд микроконтроллером занимает интервал времени, кратный периоду колебаний в задающем генераторе. Поэтому можно рассчитать длительности работы различных блоков программы. Теоретически возможно обеспечить синхронизацию работы программы посредством учета затрат времени на выполнение команд с последующим выполнением некоторого количества пустых команд, но о практических примерах такого рода слышать не приходилось. Для реакции на внешние сигналы можно запрограммировать периодическую проверку его наличия на соответствующем входе микроконтроллера. Но слишком большая частота опроса входа ухудшает производительность программы, а при малой частоте опроса время реакции на внешний сигнал будет большим. Для синхронизации работы программ и обработки внешних запросов в вычислительной технике используются прерывания (interrupt), которые позволяют обеспечить быструю реакцию на события без снижения производительности программы.
