Главная страница
Навигация по странице:

_08Л_Разработка устройств с МП. Проектирование микропроцессорных устройств



Скачать 440.5 Kb.
Название Проектирование микропроцессорных устройств
Анкор _08Л_Разработка устройств с МП.doc
Дата 05.05.2017
Размер 440.5 Kb.
Формат файла doc
Имя файла _08Л_Разработка устройств с МП.doc
Тип Анализ
#7975

Проектирование микропроцессорных устройств

(Общий подход)

В процессе проектирования электронных устройств на основе микропроцессоров в принципе необходимо разработать:

- общую функциональную схему, в которой необязательно определять какими средствами реализуются разные функции;

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

- алгоритм программной части;

- текст программы.

Весь процесс разработки и отладки может быть описан схемой на рис.1, взятой с сайта http://www.excode.ru/art6436.html.



Рис.1

1. Разработка принципиальной схемы

Рассмотрим подход к разработке принципиальной электрической схемы устройства с МК на примере схемы электрических часов (на основе статьи из интернета).

Разработка принципиальной схемы начинается с анализа структурной схемы. Структурная схема приведена на рис. 2.



Рис. 2. Структурная схема часов.
Анализируя структурную схему часов, можно выделить часть схемы, которая может быть выполнена с применением микроконтроллера. Это делители частоты, счётчик временных интервалов, схема установки внутреннего состояния счётчика временных интервалов и дешифратор. Для реализации полной схемы часов микроконтроллер придётся дополнить кварцевым резонатором, кнопками и светодиодными индикаторами.

Из блока индикации только дешифратор можно реализовать программно. Светодиодные индикаторы естественно должны быть подключены к выводам микроконтроллера.

Так как у микроконтроллера есть четыре восьмиразрядных параллельных порта, то к ним можно подключить четыре семисегментных светодиодных индикатора. Четырёх индикаторов достаточно для отображения информации о текущем времени. Это десятки и единицы минут, десятки и единицы секунд.

После подключения этих индикаторов остаются свободными четыре одиночных вывода параллельных портов. Эти выводы можно использовать для подключения трёх кнопок блока коррекции. Трёх кнопок будет вполне достаточно. Это кнопки коррекции часов, минут и установки счётчика секунд в нулевое состояние.

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

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

Следующей важной частью схемы включения микроконтроллера является задающий генератор. В техническом описании на микросхему приводится рекомендованная схема включения генератора. Если применяются комплектующие отличающиеся от рекомендованных в описании могут возникнуть трудности запуска генератора. Например, генератор может не запускаться при пониженных температурах. В этом случае типовая схема может быть изменена.

Для правильной работы микроконтроллера при включении питания необходимо осуществить сброс микросхемы. В типовых схемах подключения микроконтроллеров обычно в качестве схемы сброса при включении питания используется конденсатор CR номиналом 1 мкф. В современных микроконтроллерах обычно имеются встроенные схемы сброса и этот конденсатор не требуется.



Рис. 3. Принципиальная схема подключения микроконтроллера.

Теперь осталось начертить электрическую принципиальную схему согласно ЕСКД. Получившаяся принципиальная схема часов приведена на рис. 4.



Рис.4. Электрическая принципиальная схема часов.
Многие современные микроконтроллеры обеспечивают на выходах портов цифрового ввода/вывода значительный ток (20мА и более). Этого вполне достаточно для питания обычных светодиодных индикаторов и усилители на транзисторах VT1 могут отсутствовать.

2. Разработка управляющих программ


2.1. Написание программ для микропроцессоров.

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

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



Рис. 5. Алгоритм программы-монитора.

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

2.2. Система команд


Для обеспечения функциональной полноты типичная команда процессора должна содержать код команды, определяющий операцию, выполняемую над двумя двоичными числами, и до четырех операндов в виде их адресов в оперативной памяти. Первые два адреса нужны для определения местоположения чисел, над которыми выполняется операция. Третий адрес должен указать, куда записывается результат операции. Четвертый операнд это следующая команда, к которой надо перейти после завершения текущей. Если реализовать вычислительную систему непосредственно по приведенным соображениям, то получим вычислительную машину с большим объемом требуемой памяти и относительно низким быстродействием. Если для задания адреса требуется 16 бит, то четырехоперандная команда займет минимум 9 байт памяти. В PIC-микроконтроллерах команда занимает только 1,5 байта.

Сократить размер команды позволяет уменьшение числа адресов задаваемых в явном виде. В большинстве микроконтроллеров используются одноадресные, т.е. явно задается только один адрес. Это достигается следующими приемами:

1. Адрес следующей команды указывается только в командах переходов; в остальных случаях очередная команда выбирается из ячеек памяти, следующих за выполненной командой.

2. Использование команд с регистром аккумулятором, в котором находится один из операндов и в нем же запоминается результат операции.
Так как лабораторные работы у нас выполняются на микроконтроллерах фирмы Microchip мы будем рассматривать все на примере PIC–микроконтроллеров, но все выводы применимы и к микроконтроллерам других производителей.

В PIC используется RISC-система команд, характеризующаяся малым набором одноадресных инструкций (33, 35 или 58) в зависимости от разрядности шины программ в разных семействах (12, 14 или 16 бит). Каждая из них имеет длину в одно слово и большинство выполняется за один машинный цикл, состоящий из четырех тактов ГТИ. В системе команд отсутствуют сложные арифметические команды (умножение, деление), предельно сокращен набор условных переходов.
Систему команд микроконтроллера условно можно разбить на пять групп:

  • арифметические команды

  • логические команды

  • команды пересылки данных

  • команды ветвления программ и передачи управления

  • команды управления режимами работы микроконтроллера

Почти во всех форматах команд первые биты отводятся для кода операции, но далее форматы команд разных ЭВМ сильно отличаются друг от друга. Остальные биты должны определять операнды или их адреса, и поэтому они используются для комбинации режимов, адресов регистров, адресов памяти, относительных адресов и непосредственных операндов.

Обычно команда занимает в памяти одно машинное слово в памяти программ, но есть некоторые команды, которые имеют большую длину.

2.3. Режимы адресации


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

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

1) непосредственная. В этом случае операнд записывается в самой команде;

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

2) косвенная, которая предполагает, что в команде содержится значение косвенного адреса, т.е. адреса ячейки памяти, в которой находится окончательный исполнительный адрес.

В каждой микроЭВМ реализованы только некоторые режимы адресации, использование которых, как правило, определяется архитектурой МП.
С целью уменьшения числа разрядов адреса пространства оперативной памяти и памяти программ разбивается на крупные фрагменты называемые в некоторых микроконтроллерах (например в МК Microchip и Intel) банками и страницами соответственно. Номер банка или страницы в адресах команд отсутствует, но микроконтроллер пользуется тем банком который перед этим был выбран специальной командой (например BANKSEL и PAGESEL – в ассемблере MPASM).
2.4. Стадии подготовки программного обеспечения для микроконтроллеров

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

Можно использовать следующий порядок работ по подготовке программы для микроконтроллеров:

1. Разработка алгоритма.

2. Написание модулей программы на мнемоническом языке программирования (Ассемблер, Си, Паскаль и т.д.).

3. Ввод исходного текста программы текстовым редактором.

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

5. Сборка отдельных объектных модулей в единую программу в двоичном коде (HEX-файл) и с абсолютными адресами в памяти.

6. Отладка с помощью моделирующего отладчика в среде проектирования.

7. Макетная отладка с помощью отладочной платы, эмулирующей выбранный процессор или с процессором этого типа.

8. Занесение программы в память программ микроконтроллера (программирование или прошивка) с помощью программатора.

9. Макетная отладка на экспериментальном образце с помощью внутрисхемного отладчика и программатора.
3. Языки программирования для микроконтроллеров.

В настоящее время исходный текст программы пишется на одном из языков программирования.



Рис.6. Классификация программ-трансляторов языков программирования.

Сами языки программирования в свою очередь делятся на две группы:

  1. Языки программирования "высокого" уровня.

  2. Языки программирования "низкого" уровня.

К языкам программирования "низкого" уровня относятся языки программирования в которых каждому оператору соответствует не более одной машинной команды. Набор машинных команд каждого конкретного процессора обязательно входит в состав такого языка программирования. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название автокоды). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.

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

В тех случаях, когда объём ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемблеру нет. Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях).

Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объём памяти программ (несколько десятков килобайт). Увеличение объёма программы связано с несколькими факторами:

  1. Язык программирования рассчитывается на все случаи жизни, поэтому в большинстве случаев человек мог бы написать программу короче (исключив не нужные в данном конкретном случае проверки или защиты).

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

  3. Программист не использует подпрограммы там, где они могли бы сократить объём программы, так как на языке программирования высокого уровня это всего один или несколько операторов.

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

4. Виды компиляторов

Программы-компиляторы бывают оценочные и профессиональные.

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

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

5. Применение комментариев

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

Стиль написания программ с развитыми комментариями позволяет значительно экономить время, так как не приходится повторно разбираться с уже написанными участками кода при поиске ошибки программы.

Программа, написанная на языке программирования ассемблер, читается прежде всего по комментариям и только потом, если этого недостаточно, проводится разбор команд на языке программирования.

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

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

Более крупные блоки алгоритма отражаются комментариями, пересекающими всю программу. Эти комментарии пишут буквами верхнего регистра, чтобы было легко заметить этот комментарий.

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

6. Применение подпрограмм

При написании программ часто при реализации алгоритма работы устройства приходится повторять одни и те же операторы (например операторы, работающие с параллельным или последовательным портом). Было бы неплохо использовать один и тот же участок кода, вместо того, чтобы повторять одни и те же операторы несколько раз.

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

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



Рис.7. Вызов подпрограммы и возврат к выполнению основной программы.
Для того, чтобы получить возможность возвращаться на команду, следующую за командой вызова подпрограммы, требуется запомнить адрес этой команды. Адрес возврата хранится в особых ячейках памяти. После выполнения подпрограммы необходимо осуществить переход к адресу, который записан в этих ячейках.

Для обращения к подпрограмме и возврата из неё в систему команд микропроцессоров используют команды CALL и Return. Эти команды не только осуществляют передачу управления на указанный адрес, но и запоминают адрес команды, следующей за командой вызова подпрограммы. Команда возврата из подпрограммы RETURN передаёт управление команде, адрес которой был запомнен командой вызова подпрограммы.

Внимание! Ни в коем случае нельзя попадать в подпрограмму любым способом кроме команды вызова подпрограммы CALL! В противном случае команда возврата из подпрограммы передаст управление случайному адресу! По этому адресу могут быть расположены данные, которые в этом случае будут интерпретированы как программа, или обратиться к внешней памяти, откуда будут считываться случайные числа.

Очень часто требуется из одной подпрограммы обращаться к другой подпрограмме. Такое обращение к подпрограмме называется вложенным или рекурсивным. Количество вложенных подпрограмм называется уровнем вложенности подпрограмм. Максимально допустимый уровень вложенности подпрограмм определяется количеством ячеек памяти, предназначенных для хранения адресов возврата из подпрограмм.

Ячейки памяти, в которых хранятся адреса возврата из подпрограмм называются стеком. Логически эти ячейки памяти организованы так, чтобы считывание последнего записанного адреса производилось первым, а первого записанного адреса производилось последним. Такая логическая организация формируется специальным счётчиком. Этот счётчик называется указателем стека SP. Ячейка памяти, в которую в данный момент может быть записан адрес возврата из подпрограммы, называется вершиной стека. Количество ячеек памяти, предназначенных для организации стека, называется глубиной стека. Последняя ячейка памяти, в которую можно производить запись называется дном стека. Логическая организация стека приведена на следующем рисунке:



Рис.8. Организация стека в памяти данных микропроцессора.
написать администратору сайта