Ошибка

Выражения признательности

Категория: Электроприводы
Опубликовано 11.07.2011 11:48
Автор: Super User
Просмотров: 2464

Выражения признательности

Во-первых, я хотел бы поблагодарить Скотта Грина, моего редактора в издательстве McGraw-Hill. Ему принадлежит идея создания книги, и эта работа оказалось для меня наиболее интересной в данный момент. Работа над книгой расширит мои знания, и я счастлив, что мне представилась возможность набраться опыта в данной области. Я очень признателен Скотту за его терпеливую помощь в создании этой и предыдущей моих книг, а также за руководство в процессе их подготовки к изданию.

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

В написании моей первой книги мне сильно помог Дэйв Кохран из Pipe- Thompson (местный представитель производителя). В процессе создания данной книги я продолжал работать с Дэйвом, а также с Грэгом Андерсеном и Алом Ловерихом из Microchip. Друзья, спасибо Вам за помощь и руководство в освоении микроконтроллеров PICmicro.

Я бы хотел поблагодарить Джима Феррела из сектора полупроводниковых приборов Motorola и Дэрека Клотца из торонтского отдела продаж этой фирмы. Я был поражен Вашим энтузиазмом в области разработки устройств с применением микроконтроллеров семейства 68НС05, и высоко ценю Вашу помощь в получении информации и образцов этих приборов. Когда я писал эту книгу, Motorola объявила, что выпустила более 2 миллиардов микроконтроллеров 68НС05. Поэтому нет ничего удивительного в том, что я получал огромную поддержку и ощущал такой энтузиазм с их стороны.


Фрэнк Тэйлор из Dallas Semiconductors провел со мной много времени, помогая освоить выпускаемые этой фирмой микроконтроллеры, которые совместимы с семейством 8051 фирмы Intel, и их усовершенствованные модели, находящиеся в производстве. Хочу так же выразить признательность Арану Зараби из Intelletech за его готовность ответить на волнующие меня вопросы и предоставить образцы микроконтроллеров. Я высоко ценю Вашу помощь.

Один из самых новых микроконтроллеров, появившихся на рынке, — это A VR. Хочу поблагодарить Криса Хэйдена и Джо Янга из фирмы Atmel за то, что они уделили мне время и помогли найти необходимую информацию.

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

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


Особо благодарю Филиппа Техера из Virtual Micro Design и Дона МакКензи из Dontronics за понимание и помощь в предоставлении образцов их продукции. Как UMPS, так и SimmStick являются прекрасными средствами, помогающими разрабатывать новые виды устройств. Поэтому ваши усилия по развитию и поддержке данной продукции заслуживают одобрения.

Майк Предко Торонто, Онтарио, Канада

Введение

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

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


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

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


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

Те, кто не знаком с микроконтроллерами, могут подумать, что это прибор с жестко заданными (стандартизированными) функциями. Это абсолютно не так. Термин «микроконтроллер» — это очень общий термин, содержание которого обычно определяется производителем. Однажды я встретил такое определение поэзии — «это проза, в которой строчка не занимает все пространство строки». Мое определение микроконтроллера не такое точное, как постулаты дзен-буддизма, но оно и не столь специфично, как определения, используемые для других приборов. «Микроконтроллер — это самостоятельная компьютерная система, которая содержит процессор, вспомогательные схемы и устройства ввода-вывода данных, размещенные в общем корпусе» (рис.В.1.)

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


Кристалл микроконтроллера

Рис. В.1. Общая структура микроконтроллера.

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

При разработке систем управления различными процессами и объектами использование микроконтроллеров дает проектировщику значительные преимущества.


Микроконтроллеры отличаются не только архитектурой и характеристиками, но и особенностями функционирования и реализации. Большинство микроконтроллеров представляют собой процессор, интегрированный с памятью и устройствами ввода/вывода данных. Некоторые микроконтроллеры не являются реальными приборами, а имеют вид макромоделей, описанных на языке высокого уровня VHDL, которые созданы для включения в состав специализированных заказных микросхем (ASIC - Application Specific Integrated Circuits). Такая реализация позволяет инженеру-проектировщику вести в разрабатываемую микросхему память и устройства ввода/вывода данных, которые соответствуют требованиям технического задания. Практически все микроконтроллеры входят в состав определенных семейств, члены которых отличаются составом и характеристиками периферийных устройств, реализованных на кристалле.

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

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


В этой книге делается попытка преодолеть некоторые из указанных трудностей и предоставить справочную информацию о некоторых из наиболее распространенных 8-битовых «встраиваемых»(embedded) микроконтроллерах, доступных пользователям в настоящее время.

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

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


Совершенно очевидно, что в рамках одной книги невозможно рассмотреть все семейства микроконтроллеров со всеми их представителями. Даже если бы это было возможно, то появление на рынке новых моделей сделало бы ее устаревшей уже спустя 3-4 месяца. Эта книга имеет целью дать общее представление об архитектуре наиболее популярных 8-разрядных микроконтроллеров с объяснением, какие характеристики они имеют, как их программировать (как создавать программное обеспечение и вводить в прибор исполняемый код), и где получить дополнительную информацию.

Дополнительная информация и источники

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


Условные обозначения

К - 1000 Ом

µF – микрофарады

ms – миллисекунды

µs - микросекунды

oxonn, $nn, Onnh, H'nn' - шестнадцатеричное число

ObOnnn, %nnn, Onnnb, B'nnn' - двоичное число

nnn, Onnnd - десятичное число

AND или & - логическое «И»

OR или | - логическое «ИЛИ» XOR или « - логическое «Исключающее ИЛИ»

_ Имя (условное обозначение вывода) - вывод активизируется низким уровнем сигнала (логический «0»). В справочных данных некоторых производителей такие выводы обозначаются предшествующим знаком «!» или чертой над обозначением (именем) вывода.

Часть


1

ВВЕДЕНИЕ В МИКРОКОНТРОЛЛЕРЫ

глава

1

МИКРОКОНТРОЛЛЕРЫ

Краткое содержание

Виды микроконтроллеров

Встроенные микроконтроллеры Микроконтроллеры с внешней памятью Цифровые сигнальные процессоры

Архитектуры процессоров

CISC против RISC

ГАРВАРД против ПРИНСТОНА

Виды памяти для микроконтроллеров

Память программ (ROM)


Память данных (RAM)

Стеки

Регистры микроконтроллера

Пространство ввода-вывода

При работе с микроконтроллерами необходимо иметь в виду следующее обстоятельство. Когда разрабатывается система на основе микроконтроллера, то создаются не только аппаратные средства, которые реализуются соответствующим подключением микроконтроллера к внешним устройствам. Разработчик должен также обеспечить выполнение многих системных функций, которые в традиционных микропроцессорных системах обеспечиваются с помощью операционной системы и специальных периферийных микросхем. Это позволяет различными способами оптимизировать проект — как его аппаратную, так и программную часть, для конкретного применения. В данной книге даются некоторые рекомендации по поводу выполнения такой оптимизации. Часть данной главы посвящена краткому описанию различий между 8-разрядными микроконтроллерами и микроконтроллерами с большей разрядностью (16 и 32 бит). Эти сложные устройства выполняют функции целых


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

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

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

Различные типы микроконтроллеров

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


Встраиваемые микроконтроллеры

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

Основное назначение встраиваемых микроконтроллеров — обеспечить с помощью недорогих средств гибкое (программируемое) управление объектами и связь с внешними устройствами. Эти микроконтроллеры не предназначены для реализации комплекса сложных функций, но они способны обеспечить эффективное управление во многих областях применения. Недорогими будем считать микроконтроллеры, стоимость которых составляет от 1,0 до 20,0 долларов за штуку (цена зависит от технических характеристик, количества выводов корпуса, объема закупок).


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


Общая структура микроконтроллера показана на рис. 1.1. Эта структура дает представление о том, как микроконтроллер связывается с внешним миром.

Кристалл микроконтроллера

Рис. 1.1. Структура микроконтроллера

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


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

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

Типичные значения максимальной частоты тактовых сигналов составляют для различных микроконтроллеров 10 - 20 МГц. Главным фактором, ограничивающим их скорость, является время доступа к памяти, применяемой в микроконтроллерах. Однако для типичных применений это ограничение не является существенным.

Микроконтроллеры с внешней памятью

Некоторые микроконтроллеры (особенно 16- и 32-разрядные) используют только внешнюю память, которая включает в себя как память программ (ROM), так и некоторый объем памяти данных (RAM), требуемый для данного применения. Структура микроконтроллера с внешней памятью показана на рис. 1.2.


Рис. 1.2. Блок схема микроконтроллера с внешней памятью.

Классическим примером такого микроконтроллера является Intel 80188. По существу он представляет собой микропроцессор 8088, который использовался в компьютерах IBM PC, интегрированный на общем кристалле с дополнительными схемами, реализующими ряд стандартных функций, таких как прерывания и прямой доступ к памяти (DMA). Цель создания 80188 состояла в том, чтобы объединить в одном корпусе все устройства, необходимые инженеру для реализации систем, в которых могут использоваться функциональные возможности и программное обеспечение микропроцессора 8088.

Аналогичные цели достигаются при использовании микроконтроллера 80186, который имеет 16-разрядную внешнюю шину (80188 имеет 8-разрядную внешнюю шину) и представляет собой 16-разрядный процессор 8086, интегрированный на общем кристалле с дополнительными периферийными схемами (такими же, как в 80188). Также как микропроцессор 8088 является упрошенной (8-разрядная внешняя и 16-разрядная внутренняя шина) версией 8086 (16-разрядные внешняя и внутренняя шины), так и микроконтроллер 80188 является упрощенной версией 80186.

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


Цифровые сигнальные процессоры

Цифровые сигнальные процессоры (DSP) — относительно новая категория процессоров. Назначение DSP состоит в том, чтобы получать текущие данные от аналоговой системы и формировать соответствующий отклик. DSPh их ALU (Arithmetic Logic Unit — арифметико-логическое устройство, которое является аппаратным средством для выполнения вычислений) работают с очень высокой скоростью, что позволяет осуществлять обработку данных в реальном масштабе времени. DSP часто используются в активных шумоподавляюших микрофонах, которые устанавливаются в самолетах (второй микрофон обеспечивает сигнал окружающего шума, который вычитается из сигнала первого микрофона, позволяя таким образом подавить шум и оставить только голос) или для подавления раздвоения изображения в телевизионных сигналах.

Разработка DSP алгоритмов — это специальный раздел теории управления. Изложение этой теории требует использования весьма продвинутой математики и выходит за рамки данной книги (хотя позже вы познакомитесь с «нечеткой логикой», которая представляет собой нетрадиционный метод управления системами с помощью компьютера).


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

Архитектура процессоров

Как указано выше, мне бы не хотелось вдаваться в дискуссию по поводу того, какая из архитектур лучше — CISC или RISC, Гарвардская или Принстонская. Я попытаюсь объяснить различия между этими архитектурами и показать, какое отношение они имеют к микроконтроллерам.

CISC против RISC

В настоящее время существует множество RISC (Reduced Instruct Set Computers — компьютеры с сокращенной системой команд) процессоров, так как сложилось мнение, что RISC быстрее чем CISC (Complex Instruction Set Computers : Компьютеры со сложной системой команд) процессоры. Такое мнение не совсем верно. Имеется много процессоров называемых RISC, но на самом деле относящихся к CISC. Более того, в некоторых приложениях CISC-процессоры выполняют программный код быстрее, чем это делают RISC-процессоры, или решают такие задачи, которые RISC-процессоры не могут выполнить.


Каково истинное различие между RISC и CISC? CISC-процессоры выполняют большой набор команд с развитыми возможностями адресации (непосредственная, индексная и т.д.), давая разработчику возможность выбрать наиболее подходящую команду для выполнения необходимой операции. В RISC-процессорах набор выполняемых команд сокращен до минимума. При этом разработчик должен комбинировать команды, чтобы реализовать более сложные операции. Ниже будет показано, как операции загрузки в стек («push») и извлечения из стека («pop») реализуются в RISC-процессорами с помощью двух простых команд.

Возможность равноправного использования всех регистров процессора называется «ортогональностью» или «симметричностью» процессора. Это обеспечивает дополнительную гибкость при выполнении некоторых операций. Рассмотрим, например, выполнение условных переходов в программе. В CISC-процессорах условный переход обычно реализуется в соответствии с определенным значением бита (флага) в регистре состояния. В RISC-процессорах условный переход может происходить при определенном значении бита, который находится в любом месте памяти. Это значительно упрощает операции с флагами и выполнение программ, использующих эти флаги.


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

ГАРВАРД против ПРИНСТОНА

Много лет назад правительство Соединенных Штатов дало задание Гарвардскому и Принстонскому университетам разработать архитектуру компьютера для военно-морской артиллерии. Принстонский университет разработал компьютер, который имел общую память для хранения программ и данных. Такая архитектура компьютеров больше известна как архитектура Фон-Неймана по имени научного руководителя этой разработки (рис. 1.3).

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


Рис. 1.3. Структура компьютера с Принстонской архитектурой.

Гарвардский университет представил разработку компьютера, в котором для хранения программ, данных и стека использовались отдельные банки памяти (рис. 1.4)

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

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

Основным преимуществом архитектуры Фон Неймана является то, что она упрощает устройство микропроцессора, так как реализует обращение только к одной общей памяти. Для микропроцессоров самым важным является то, что содержимое ОЗУ (RAM - Random Access Memory) может быть использовано как для хранения данных, так и для хранения программ. В некоторых приложениях программе необходимо иметь доступ к содержимому стека. Все это предоставляет большую гибкость для разработчика программного обеспечения, прежде всего в области операционных систем реального времени, о которых пойдет речь позднее.


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

Рис. 1.4. Структура компьютера с Гарвардской архитектурой

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

Рис. 1.5. Выполнение команды mov Асе, Reg в Принстонской архитектуре

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


Рис. 1.6. Выполнение команды mov Асе,Reg в Гарвардской архитектуре.

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

Например, микроконтроллер PIC фирмы Microchip выполняет любую команду, кроме тех, которые модифицируют содержимое программного счетчика, за четыре такта (один цикл). Это упрощает реализацию критических ко времени процедур по сравнению с микроконтроллером Intel 8051, где для выполнения команд может потребоваться от 16 до 64 тактов. Из-за этого часто не удается подсчитать точное время выполнения программы вручную и приходится применять симуляторы или аппаратные эмуляторы.

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


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

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

Типы памяти микроконтроллеров

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


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

Память программ

Для хранения программ обычно служит один из видов постоянной памяти: PROM (однократно-программируемое ПЗУ), EPROM (электрически программируемое ПЗУ с ультрафиолетовым стиранием), EEPROM (ПЗУ с электрической записью и стиранием, к этому виду относятся также современные микросхемы Flash-памяти) или ROM (масочнопрограммируемое ПЗУ). Все эти виды памяти являются энергонезависимыми — это означает, что содержимое памяти сохраняется после выключения питания микроконтроллера. Такая память необходима, так как микроконтроллер не содержит каких-либо устройств массовой памяти (магнитных дисков), с которых загружается программа в компьютерах. Программа постоянно хранится в микроконтроллере.

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


Следует обратить внимание, что разрядность микроконтроллера (8, 16 или 32 бит) указывается в соответствии с разрядностью его шины данных. В Гарвардской архитектуре команды могут иметь большую разрядность, чем данные, чтобы дать возможность считывать за один такт целую команду. Например, микроконтроллеры PIC в зависимости от модели используют команды с разрядностью 12, 14 или 16 бит. В микроконтроллерах AVR команда всегда имеет разрядность 16 бит. Однако все эти микроконтроллеры имеют шину данных разрядностью 8 бит.

В устройствах с Принстонской архитектурой разрядность данных обычно определяет разрядность (число линий) используемой шины. В микроконтроллерах Motorola 68HC05 24-разрядная команда размещается в трех 8-разрядных ячейках памяти программ. Для полной выборки такой команды необходимо произвести три цикла считывания этой памяти.

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

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


ROM является самым дешевым типом постоянной памяти для массового производства. Однако она имеет ряд существенных недостатков, которые привели к тому, что в последние годы этот тип памяти почти не используется. Основными недостатками являются значительные затраты средств и времени на создание нового комплекта фотошаблонов и их внедрение в производство. Обычно такой процесс занимает около десяти недель и является экономически выгодным при выпуске десятков тысяч приборов. Только при таких объемах производства обеспечивается преимущество ROM по сравнению с E(E)PROM. Существует также ограничение, связанное с возможностью использования таких микроконтроллеров только в определенной сфере применения, так как его программа обеспечивает выполнение жестко фиксированной последовательности операций, и не может быть использована для решения каких-либо других задач.

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

Ячейка памяти EPROM представляет собой MOS-транзистор с плавающим затвором, который окружен диоксидом кремния (SiO2). Сток транзистора соединен с «землей», а исток подключен к напряжению питания с помощью резистора. В стертом состоянии (до записи) плавающий затвор не содержит заряда, и MOS-транзистор закрыт. В этом случае на истоке поддерживается высокий потенциал, и при обращении к ячейке считывается логическая единица. Программирование памяти сводится к записи в соответствующие ячейки логических нулей.


Программирование осуществляется путем подачи на управляющий затвор высокого напряжения (рис 1.7). Этого напряжения должно быть достаточно, чтобы обеспечить пробой между управляющим и плавающим затвором, после чего заряд с управляющего затвора переносится на плавающий. MOS-транзистор переключается в открытое состояние, закорачивая исток с землей. В этом случае при обращении к ячейке считывается логический нуль.

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

Рис 1.7. Ячейка памяти EPROM.

Обычно, микросхемы EPROM производятся в керамическом корпусе с кварцевым окошком для доступа ультрафиолетового света. Такой корпус довольно дорог, что значительно увеличивает стоимость микросхемы. Для уменьшения цены микросхемы EPROM заключают в корпус без окошка (версия EPROM с однократным программированием). Сокращение стоимости при использовании таких корпусов может быть настолько значительным, что эти версии EPROM в настоящее время часто используются вместо масочно-программируемых ROM.


Раньше микроконтроллеры программировались только с помощью параллельных протоколов, достаточно сложных для реализации. В настоящее время протоколы программирования современной EPROM и EEPROM памяти существенно изменились, что позволило выполнять программирование микроконтроллера непосредственно в составе системе, где он работает. Такой способ программирования получил название «in-system programming» или «ISP». ISP-микроконтроллеры могут быть запрограммированы после того, как их припаяли на плату. При этом сокращаются расходы на программирование, так как нет необходимости в использовании специального оборудования — программаторов.

Память EEPROM (Electrically Erasable Programmable Memory — электрически стираемая программируемая память) можно считать новым поколением EPROM памяти. В такой памяти ячейка стирается не ультрафиолетовым светом, а путем электрического соединения плавающего затвора с «землей». Использование EEPROM позволяет стирать и программировать микроконтроллер, не снимая его с платы. Таким способом можно периодически обновлять его программное обеспечение.

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


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

Функционально Flash-память мало отличается от EEPROM. Основное различие состоит в способе стирания записанной информации. В памяти EEPROM стирание производится отдельно для каждой ячейки, а во Flash-памяти стирание осуществляется целыми блоками. Если Вы хотите изменить содержимое одной ячейки Flash-памяти, то Вам потребуется перепрограммировать целый блок, (или всю микросхему). В микроконтроллерах с памятью EEPROM можно изменять отдельные участки программы без необходимости перепрограммировать все устройство.

Часто указывается, что микроконтроллер имеет Flash-память, хотя на самом деле он содержит EEPROM. В настоящее время между этими типами памяти имеется мало различий, поэтому некоторые производители используют ли термины как эквивалентные.


Память данных

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

Если Вы пишите программы для персонального компьютера (PC), то у Вас. вероятно, возникнет вопрос, что можно сделать с таким маленьким объемом памяти. Вероятно, Ваши приложения для PC содержат переменные, объем которых измеряется в килобайтах, не считая используемых массивов данных. При использовании массивов требуемый объем памяти может составлять сотни килобайт. Так что же можно сделать, имея объем ОЗУ порядка 25 байт?

Дело в том, программирование для микроконтроллера выполняется по несколько другим правилам, чем программирование PC. Применяя некоторые несложные правила можно решать многие задачи с использованием небольшого объема памяти RAM. При программировании микроконтроллеров константы, если возможно, не хранятся как переменные. Максимально используются аппаратные возможности микроконтроллеров (такие как таймеры, индексные регистры), чтобы по возможности ограничить размещение данных в RAM. Это означает, что при разработке прикладных программ необходимо предварительно позаботиться о распределении ресурсов памяти. Прикладные программы должны ориентироваться на работу без использования больших массивов данных.


Стек

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

обратном порядке. По этой причине, стек часто называют очередью типа L1F (Last In, First Out) - «последний пришел, первый ушел».

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


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

В Гарвардской архитектуре стековые операции могут производиться в памяти, специально выделенной для этой цели. Это означает, что при выполнении команды вызова подпрограммы «call» процессор с Гарвардской архитектурой выполняет несколько действий одновременно. В Принстонской архитектуре при выполнении команды «call» следующая команда выбирается после того, как в стек будет помещено содержимое программного счетчика.

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

Если в процессоре выделен отдельный стек, и объем записанных в него данных превышает его емкость, то происходит циклическое изменение содержимого указателя стека, и указатель стека начинает ссылаться на ранее заполненную ячейку стека. Это означает, что после слишком большого количества команд «call» в стеке окажется неправильный адрес возврата, который был записан вместо правильного адреса. Если микропроцессор использует общую область памяти для размещения данных и стека, то существует опасность, что при переполнении стека произойдет запись в область данных, либо будет сделана попытка записи загружаемых в стек данных в область ROM.


Теперь рассмотрим возможности сохранения в стеке содержимого регистров. В некоторых архитектурах нет команд, выполняющих загрузку содержимого регистров в стек «push» и извлечения из стека «pop». Из четырех семейств микроконтроллеров, описанных в этой книге, только два имеют такие команды. Однако команды «push» и «pop» могут быть легко реализованы при помощи индексного регистра, который явно указывает на область стека. При этом вместо каждой из команд «push» и «pop» используются две команды, указанные ниже:

Push ; Загрузка данных в стек

move [index], асс ; Сохранить содержимое аккумулятора в стеке
decrement index ; Перейти к следующей ячейке стека

Pop ; Извлечь данные из стека

increment index ; Перейти к предыдущей ячейке стека

move асс, [index] ; Поместить содержимое стека в аккумулятор

Конечно такое решение является менее эффективным, чем использование специальных команд «push» и «pop», а используемый индексный регистр может


потребоваться для других целей. Однако это решение обеспечивает имитацию стека при использовании процессоров, у которых такие команды отсутствуют. Существует еще одна проблема с приведенными выше примерами. Что случится, если произойдет прерывание между первой и второй командой, которые имитируют операции «push» и «pop»? Если программа обработки прерывания использует стек, то записанные в нем данные будут потеряны. Для предотвращения этого можно запретить прерывания перед выполнением этих команд или переставить их в следующем порядке:

Push ; загрузить данные в стек

Decrement index ; Перейти к следующей ячейке стека

move [index], асс ; Сохранить содержимое аккумулятора в стеке

Pop ; извлечь данные из стека

move асс, [index] ; Поместить значение стека в аккумулятор
increment index ; Перейти к предыдущей ячейке стека

Если после первой команды программа будет прервана, то после выполнения обработки прерывания содержимое стека не будет потеряно.


Регистры микроконтроллера Пространство ввода-вывода

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

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

Рассмотрим пример процедуры ветвления программы при условии, что определенный бит в регистре порта ввода-вывода установлен в 1. Для CISC-процессора соответствующий псевдокод будет выглядеть следующим образом:


Accumulator = lOPort ;3агрузить содержимое регистра

lOPort в аккумулятор

Accumulator = Accumulator & (1«Bit) ;Маскировать все биты аккумулятора, кроме Bit

if ZeroFlag != О ;Если Zero, то бит Bit=1

goto Address

Эта процедура будет компилироваться в последовательность операций:

if IQPort.Bit == 1 goto Address

Ассемблерная запись для микроконтроллеров Microchip PIC:

btfsc lOPort, Bit Пропустить следующую команду, если бит

Bit=O

goto Address

Более эффективно эта процедура реализуется в микроконтроллере Intel 8051: jb lOPort.Bit, Address ;Перейти, если бит Bit=1

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


Одним из важных вопросов является размещение регистров в адресном пространстве. В некоторых процессорах все регистры и RAM располагаются в одном адресном пространстве. Это означает, что память совмещена с регистрами. Такой подход называется «отображением устройств ввода-вывода на память».

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

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


Внешняя память

Несмотря на огромные преимущества использования внутренней встроенной памяти, в некоторых случаях необходимо подключение к микроконтроллеру дополнительной внешней памяти (как памяти программ, так и данных). Существует два основных способа подключения внешней памяти. Первый способ — подключение внешней памяти к микроконтроллеру, как к микропроцессору. Многие микроконтроллеры содержат специальные аппаратные средства для такого подключения. Второй способ состоит в том, чтобы подключить память к устройствам ввода-вывода и реализовать обращение к памяти через эти устройства программными средствами. Такой способ позволяет использовать простые устройства ввода-вывода без реализации сложных шинных интерфейсов. Выбор наилучшего из этих способов зависит от конкретного приложения.

Глава

2

АППАРАТНЫЕ СРЕДСТВА

Краткое содержание


Корпуса микроконтроллеров Технология изготовления кристаллов

Питание

Потребляемая мощность Подключение питания

Reset (Сброс)

Тактовые сигналы и генераторы

Командные циклы Программный счетчик

Арифметико-логическое устройство

Сторожевые таймеры

Подпрограммы и функции

Прерывания

Таймеры

Цифровой ввод-вывод

Преобразование уровня

Последовательный ввод-вывод


Асинхронная последовательная связь

Синхронная последовательная связь

Шина MICROWIRE

Синхронный последовательный интерфейс

Сети

I2CCAN

Аналоговый ввод-вывод Ведомые устройства Программирование микроконтроллеров

Безопасность памяти программ

Интерфейсы отладки

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

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


Корпуса устройств

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

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

Микроконтроллеры с памятью EPROM, помещенные в пластмассовый корпус, обычно называются однократно программируемыми (ОТР - One-Time Programmable). Такой микроконтроллер может быть запрограммирован только один раз, так как пластиковый корпус не позволяет производить стирание содержимого памяти программ типа EPROM путем освещения кристалла ультрафиолетом (рис 2.1).


Рис 2.1. Пластмассовый корпус для однократно программируемых приборов.

Одна из основных причин размещения микроконтроллера в керамическом корпусе — это возможность создания в нем кварцевого окошка для стирания EPROM (рис 2.2). Когда используется керамический корпус, кристалл приклеивается к его нижней половине и соединяется проводниками с рамкой, на которой расположены внешние выводы. Керамические корпуса обычно выпускаются со штыревыми выводами, которые вставляются в сквозные металлизированные отверстия на печатной плате (монтаж по технология РТН - Plated-Through Hole). Для пластмассовых корпусов возможен более широкий выбор вариантов монтажа на плате. Керамический корпус может значительно увеличить стоимость отдельной микросхемы, так он более чем в 10 раз дороже пластмассового. Поэтому микроконтроллеры в керамических корпусах используются обычно во время отладки разрабатываемых систем, когда дополнительные расходы из-за применения корпусов с кварцевым окошком являются оправданными.

Рис. 2.2 Керамический корпус с кварцевым окошком.

Технология установки микросхемы на печатную плату существенно изменилась за последние годы. В 80-х годах практически все микросхемы выпускались со штыревыми выводами, которые запаивались в отверстия на печатной плате (рис 2.3). Преимуществом этой технологии монтажа (РНТ-технология) является ее простота — для производства таких плат не требуется сложное оборудование и специальная подготовка. Недостатком является то, что отверстие занимает на плате значительную площадь, и расстояние между соседними выводами микросхемы должно быть существенно больше, чем при использовании технологии поверхностного монтажа (SMT — Surface Mount Technology), когда выводы микросхемы припаиваются к поверхности платы (рис.2.4).


Рис. 2.4. Сравнительные размеры РТН и SMT корпусов

Рис. 2.3. Сквозное соединение.

Для SMT-монтажа используются корпуса с двумя основными типами выводов (рис. 2.5): типа «gull wing» и типа «J». Оба типа выводов имеют свои преимущества. Корпуса с выводами типа «gull wing» позволяют производить ручную пайку и обеспечивают более простой контроль паянных соединений. Применение корпусов с выводами типа «J» уменьшает площадь печатной платы. В настоящее время корпуса с выводами «gull wing» значительно более популярны, так как их использование позволяет применять более простое производственное оборудование и обеспечить переход к сверхплотному монтажу, когда расстояния между центрами выводов уменьшаются до 0,41 мм.

Рис. 2.5. Планарная технология корпусов

Уменьшение размера корпуса и шага расположения выводов позволяет
значительно увеличить плотность упаковки компонентов на плате, которая
определяется количеством корпусов, размещаемых на единице площади. Типичное значение шага расположения выводов для РТН-корпусов составляет
2,54 мм, тогда как шаг для SMT-корпуса имеют шаг выводов от 1,27 мм до
0,41 мм. SMT-корпуса с малым шагом выводов известны под названием «fine
pitch».


Чтобы оценить, как выбор корпуса влияет на плотность упаковки компонентов на плате, рассмотрим пример использования РТН-корпуса с шагом выводов 2,5 мм и SMT-корпуса с шагом 1,27 мм. SMT-корпус в два раза меньше по всем измерениям — это значит, что на месте одного РТН-корпуса можно разместить четыре SMT-корпуса. Кроме того, при отсутствии отверстий компоненты могут размещаться с обеих сторон печатной платы. В результате получаем увеличение плотности упаковки в восемь раз.

Чтобы повысить плотность упаковки компонентов и увеличить число выводов микросхемы, шаг выводов для SMT-корпусов был уменьшен до 0,5 мм. Но в процессе разработки корпусов с большим числом выводов были предложены новые технологии, которые позволяют упростить монтаж печатных плат.

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


Для микросхем с большим количеством выводов (более 300) РТН-корпуса обычно не используются из-за их большого размера. С SMT-корпусами также возникают проблемы, так как трудно обеспечить параллельность всех выводов, нарушение которой вызывает брак при монтаже микросхем на плату. Для монтажа кристаллов с очень большим количеством выводов используются технологии шариковых выводов - BGA (Ball Grid Array), непосредственного монтажа кристаллов на плату - СОВ (Chip On Board) и автоматического монтажа на ленту — ТАР (Таре Automated Bonding).

В технологии BGA для присоединения микросхемы к плате используется двумерная матрица шариков припоя, расположенных на на нижней стороне корпуса (рис. 2.6). Для микросхем с большим числом выводов BGA-корпуса дают значительное преимущество по сравнению с традиционными SMT-корпусами. Рассмотрим в качестве примера 304-выводную микросхему. SMT-корпус представляет собой плоский прямоугольный корпус QFP(Quad Flat Pack), по четырем сторонам которого расположены выводы с шагом 0,52 мм. BGA-корпус содержит матрицу 16x19 шариковых выводов с шагом 1,27 мм. Минимальный размер каждой стороны SMT-корпуса составит 3,9 см (площадь корпуса 15,4 см2), тогда как размер BGA-корпуса составит 2,16x2,54 см (5,5 см2). В рассмотренном примере BGA-корпус занимает в три раза меньшую площадь, чем QFP. Кроме того BGA-корпус проще устанавливать и паять на плату, так как он имеет больший шаг выводов.


Рис. 2.6. Корпус типа BGA

Выводы QFP-корпуса очень хрупкие, так как при шаге 0,52 мм их диаметр составляет всего около 0,3 мм. Шариковые выводы BGA-корпуса значительно более твердые. Из-за хрупкости выводов установка и пайка SMT-корпусов обычно осуществляется полностью автоматически, без участия человека. При монтаже BGA-корпусов нет необходимости соблюдать такие предосторожности.

Установка BGA-корпусов на плату и их демонтаж требуют того же оборудования, что и SMT-корпуса. Однако для контроля качества монтажа плат с BGA-корпусами требуется более сложная аппаратура, включая рентгеновские установки. BGA-корпуса имеют более высокое качество: процент брака для SMT-корпусов составляет 0,002-0,005, а для BGA-корпусов - 0,0001-0,0002 и менее.

При использовании технологии СОВ (Chip On Board) кристалл непосредственно монтируется на плату. В настоящее время применяются два способа крепления кристаллов.

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


Рис. 2.7. Корпус типа СОВ.

Второй способ известен под названием «технология С4» и фактически очень похож на BGA-процесс, описанный ранее. Шариковые выводы, используемые в этом процессе, называются «выпуклостями» (bumps), потому что они намного меньше BGA-шариков (рис 2.8). Первоначально эта технология была разработана IBM для монтажа кристаллов в керамических корпусах без использования соединительных проволочек.

Рис. 2.8. Монтаж на плату с использованием технологии С4.

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


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

Имеется еще одна технология монтажа, которая представляет собой комбинацию SMT и СОВ. Это автоматический монтаж на ленту - TAB (Tape Automated Bonding). В данном случае контактные площадки кристалла привариваются к медной ленте с изолирующим покрытием, на которой путем штамповки создана рамка с выводами. Эти выводы затем припаиваются к металлическим проводникам на печатной плате (рис. 2.9.)

ТАВ-технология впервые появились в середине 1980 года как способ сборки микросхем с большим числа выводов. С усовершенствованием SMT-корпусов и изобретением BGA технология TAB в значительной степени устарела, хотя еще используется некоторыми производителями. Сложность ТАВ-технологии заключается в необходимости применения специализированного автоматического оборудовании для установки и пайки припаивания ТАВ-компонентов. а также в трудности контроля паяных соединений.

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


Технология изготовления кристаллов

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

В настоящее время практически все микроконтроллеры выпускаются по CMOS-технологии (Complementary Metal Oxide Semiconductor — транзисторы со структурой Метал-Окисел-Полупроводник с дополняющим типом проводимости: р- и n-канальные). В микросхемах, выпускаемой по этой технологии совместно используются р-канальные (PMOS) и и-канальные (NMOS) MOS-транзисторы (рис. 2.10).

На рис. 2.10 дана схема CMOS-инвертора (логического элемента «НЕ»). Когда на вход схемы поступает низкий потенциал, PMOS-транзистор открыт, a NMOS - закрыт. При этом на выходе установится высокий потенциал (логическая 1). равный напряжению питания Vcc. Если на вход подан высокий потенциал, то PMOS транзистор будет закрыт, a NMOS — открыт, обеспечивая на выходе низкий потенциал «земли» (логический 0).


Когда элемент находится в одном из этих состояний, через транзисторы протекает очень маленький ток (ток утечки). С увеличением частоты переключения элемента возрастает средняя величина протекающего тока, и потребляемая элементом мощность увеличивается. Чтобы сократить энергопотребление, целесообразно эксплуатировать CMOS-микросхемы при минимально возможной частоте переключения. В «спящем» режиме, когда частота переключения снижается до нуля, потребление мощности значительно сокращается, так как переключения элементов не происходит, и ток в схеме не протекает.

Важной характеристикой логических элементов является порог переключения. Для CMOS-элементов значение порога переключения обычно составляет от 1.4 В до Vcc/2. Различные логические элементы могут иметь разные пороги переключения. Прежде чем использовать элемент в проектируемом устройстве необходимо убедиться, что его логические уровни (0 и I) и порог переключения соответствуют уровням и порогам переключения других элементов устройства.

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


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

Чтобы показать, как совершенствовалась технология микроконтроллеров в последние годы, сравним две микросхемы. Первая — микроконтроллер 8748, который выпускался и середине с 80-x годов (по функциям аналогичен контроллеру клавиатуры первых персональных компьютеров IBM PC), вторая -современный микроконтроллер PIC I7C44. Обе микросхемы размещаются в 40-ныводиом корпусе с шагом 1,52 мм и имеют приблизительно одинаковую стоимость.

Питание

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

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


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

Обратим внимание на обозначения, используемые при описании питания. Обозначения «Vcc» и «Vdd» применяются для указания напряжения питания (обычно +5В, хотя возможны и другие значения). Аналогично, обозначения «Vss» and «Gnd» используются для указания «земли». В этой книге используется «Vcc» для обозначения питания (даже когда производитель использует «Vdd») и «Gnd» для обозначения «земли».

Потребляемая мощность

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


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

С уменьшением тактовой частоты собственная мощность значительно уменьшается. Ниже указано потребление тока питания для микроконтроллера PICMicro 16C73A на различных тактовых частотах при напряжении питания 5В.

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

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


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

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

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


Как долго микроконтроллер BASIC Stamp может работать от 9-вольтовой батареи ?

Это зависит от того, как используется BASIC Stamp. Если Ваша программа никогда не использует «спящий» режим и имеет несколько светодиодов, то BASIC Stamp может работать только несколько часов. Однако, если применяется «спящий» режим и минимизирован ток ввода-вывода, то BASIC Stamp будет работать несколько недель.

«Спящий» режим — это виртуальный выключатель, реализованный внутри микроконтроллера. Его использование обеспечивает ряд преимуществ. Во-первых, такой виртуальный выключатель дешев и надежен — при его включении-выключении отказы возникают значительно реже, чем при работе электромеханического выключателя. Во-вторых, в «спящем» режиме сохраняется содержимое памяти данных RAM. А последнее преимущество чисто эстетическое: устройства, которые можно включать и выключать кажутся мне более привлекательными.

«Спящий» режим имеет один потенциальный недостаток, существенный для некоторых приложений: время, необходимое для выхода из «спящего» режима и запуска тактового генератора может достигать десяти миллисекунд. Действительно, такая задержка может оказаться слишком большой при взаимодействии с другой компьютерной системой. Однако если основной задачей микроконтроллера является работа с человеком, то такая задержка проблем не вызывает.


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

Подключение питания

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

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


Запуск (сброс в начальное состояние)

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

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

В этой схеме сигнал RESET на входе микроконтроллера становится активным (принимает значение логического 0) приблизительно через 22 мс (время задержки Td = 2,2 RC) после включения питания. Этого времени достаточно для стабилизации напряжения питания и установки требуемой частоты тактового генератора прежде, чем начнет работать микроконтроллер.

Кнопка RESET используется в процессе разработки устройства для сброса микроконтроллера в начальное состояние. При отладке устройства очень полезно иметь возможность выполнения сброса, чтобы обеспечить повторный запуск микроконтроллера. Резистор сопротивлением 100 Ом, который включен последовательно с конденсатором, служит для ограничения тока разряда конденсатора в момент сброса (заряженный конденсатор является источником большого тока, когда он заворачивается на «землю»). Эта схема может быть использована для запуска микроконтроллеров, у которых сигнал RESET имеет высокий активный уровень (например, микроконтроллер 8051), путем инвертирования напряжения на конденсаторе (например, с помощью микросхемы типа 7404).


Рис. 2.11. Схема формирования сигнала запуска RESET.

Для некоторых микроконтроллеров можно удалить RC-цепь в схеме запуска, так как внутри них имеется схема, обеспечивающая задержку включения (пуск тактового генератора и начачо выполнения первой команды программы). В этом случае схема запуска может быть упрощена, как показано на рис. 2.12. Посмотрев на эту схему Вы, возможно, подумаете, что схему можно еще более упростить, просто подключив вывод RESET к шине питания Vcc. Это верно, но использовать такое включение следует только после того, как схема будет полностью отлажена. Однако при этом целесообразно включить токоограничивающий резистор, чтобы иметь возможность повторного запуска путем закорачивания вывода RESET на «землю».

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

Для решения этой проблемы существуют устройства — мониторы питания, которые следят за уровнем напряжения Vcc/Vdd. Если это напряжение падает ниже определенного уровня (обычно 4.5В), то вырабатывается сигнал RESET. Как правило, такие мониторы питания содержат схему задержки и работают аналогично описанной выше RC-схеме запуска. Они монтируются в такой же корпус, как трехвыводной транзистор.


Рис. 2.12. Модифицированная схема RESET.

Тактирование системы

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

Большинство микроконтроллеров способны работать в очень широком диапазоне частот: от нуля до десятков мегагерц. Это возможно благодаря использованию полностью статической логике. Некоторые разработчики используют тактовую частоту в lHz и менее при отладке программного обеспечения. Широкий диапазон возможных рабочих частот позволяет разработчику лучше настроить микроконтроллер на выполнение конкретных заданных функций.

Существует три способа задания тактовой частоты микроконтроллера, каждый из которых имеет свои достоинства и недостатки. Первый способ — использование кварцевого резонатора, подключенного согласно схеме на рис. 2.13. Этот способ позволяет очень точно задать тактовую частоту микроконтроллера (разброс частот обычно составляет не более 0,01%). Такой уровень точности требуется для организации интерфейса микроконтроллера с другими устройствами или обеспечения точного хода часов реального времени.


Номиналы емкостей конденсаторов в данной схеме определяются производителем микроконтроллера для конкретной резонансной частоты кварца. Иногда требуется включить резистор большого номинала (порядка нескольких МОм) между выводами ClkO n Clkl, чтобы генератор работал стабильно. Часто производитель советует подключать переменный конденсатор, подключаемый к выводу Clkl, чтобы обеспечить возможность точной полстройки частоты.

Рис. 2.13. Тактирование с использованием кварцевого резонатора.

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

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

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


Два основных недостатка этого способа синхронизации — необходимость подключения дополнительных компонентов и хрупкость кристаллов кварца. Оба этих недостатка могут быть устранены, если использовать керамический резонатор. Керамические резонаторы существенно более стойки к ударной нагрузке, и многие из них имеют встроенные конденсаторы, вследствие чего количество требуемых внешних компонентов уменьшается с трех до одного. Керамические резонаторы обычно имеют разбое частот порядка нескольких десятых процента (около 0,5%)

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

Рис. 2.14. Хорошая и плохая формы импульсов для микроконтроллера PICMicro.

обеспечивает поддержание частоты с точностью в тысячные доли процента, керамический резонатор — в десятые доли процента, то RC-цепь дает точность порядка десятков процентов. Так, при экспериментах с микроконтроллерами Р1С было установлено, что точность RC-генератора составляет примерно 20%. Очевидно, что это неприемлемо для многих приложений, где требуется точный подсчет времени. Однако имеются области применения, где такая точность является вполне достаточной.


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

Большое преимущество этого способа синхронизации частоты - низкая цена. Внешние компоненты для схемы RC-генератора могут стоить меньше одного цента! Точность задания тактовой частоты можно повысить, используя переменные резистор или конденсатор. Однако при этом сложность и цена генератора увеличатся.

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

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


Командные циклы

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

Рис. 2.16. Командный цикл и машинные такты.

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

Программный счетчик

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


Программный счетчик представляет собой счетчик с параллельным вводом-выводом. На рис. 2.17 показано функционирование PC в процессоре с Принстонской архитектурой. В процессорах этого типа содержимое PC поступает по шине данных в схему управления памятью, указывая адрес считываемой команды. Часто PC входит в состав схемы управления памятью — это позволяет избежать передачи адреса по внутренней шине данных. Важные особенности функционирования программного счетчика — параллельная загрузка нового содержимого, поступающего с шины данных, возможность сброса (возврат к адресу первой команды программы), реализация инкремента (увеличение содержимого для адресации следующей команды). Сигналы, обеспечивающие выполнение этих операций, формируются дешифратором команд, который управляет последовательностью действий микроконтроллера.

Рис. 2.17. Программный счетчик.

Параллельная загрузка используется для записи в PC адреса перехода при выполнении команды «jump» (безусловный переход) или «call» (вызов подпрограммы). В компьютерах с Принстонской архитектурой этот адрес поступает по шине данных. В 8-разрядных микроконтроллерах разрядность PC обычно больше, чем 8 бит (так как при такой разрядности адреса объем доступной памяти программ составляет всего 256 байт). При загрузке в PC нового адреса, он поступает по шине данных частями по 8 бит. что требует выполнения дополнительных машинных циклов. Чтобы сократить время загрузки PC, некоторые процессоры имеют команды ветвления «branch», при которых загружаются только 8 младших разрядов адреса, а старшие разряды остаются без изменения. При выполнении такой команды достаточно передать по шине данных только один байт, тогда как для загрузки полного 16-разрядного адреса требуется пересылка двух байт.


Начальное содержимое PC после запуска микроконтроллера может иметь любое значение. Хотя наиболее очевидным представляется использование в качестве начального значения 0x0000. некоторые микроконтроллеры начинают выполнение программы с других адресов. Аналогичная ситуация имеет место с адресами («векторами») прерываний. При обслуживании прерываний в PC обычно загружают содержимое, которое отличается от адреса, загружаемого при начальном запуске микроконтроллера, однако для реализации прерывания и запуска могут использоваться одни и те же аппаратные средства.

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

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


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

Арифметико-логическое устройство

Арифметико-логическое устройство (АЛУ) процессора используется для выполнения всех математических операций в программе. Эти операции включают сложение, вычитание, логическое И. логическое ИЛИ, сдвиг содержимого регистров и установку содержимого регистра состояния в соответствии с полученными результатами. АЛУ не используется при чтении или записи данных или команд, оно служит только для обработки данных.

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


Некоторые микроконтроллеры выбирают один операнд из регистра-аккумулятора и сохраняют результат также в аккумуляторе. Другие микроконтроллеры позволяют использовать различные источники операндов и места размещения результатов.

Рис. 2.18. Структура АЛУ

АЛУ обычно работают только с положительными целыми числами. Однако при выполнении вычитания получаются отрицательные числа, если вычитаемое больше уменьшаемого. Для представления отрицательных чисел используется дополнительный код («дополнение до двух»). Это необходимо учитывать при знакомстве с работой АЛУ.

Рассмотрим как выполняется команда вычитания на примере микроконтроллера Microchip PIC.Вместо вычитания одного числа из другого, происходит добавление отрицательного числа:

А - В = А + (-В),

где отрицательное число -В представляется в дополнительном коде. Чтобы получить дополнительный код отрицательного двоичного числа, необходимо инвертировать значение каждого бита, а затем прибавить единицу:


-В = (В ^ OxOOFF) + 1.

Если есть схема преобразования отрицательных чисел в дополнительный код, то нет необходимости использовать схему вычитания. Достаточно иметь в составе АЛУ сумматор, который реализует вычитание с помощью следующей замены:

А-В=А+(В ^ OxOOFF) + 1.

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

В «классических» АЛУ, которые имеют сумматор и вычитатель, часто используется общий флаг «переноса-заема». Этот флаг устанавливается в 1, когда результат сложения больше, чем OxOOFF или результат вычитания меньше нуля. В обоих случаях флаг используется для указания того, что значение 8-и старших бит результата зависят от результата, полученного при операции над 8-ю младшими битами.

Если АЛУ не содержит вычитателя (как в прицеленном выше примере), го флаг переноса также устанавливается после сложения пли вычитания, но он имеет другое значение. Чтобы понять это, рассмотрим пару примеров Первый пример показывает, что происходит, когда одно число вычитается из другого числа, которое больше первого:


0x0077 - 0x0055= 0x0077 + (-0x0055) =

= 0x0077 + (0x0055 ^ OxOOFF) + 1 = = 0x0077 + ОхООАА + 1 = = 0x0122

Результат получился больше, чем OxFF. что приводит к установке флага переноса 1 в младшем бите старшего байта (флаг переноса/заема в атом случае не ранен I). Младшие восемь бит раины Ох22 (что и ожидалось) - это значение будет записано в качестве результата в приемник

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

0x0055 - 0x0077 = 0x0055 + (-0x0077) =

= 0x0055 + (0x0077 ^ OxOOFF) + 1 = = 0x0055 + 0x0088 + 1 = = OxOODE

В этом примере младшие 8 разрядов представляют число 22 в дополнительном коле (что и ожидалось), а бит переноса в старший байт (флаг переноса) ранен 0. такой как ожидалось. В «классическом» АЛУ для данного примера результат также будет иметь значение OxDE . но установится флаг заема-переноса равный 1.

Нетрудно заметить, что в АЛУ. не использующем вы читатель, флаг переноса устанавливается в I. когда результат вычитания положительный, и сбрасывается в 0. когда результат отрицательный. Поэтому формируемый бит переноса в старший байт в этом случае можно было бы назвать флагом «перенос- знак», так как при вычитании он указывает знак результата.


Необходимо иметь в виду, что различные представители одного семейства микроконтроллеров обычно имеют одинаковые АЛУ. В некоторых семействах АЛУ реализуют определенные операции, например, умножение, которые не выполняются микроконтроллерами других семейств. Дополнительные функции, которые обеспечивают различные микроконтроллеры одного семейства, реализуются путем включения в их структуру дополнительных аппаратных средств, аналогично периферийным устройствам. При этом структура и функции АЛУ сохраняются, так как вводимые в микроконтроллер дополнительные устройства используют свои регистры, которые не связаны с регистром состояния и аккумуляторами. Наглядным примером этого является семейство 8-разрядных микроконтроллеров 68НС05. выпускаемых фирмой Motorola.

Сложность АЛУ во многом определяет сложность всего микроконтроллера в целом. Часто над созданием АЛУ работает группа разработчиков, сравнимая по составу с той, которая работает над остальной частью микропроцессора или микроконтроллера (и даже большая, когда разрабатывается процессор аналогичный по сложности персональному компьютеру). От того, как работает АЛУ, зависит функционирование процессора, входящего в состав микроконтроллера, а значит и функционирование всего микроконтроллера.


Сторожевые таймеры

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

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

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


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

Подпрограммы и функции

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

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

Однако некоторые цифровые системы, например, большие компьютеры серии IBM 370, не имеют стека для сохранения содержимого программного счетчика или других регистров. В этой архитектуре при выполнении команды «goto» (переход к подпрограмме) адрес возврата сохраняется в регистре. При этом ответственность за сохранение адреса возврата возлагается на программиста. Наиболее простой способ имитировать команду «call» — это просто оставить адрес возврата в регистре, если подпрограмма не вызывает другие подпрограммы. При возврате из подпрограммы содержимое этого регистра загружается в программный счетчик.


В некоторых устройствах при выполнении команды «goto» адрес возврата вообще нигде не сохраняется. В таком случае для имитации вызова подпрограммы адрес возврата необходимо сохранить в виде переменной. Это может быть реализовано следующим образом:

ReturnVar = AflerGolo goto ; Сохранить адрес возврата
goto Subroutine ; Вызвать подпрограмму

AfterGoto

Subroutine ; Начало подпрограммы

ProgramCounter = ReturnVar ; Возвратиться к команде следующей за goto

Функции — это сложные подпрограммы, при выполнении которых определенные параметры передаются из исходной программы в подпрограмму, а после завершения возвращаются обратно. Например, функция на языке С может быть определена следующим образом:

int Func( int i, char far * Ptr );

В этом примере «Func» — функция, требующая два входных параметра: целое число и указатель, и возвращающая значение целого числа. Один из наиболее эффективных и часто встречающихся способов передачи параметров в функцию — это поместить их в стек перед вызовом функции. В подпрограмме можно загрузить индексный регистр значением указателя стека и таким образом получить доступ к параметрам. Этот метод обработки параметров имеет существенное преимущество по сравнению с другими методами: для передачи параметров используется специально выделенный фрагмент памяти. Переменные, определенные внутри функции (включая входные параметры), часто называются «локальными» или «автоматическими», так как они используются только данной функцией, и память для их размещения выделяется автоматически.


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

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

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

Прерывания


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

Если Вы никогда не имели дело с прерываниями, то у Вас возникнет вопрос — что это такое? В компьютерной системе прерывание — это запуск специальной подпрограммы (называемой «обработчиком прерывания» или «программой обслуживания прерывания»), который вызывается сигналом аппаратуры. На время выполнения этой подпрограммы реализация текущей программы останавливается. Термин «запрос на прерывание» (interrupt request) используется потому, что иногда программа отказывается подтвердить прерывание и выполнить обработчик прерывания немедленно (рис 2.19).


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

Первый возможный ответ — «не реагировать на прерывание, пока не завершится выполнение текущей задачи» - реализуется путем запрещения (маскирования) обслуживания запроса прерывания. После завершения задачи возможен один из двух вариантов: сброс маски и разрешение обслуживания, что приведет к вызову обработчика прерывания, или анализ значения битов поллинг»), указывающих на поступление запросов прерывания и непосредственное выполнение программы обслуживания без вызова обработчика прерывания. Такой метод обработки прерываний используется, когда требуется обеспечить заданное время выполнения основной программы, так как любое прерывание может нарушить реализацию необходимого интерфейса.


Рис. 2.19. Выполнение прерывания.

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

Обработчик прерывания всегда обеспечивает следующую последовательность действий:

  1. Сохранить содержимое регистров контекста.

  2. Сбросить контроллер прерываний и оборудование, вызвавшее запрос.

  3. Обработать данные.

  4. Восстановить содержимое регистров контекста.

  5. Вернуться к прерванной программе.


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

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

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


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

Восстановление регистров контекста и выполнение команды возврата из прерывания переводит процессор в состояние, в котором он находился до возникновения прерывания.

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


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

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

Адрес, который загружается в программный счетчик при переходе к обработчику прерывания, называется «вектор прерывания». Существует несколько шпон векторов. Адрес, которым загружается в программным счетчик при запуске микроконтроллера (reset) называется «вектор сброса». Для различных прерываний могут быть заданы разные вектора, что избавляет программу обслуживания от необходимости определять причину прерывания. Использование различными прерываниями одного вектора обычно не вызывает проблем при работе микроконтроллером, так как чаще всего микроконтроллер исполняет одну единственную программу. Этим микроконтроллер отличается от персонального компьютера, в процессе эксплуатации которого могут добавляться различные источники прерываний. (Если Вы когда-либо подключали два устройства к портам COMI и COM3, то Вы представляете, о чем идет речь). В микроконтроллере, где аппаратная часть хорошо известна, не должно возникнуть каких либо проблем при совместном использовании векторов прерывании.


Последнее, что осталось рассмотреть. — это программные прерывания. Существуют процессорные команды, которые могут быть использованы для имитации аппаратных прерывании. Наиболее очевидное использование этих команд — это вызов системных подпрограмм, которые располагаются в произвольном месте памяти, или требуют для обращения к ним межсегментных переходов. Эта возможность реализована в микропроцессорах семейства Intel iS6 и используется в базовой системе ввода-вывода BIOS (Basic Input/Output System) и операционной системе DOS персональных компьютеров для вызова системных подпрограмм без необходимости фиксирования точки входа. Вместо этого используются различные вектора прерывании, выбирающие команду, которая должна выполняться, когда происходит такое программное прерывание.

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

Таймеры

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


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

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

Если требуется реализовать задержку в Юме (0.01с) в системе с тактовой частотой 10 МГц, то можно использовать схему, показанную на рис. 2.20, следующим образом. Сначала надо определить требуемый коэффициент деления. При тактовой частоте 10 МГц таймер должен переключиться до переполнения 10000 раз, что невозможно для 8-разрядного счетчика. Чтобы обеспечить заданную задержку, необходимо выбрать коэффициент деления для предварительного делителя, который обычно является степенью двойки (тесть 1, 2, 4, 8,...256). Если выбрать коэффициент деления 64, то таймер переключится 156 раз при поступлении на вход делителя 64 х 156 = 9984 тактовых импульсов, что достаточно близко к требуемой величине. Более точное значение задержки может быть достигнуто путем добавления команд NOP или других команд, используемых для заполнения определенных промежутков времени. Для отсчета заданного времени таймер можно очистить, а затем непрерывно сравнивать его содержимое со значением 156.


Рис. 2.20. Структура таймера в микроконтроллере.

Более эффективный способ отсчета — загрузить в таймер число 100 = 256 — 156 и ждать, когда флаг прерывания по переполнению таймера установится в 1. Используя данный метод, можно реализовать мультизадачный режим выполнения программ. Переключение задач будет производиться, когда таймер отсчитает 10 мс.

Не рекомендуется использовать этот метод для создания часов реального времени. Так как при перезагрузке таймера значение коэффициента деления делителя неизвестно, а его содержимое сбрасывается в 0 при записи в регистр таймера, то при отсчете времени могут возникать ошибки. Вместо этого лучше дать возможность таймеру считать непрерывно (тогда делитель никогда не сбрасывается), а при его переполнении увеличивать содержимое счетчика часов реального времени. Когда программе требуется узнать текущее время, она выбирает и преобразует содержимое этого счетчика, получая правильное значение времени. Такой метод используется в IBM PC, где переключение («тик») таймера происходит 18,2 раз в секунду.

Глядя на рис. 2.20 можно заметить, что таймер может быть использован для подсчета внешних событий, если использовать для его переключения внешний сигнал.


Если микроконтроллер содержит два таймера, то можно легко реализовать простой тахометр - счетчик числа событий, происходящих за единицу времени (рис. 2.21). Программа реализации тахометра сначала сбрасывает в 0 содержимое счетчика TMR2, а затем устанавливает определенный интервал времени для срабатывания таймера TMR1. По истечении этого интервала TMR1 срабатывает (устанавливается в 1 бит переполнения TMR1) , вызывая считывание текущего содержимого из TMR2.

Рис. 2.21. Реализация тахометра.

Таймеры в микроконтроллерах часто используются для ввода-вывода сигналов с широтно-импульсной модуляцией PWM (Pulse Width Modulated). PWM сигнал часто используется для передачи значения аналогового сигнала в цифровую систему или из нее. Сигнал имеет повторяющуюся форму, где длительность импульса пропорциональна значению передаваемой аналоговой величины (рис. 2.22).

PWM-сигналы часто используется для управления электродвигателями, задавая скорость вращения или положение вала в сервоприводе. На рис. 2.23 показана схема генерации PWM-сигнала на выходе микроконтроллера. Пока заданное значение «длительности импульса» больше, чем содержимое таймера, на выходе этой схемы будет поддерживаться высокий потенциал (вершина импульса). Когда содержимое таймера станет равно или больше, чем заданное значение «периода», то таймер сбрасывается в 0, и процесс повторяется. Такой метод получения PWM-сигнала требует минимального участия процессора — надо только задать необходимые значения периода и длительности импульса. При этом значение длительности импульса может изменяться процессором в любое время без остановки процесса вывода.


Рис. 2.22. Сигнал с широтно-импульсной модуляцией PWM.

Рис. 2.23. Схема генератора PWM-сигнала

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

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

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

Параллельный ввод-вывод данных

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


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

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

Другой распространенный вариант подключения внешнего вывода — это схема с «открытым коллектором» (в действительности с «открытым стоком»), показанная на рис. 2.26. Состояние данного вывода соответствует состоянию подключенной к нему шины до тех пор, пока он не будет переключен на работу в режиме выхода и установлен в состояние 0. В этом случае вывод соединен с «землей» через MOS-транзистор, который управляется логической схемой «И», подключенной к выходам триггеров управления и данных.


Такое подключение вывода позволяет создавать шины с объединением выходов устройств по схеме «монтажное И». В этой схеме шина подключается к напряжению питания Vcc (логическая I) через резистор, а к потенциалу «земли» (логический 0) — через несколько ключей или транзисторов. При их включении на шине устанавливается низкий потенциал. Примером примения данной схемы включения является двунаправленная пища с несколькими источниками информации, каждый из которых может переливать данные, переводя шину и состояние с низким потенциалом (логический 0).

Обычный выход (рис. 2.25) функционирует как выход с открытым коллектором, если он работает и режиме ввода и переходит и режим вывода только для выдачи «О». Когда на шину необходимо вывести «0». то сначала «0» записывается в триггер данных, а затем с помощью триггера управления на выходе устанавливается низкий уровень потенциала.

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


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

Преобразование логических уровней

При работе с микроконтроллерами часто приходится обеспечивать интерфейс устройств, реализованных на микросхемах с различным типом логики. При использовании серийных микросхем с положительны) логикой, например. ТТЛ (транзисторно-транзисторная логика) или КМОП (логика на комплементарных МОП-транзисторах), реализация интерфейса не вызывает проблем, так как возможно непосредственное соединение этих микросхем. Однако интерфейс устройств, реализованных на микросхемах с отрицательной и положительной логикой, например. ЭСЛ (эмиттерно-связанная логика) и КМОП. может вызвать некоторые трудности.

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

Наиболее типичный метод преобразования логических уровней состоит в том. чтобы привести в соответствие пороги переключения обоих устройств. Как показано на рис. 2.27. нижний потенциал напряжения питания для КМОП-микроконтроллера сдвигается ниже потенциала «земли» таким образом, чтобы его порог переключения стал соответствовать порогу переключения микросхем ЭСЛ. Резистор с номиналом от 1 кОм до 10 кОм используется для ограничения тока, который протекает из-за разного значения логических уровней используемых микросхем.


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

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

Рис. 2.27. Согласование логических уровней ЭСЛ и КМОП микросхем.

Последовательный ввод-вывод данных

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


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

Асинхронный последовательный обмен

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

Первым передается не бит данных, а старт-бит, указывающий на начало передачи данных (начало пакета). Этот бит используется приемником для синхронизации процесса чтения данных, которые следуют за старт-битом (младший бит данных идет первым). После битов данных может следовать бит четности (контрольный бит), который используется для проверки правильности полученных данных. Существует два типа проверки на четность. Проверка на нечетность (Odd) означает, что число единиц в пакете данных, включая бит четности, должно быть нечетным (например, 0x55 будет иметь бит четности равным 1, чтобы сделать число единичных битов равным пяти, то есть нечетным). Проверка на четность (Even), наоборот, означает что число единичных битов должно быть четным (например, при передаче числа 0x55 бит четности будет равен 0).


В некоторых микроконтроллерах значение бита четности должно определяться программно, а затем помещаться в регистр. Простой алгоритм реализации этой процедуры заключается состоит в выполнении логической операции «Исключающее ИЛИ» (XOR) над всеми битами передаваемого байта. Для микроконтроллера 8051 данная процедура выполнятся с помощью следующей программы:

mov Count, 8 ; Обработать 8 бит

mov A, 0 ; Очистить регистр «А»

Р_Lоор Адрес возврата после обработки каждого бита

xrl A, Char ; операция XOR над младшими битами

ггс А ; Сдвинуть Char, чтобы перейти к следующему биту

djnz Count, P_Loop ; Повторить 8 раз

Младший бит регистра «А» будет содержать бит четности (Even) для операнда «Char». Количество единичных битов вместе с битом четности будет четным числом. Чтобы реализовать проверку на нечетность, необходимо инвертировать младший бит в регистре «А».

За битом четности следует стоп-бит, который используется приемником для обработки конца передачи пакета.


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

Наряду с битами четности («odd») или нечетности («even») возможны другие варианты контрольных битов: «no», «mark» и «space». «No» означает отсутствие бита четности в пакете. «Mark» или «space» означает, что вместо бита четности всегда посылается 1 («mark») или 0 («space»), соответственно. Эти варианты контрольных битов используется достаточно редко — в тех случаях, когда необходимо дать приемнику дополнительное время на обработку пакета.

Рис. 2.28. Асинхронная последовательная передача данных.

Количество стоп-битов также может быть различным. Второй стоп-бит может вводиться для той же цели, что и контрольные биты «mark» и «space» -чтобы дать приемнику больше времени для обработки принятого пакета.

Практически все современные устройства используют для асинхронного обмена формат данных «8-N-1», что означает передачу 8 бит данных, отсутствие бита четности и один стоп-бит. Бит четности и дополнительный стоп-бит обычно не требуются для последовательной связи.


Наиболее популярный протокол асинхронной последовательной связи называется «RS-232», который в настоящее время является международным стандартом. Это очень старый стандарт, используемый для связи компьютеров. Подробнее RS-232 будет обсуждаться в главе «Типовые интерфейсы микроконтроллеров».

Асинхронный приемник ждет прихода старт-бита, когда на линии устанавливается низкий уровень. Через половину времени передачи одного бита (длительность этого времени задается синхросигналом) линия вновь опрашивается. Если на линии все еще установлен низкий уровень сигнала, то приемник ждет один период и считывает данные (рис 2.29). Если же на линии оказывается высокий уровень сигнала, то приемник считает, что произошла ошибка, и данные не принимаются. Этот метод используется как при аппаратной, так и при программной реализации асинхронного приема данных. В программно реализованных приемниках используются программные циклы для отсчета задержек времени.

Другой распространенный метод асинхронной последовательной передачи данных — это использование кода типа «Манчестер» («manchester»). При этом методе передача каждого бита данных синхронизируется импульсом, а значение бита (0 или 1) определяется промежутком времени до следующего импульса (рис.2.30). После передачи заданного числа битов данных следует стоп-импульс, а затем прием данных прекращается. Особенность манчестерского кодирования заключается в том, что старт-бит качественно отличается от 1 или 0. Это позволяет приемнику определить, являются ли поступающие данные началом или серединой посланного пакета (в последнем случае данные не будут приниматься до прихода старт-бита). Манчестерское кодирование хорошо подходит для использования в случаях, когда поток передаваемых данных может быть легко прерван. Поэтому такой метод передачи данных является основным для связи с помощью инфракрасного излучения, например, в пульте дистанционного управления телевизором.


Типичная схема для преобразования последовательных данных в параллельные показана на рис. 2.32. В этой схеме используются две микросхемы 8-разрядных регистров типа 74LS374. Для большинства приложений не требуется включение второго регистра. Это преобразование может также быть выполнено с помощью специальной микросхемы, но некоторые предпочитают использовать 8-разрядные регистры, так как их обычно легче найти, чем другие типы микросхем ТТЛ.

Существует два основных протокола для синхронной связи: Microwire и SPI. Эти методы применяются для взаимодействия с различными микросхемами, (таких как последовательный EEPROM в BASIC Stamps). Хотя стандарты Microwire и SPI очень похожи, существуют некоторые различия, о которых необходимо упомянуть.

Данные протоколы чаще используются для синхронной последовательной передами данных, чем для объединения микроконтроллеров и единую сеть. В JTHX протоколах каждое устройство адресуется индивидуально, хотя линии передачи данных и синхронизации могут быть общими для многих устройств. Если сигнал разрешения выборки (chip select) устройства не активен, то это устройство игнорирует линии данных и синхронизации. В каждый момент времени только одно из подключенных к шине устройств может быть ведущим (master), то есть иметь возможность задавать режим работы шины (рис 2.33).


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

Протокол MICROWIRE

Протокол Microwire обеспечивает передачу данные со скоростью до 1 Мбит в секунду. Водном пакете передается шестнадцать бит данных.

На рисунке 2.35 показана форма сигналов при чтения 16 бит данных. После выбора микросхемы и посылки старт-бита передается 8-разрядная команда (обозначена как «ОР1», «ОР2», «А5» - «АО» на рис. 2.35), затем следуют 16-разрядный адрес (его наличие не является обязательным) и 16 бит данных. При максимальной скорости передачи 1 Мбит в секунду тактовый сигнал изменяется каждые 500нс. Передаваемые биты должны быть выдаваться на линию за 100нс до поступления переднего фронта тактового сигнала. Чтение данных должно происходить за 100нс до поступления заднего фронта тактового сигнала. Хотя эти требования выполняются большинством устройств, необходимо убедиться, что устройства, с которым осуществляется связь,


Протокол SPI

Протокол SPI похож на протокол Microwire, но имеет несколько отличий.

  1. SPI способен передавать данные со скоростью до 3 Мбит в секунду.

  2. Разрядность данных в SPI пакете равна 8 бит.

  3. Передатчик в SPI имеет возможность приостановить передачу данных.

  4. Данные в SPI могут передаваться в виде множества байтов, которые называются «блок» или «страница».

Как и в протоколе Microwire, в SPI сначала передается байт, который содержит команду для принимающего устройства. Затем идет необязательный 16-разрядный адрес, после чего следуют 8-разрядные данные. Как было указано выше, протокол SPI позволяет передавать несколько байтов (рис. 2.36). В протоколе SPI используется симметричный тактовый сигнал, который имеет одинаковую длительность высокого и низкого уровня. Выходные данные должны быть выданы на линию по крайней мере за 30нс до поступления переднего фронта тактового сигнала, а считывание должно происходить за 30нс до заднего фронта.


Рис. 2.36. Запись данных в протоколе SPI.

При реализации протоколов Microwire или SPI можно упростить схему соединения, если подключить вход Din и выход Dout к одной линии (рис. 2.37). При таком способе соединения микроконтроллер должен отключить свой выходной драйвер, когда закончит последовательную передачу данных. После этого он может принимать данные, поступающие от другого устройства. Резистор между выводами данных служит для ограничения тока в тех случаях, когда и микроконтроллер, и периферийное устройство выдают данные на линию связи.

Сети

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

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


В таких сетях имеется «ведущий» («master») — интеллектуальное устройство, которое может инициировать передачу данных. Устройства, которые отвечают на запросы, но не могут их инициировать, называются «ведомые» («slaves»). Микроконтроллерная сеть может иметь несколько «ведущих» устройств, В этом случае сетевой протокол требует включения схемы арбитража, которая позволит различным «ведущим» устройствам передавать данные не нарушая других сообщений.

Обычно в микроконтроллерной сети передается относительно мало данных, поэтому требуемая для них пропускная способность весьма скромна по сравнению с сетью Ethenet. Часто микроконтроллерная сеть имеет пропускную способность порядка нескольких байт в секунду, тогда как сеть персональных компьютеров может передавать несколько Мбайт в секунду.

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


Протокол I2C

Наиболее популярный протокол для сети микроконтроллеров — I2C, который предназначен для связи устройств в многопроцессорных системах. Этот стандарт был разработан компанией Philips в конце 70-х годов как метод реализации интерфейса между микропроцессорами и периферийными устройствами, который не требует прокладки многочисленных линий для передачи между устройствами всех разрядов адреса, данных и сигналов управления. Протокол I2C позволяет разделять сетевые ресурсы между несколькими ведущими процессорами («multimastering»).

Шина I2C содержит две линии: линия SDA, которая служит для передачи данных, и линия SCL, по которой передается синхросигнал, используемый для стробирования данных. Обе линии подключены через резисторы к шине питания («подтянуты» к высокому уровню потенциала), что позволяет нескольким устройствам управлять их состоянием путем соединения по схеме «монтажное И».

Шина I2C для управления стереосистемой может иметь вид. показанный на рис. 2.38.

Двухпроводная линия используется для определения начала передачи данных, а также для передачи самих данных. Чтобы начать передачу данных, шина переводится в стартовое состояние. При отсутствии передаваемых данных шина находится в ждущем (пассивном) состоянии («idle»). При этом на обе линии сигналы не поступают, и на них установлен высокий уровень сигнала (потенциал Vcc). Чтобы инициировать передачу данных, ведущее устройство, которое запрашивает управление шиной, устанавливает низкий уровень сначала на линии SDA, а затем на линии SCL (стартовое состояние). В процессе пересылки данных такое состояние шины является нерабочим, так как прием передаваемых данных производится только при высоком (активном) уровне синхросигнала на линии SCL. Чтобы закончить передачу данных выполняются обратные действия: на линии SCL устанавливается высокий уровень сигнала, а затем в такое же состояние переводится линия данных SDA (рис. 2.39).


Данные передаются синхронным способом, причем первым посылается старший бит (рис. 2.40). После передачи 8 бит ведущее устройство переводит линию данных в «плавающее» состояние, ожидая подтверждения приема данных от ведомого устройства. Таким подтверждением является установка ведомым устройством низкого уровня сигнала на линии SDA. После бита подтверждения на обех линиях устанавливается низкий уровень. Затем производится пересылка следующего байта, или шина переводится в состояние конца передачи. Это означает, что передача завершена, и приемник может готовиться к следующему запросу данных.

Существует дне максимальные скорости передачи данных по шине I2C: «стандартный режим» — до 100 Кбит/ с и «быстрый режим» — до 400 Кбит/с (рис. 2.41)

Формат команды, поступающей от ведущего устройства к ведомому, показан на рис. 2.42. Адрес получателя содержит 7 бит. Существует неутвержденный («свободный») стандарт, согласно которому четыре старших бита используются для указания типа устройства, а следующие три бита используются для выбора одного из восьми устройств этого типа или служат для более точного определения типа устройства. Так как этот стандарт не является обязательным, то некоторые устройства требуют указания в качестве трех последних адресных бит определенных кодов, тогда как другие, например микросхемы памяти EEPROM с последовательной выборкой, используют эти биты для выбора адресата внутри устройства. Существует также 10-разрядный стандарт для передачи адреса, в котором первые 4 бита содержат 1. следующий бит имеет значение 0. последние 2 бита являются старшими битами адреса, а завершающие 8 бит адреса передаются в следующем байте. Все это означает, что очень важно распределить адреса между устройствами, подключенными к шине.


Первые четыре бита адреса обычно служат для определения типа выбираемых устройств в соответствии со следующим соглашением:

0000 - Зарезервированный адрес

0010 затор голоса

0011 - Аудио - интерфейс
0100 -Звуковой генератор

0111 - Жидкокристаллический или светодиодный дисплей

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

Следует также обратить внимание на возможность инициирования процесса передачи данных несколькими ведущими микроконтроллерами («multimastering»). Это может привести к возникновению коллизий, когда два устройства пытаются управлять шиной одновременно. Если один микроконтроллер взял управление шиной, то есть установил стартовое состояние, до того, как другой попытается сделать тоже самое, то это не вызывает проблем. Проблема возникает, когда несколько устройств инициируют стартовое состояние одновременно, и требуется произвести арбитраж их запросов.


На практике осуществить арбитраж в этом случае достаточно просто. Во время передачи данных оба передатчика точно синхронизируют тактовые импульсы. Если при передаче адреса бит, который должен иметь значение 1, на самом деле принимает значение 0, то это указывает на то что шина занята другим устройством. В этом случае ведущее устройство отключается от шины и ждет, когда наступит состояние «конец передачи», после которого повторяет запрос. Возможно, это трудно понять по приведенному описанию. В следующем разделе «Протокол CAN» будет показано, как тоже самое происходит с использованием асинхронной шины CAN, которая имеет много общего с шиной I2C.

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

Протокол CAN


Протокол CAN (Controller Area Network) был разработан компанией Bosch несколько лет назад как сетевое решение для связи компьютерных систем, применяемых в автомобилях. В то время не существовало единого стандарта для связи цифровых устройств в автомобилях. До появления протокола CAN (или протокола J1850, который является аналогичным американским стандартом) автомобили содержали до трех миль проводов весом свыше 90 кг, которые связывали различные автомобильные электронные устройства. Протокол CAN был разработан, чтобы удовлетворять следующим требованиям:

  1. Высокая скорость обмена (до 1 Мбит/с).

  2. Нечувствительность к электромагнитным помехам.

  3. Простота, небольшое количество разъемных контактов (для обеспечения
    механической надежности).

  4. Легкость подключения и удаления устройств.

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


Протокол CAN реализуется с использованием операции «монтажное И», которая используется также шиной 12С. Передача данных на физическом электрическом уровне реализуется с помощью драйверов, соответствующих стандарту RS-485, которые обеспечивают выдачу на линию связи дифференциального напряжения. Такая сеть будет работать даже если один из двух проводников закорочен или оборван, что особенно важно для обеспечения надежности автомобильного оборудования. Использование соединения, реализующего «монтажное И», позволяет выполнять арбитраж между различными ведущими устройствами: когда выходные драйверы устройства активны, то шина CAN переводится в низкое состояние, аналогично I2C.

Пример реализации этого метода арбитража показан на рис. 2.43. Когда сигнал, выдаваемый драйвером, не совпадает с уровнем, установленным на линии передачи данных (например, при выдаче 1 на шине оказывается 0), то драйвер останавливает передачу данных до тех пор пока не завершится пере-

Каждое сообщение представляет собой отдельный кадр в потоке пересылаемых данных. Кадр передается как фрагмент этого асинхронного последовательного потока, в котором пересылка данных не сопровождается посылкой синхросигнала. При этом приемник и передатчик должны работать на одной частоте: обычно скорость обмена устанавливается в пределах от 200 Кбит/с до 1 Мбит/с. Формат кадра передачи данных показан на рис. 2.44.


При использовании протокола CAN нулевое значение бита называется «доминантным», а единичное значение - «рецессивным» (по аналогии с генами в биологии).

Различные поля кадра имеют следующее назначение:

SOF (Start Of Frame) — начало кадра, единичный доминантный бит. Идентификатор - 11-и или 19-битный идентификатор сообщения. RTR - Бит. указывающий, что ведущее устройство является передатчиком (при RTR=1) или приемником (при RTR=0) данных. rl/rO — Зарезервированные биты, которые должны быть доминантными. DLC — 4 бита, которые указывают количество передаваемых байт. Data - от 0 до 8 передаваемых байтов данных, где старший бит идет первым. CRC - 15 битный код контрольной суммы, за которым следует рецессивный бит.

Аск - 2-битное поле подтверждения готовности (доминантный и рецессивный биты).

EOF (End Of Frame) - конец кадра (поле, содержащее не менее 7 рецессивных бит).

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


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

Аналоговый ввод-вывод

Мир, окружающий микроконтроллер, состоит не только из черного и белого (единиц и нулей), в действительности там имеется много оттенков серого цвета (значений между нулем и единицей). Часто микроконтроллер должен взаимодействовать с аналоговыми устройствами, которые работают с сигналами, имеющими уровень между напряжением питания Vcc и «землей», вводить и выводить такие аналоговые сигналы. Многие модели микроконтроллеров в различных семействах содержат аналогово-цифровые (ADC -Analog-to- Digital Converter) и цифрово-аналоговые (DAC - Digital-to-Analog Converter) преобразователи. Этот раздел содержит вводную информацию для реализации ввода-вывода аналоговых сигналов. В нем не будут затрагиваться вопросы передачи аналоговых данных, которые рассматривались ранее в разделе «Таймеры» этой главы, где была описана процедура чтения и посылки данных с использованием широтно-импульсной модуляции.


Существует три способа ввода аналогового сигнала в микроконтроллер. Первый способ — использование датчика, с помощью которого микроконтроллер определяет физическое положение движка потенциометра. Второй способ — включение аналогового компаратора, который определяет, находится ли значение поступающего напряжения выше или ниже заданного уровня (опорного напряжения). Третий тип - использование микроконтроллера с интегрированным на кристалле аналого-цифровым преобразователем (АЦП), который обеспечивает измерение значения поступающего на вход напряжения. Каждый из этих источников имеет определенные преимущества для различных областей применения.

В первом способе аналого-цифровое преобразование фактически не реализуется, а текущее значение сопротивления потенциометра определяется с помощью ввода-вывода цифровых данных. Для определения сопротивления потенциометра к выводу микроконтроллера подключается простая RC-цепь (рис 2.45). Сопротивление определяется путем измерения времени, в течение которого потенциал на конденсаторе остается больше порога переключения. Чем больше сопротивление, тем большее число 1 будет считано на входе за время измерения (рис. 2.46). Чтобы выполнить измерение, вывод параллельного порта переводится в режим выхода, на котором устанавливается 1 (высокий потенциал). Конденсатор разряжается через сопротивление Rsub, которое ограничивает ток, предотвращая короткое замыкание в начале разряда. Когда конденсатор полностью разрядился, выходной драйвер закрывается, и конденсатор начинает заряжаться через потенциометр. Измерение заканчивается, когда напряжение на выводе упадет ниже порога переключения. Обычно для измерения времени используется таймер.


ним R и С можно использовать выражение: t = 2.2 х R х С, где t - время заряда конденсатора. Сопротивление Rsub обычно выбирается в диапазоне от 100 Ом до 200 Ом. Эта схема измерения дает не совсем точное значение сопротивления R из-за разброса емкости конденсатора, а также влияния нелинейного выходного сопротивления CMOS-входа микроконтроллера. Более точные результаты можно получить, используя прецизионный конденсатор, который однако, трудно найти и он слишком дорог.

Можно задаться вопросом, где и почему используется этот метод, если он не очень точен? На практике эта схема используется в приложениях, которые не требуют высокой точности измерения. Данная схема может определять относительное положение движка потенциометра. Например, в компьютерах IBM PC такая схема используется для определения текущего положения джойстика. Неточность измерения отражается в том, что пользователя просят переместить джойстик в крайние положения, чтобы произвести его калибровку. Обычно в такой схеме используется танталовый конденсатор емкостью 0,1 мкФ и потенциометр с сопротивлением 10 кОм, при этом время заряда составляет около 22 мс. Этого значения достаточно, чтобы микроконтроллер смог измерить его с необходимой точностью, в то же время тикая задержка слишком мала, чтобы ее мог заметить пользователь. Использование танталовых конденсаторов 0,1 мкФ наиболее удобно, так как такие конденсаторы используются для развязки питания, поэтому они всегда имеются в наличии. Проблема заключается в том, что разброс емкостей для танталовых конденсаторов может достигать 100% от их номинала. Это означает, что необходимо производить калибровку перед использованием такого устройства.


Следующий способ аналого-цифрового преобразования, обычно используемый в микроконтроллерах, это аналоговый компаратор напряжений. Компаратор представляет собой простую схему, которая сравнивает два напряжения: входное и опорное (Vref), и устанавливает на выходе 1, если входное напряжение больше, чем опорное (рис. 2.47). Этот способ наиболее удобно использовать в таких устройствах, как термостаты, где необходимо контролировать достижение определенного уровня измеряемой величины, которая задается значением входного напряжения.

Часто в микроконтроллерах, использующих компараторы, опорное напряжение формируется внутри с помощью резистивного делителя и аналогового мультиплексора, который производит выбор требуемого выходного напряжения (рис. 2. 48). Такая схема обеспечивает получение некоторого набора опорных напряжений. Используется простой алгоритм перебора набора различных опорных напряжений до срабатывания компаратора. Опорное напряжение, при котором происходит переключение компаратора, соответствует значению поступающего входного напряжения. Данная схема дает приближенное значение входного напряжения, так как обычно напряжение Vref задается с достаточно большим шагом. Например, если схема обеспечивает 8 уровней опорного напряжения, то при диапазоне напряжений 5 В шаг составит более 700мВ.


Другой способ аналого-цифрового преобразования — это использование параллельно включенных компараторов (рис. 2.49). Этот метод является наиболее быстрым по сравнению с другими методами преобразования типами ADC. Время преобразования определяется задержкой компараторов и приоритетного дешифратора. Этот способ относительно дорогой, так как требует использования большого числа компараторов. Например, чтобы получить 8-разрядную точность преобразования потребуется 256 компараторов.

В последнем способе аналого-цифрового преобразования используется компаратор и аналоговый источник напряжения (генератор пилообразного напряжения), которое линейно увеличивается, начиная с О В и до Vcc (рис. 2.50). Эта схема называется интегрирующим АЦП. В начале преобразования таймер сбрасывается, и на выходе генератора устанавливается 0 В. Затем происходит запуск таймера и генератора. Когда напряжение на выходе генератора превысит значение Vin, таймер останавливается, и вырабатывается сигнал «конец преобразования» (ADC stop), который может вызвать прерывание микроконтроллера. При этом содержимое таймера будет пропорционально значению напряжения Vin.

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


Другая проблема — изменение» значения входного сигнала во время преобразования. Эта проблема решается путем использования конденсатора, который быстро заряжается до уровня входного напряжения. Затем напряжение на конденсаторе сравнивается с напряжением на выходе генератора.

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

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


Существует также одна простая схема, которая может быть использована совместно с микроконтроллером для реализации аналогового выхода (рис. 2.52). В этой схеме выводы микроконтроллера используются в качестве выходов. Значение напряжения, поступающего на вход операционного усилителя, зависит от того, на каких выходах установлен низкий уровень сигнала (логический 0). Таким образом можно получить различные значения напряжения на входе операционного усилителя. Операционный усилитель работает в режиме аналогового повторителя, обеспечивая развязку цепи нагрузки от резистивного делителя. Значения сопротивлений делителя выбираются в зависимости от количества выводов, используемых для управления выходным напряжением.

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


Существует много различных способов аналогового ввода-вывода. Большинство микроконтроллеров спроектировано таким образом, чтобы простыми средствами реализовать аналоговый ввод-вывод в случае относительно медленного изменения аналогового напряжения. Например, выборка входного сигнала в интегрирующих АЦП часто осуществляется просто путем установки бита «Старт АЦП» в регистре управления, а после выполнения преобразования в этом регистре устанавливается бит «Конец АЦП». Для обработки высокочастотных аналоговых сигналов следует использовать внешний параллельный АЦП совместно с цифровым процессором сигналов (DSP).

Ведомые устройства

Один из наиболее интересных и полезных режимов работы микроконтроллера — функционирование в качестве ведомого (slave), когда микроконтроллер подключается к другому процессору как периферийное устройство (рис. 2.53).

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


Одним из приложений, где используется такой режим работы, является персональный компьютер, в котором микроконтроллер Intel 8042 служит в качестве интерфейса клавиатуры, а также выполняет некоторые другие фун

Микроконтроллер может прерывать ведущее устройство, используя одну из своих линий ввода-вывода для подачи запроса прерывания. В некоторых применениях ведомые микроконтроллеры могут при определенных условиях работать в качестве ведущего устройства (в режиме «микропроцессора»), обеспечивая управление шиной.

Программирование устройств

Часто при разработке различных устройств используются микроконтроллеры с памятью E(E)PROM. Выше обсуждались преимущества этого типа микроконтроллеров по сравнению с микроконтроллерами, использующими память ROM. Недостатком E(E)PROM устройств является то, что их необходимо программировать.

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


Часто оборудование для программирования оказывается слишком дорогим, особенно для радиолюбителей и предприятий малого бизнеса). Но в некоторых случаях для программирования требуется весьма простое и доступное оборудование . Когда будут обсуждаться микроконтроллеры Р1С и AVR, можно будет увидеть, как легко программируются некоторые модели этих приборов. Существуют также устройства, которые не требуют оборудования для программирования, например, микроконтроллер Basic STAMP, или имеют встроенный аппаратно-программный блок, избавляющий от необходимости использования внешнего оборудования, кроме источника повышенного напряжения для программирования, как микроконтроллеры 68НС05.

Очень важный аспект, касающийся программирования устройств, заключается в том, может или нет устройство быть запрограммировано в системе (внутрисистемное программирование — ISP). Если микроконтроллер допускает возможность такого программирования, то это означает, что он может быть смонтирован на плату с пустой памятью программ, которая затем может быть запрограммирована без какого-либо влияния на остальные компоненты схемы. Это может стать важным обстоятельством при выборе микроконтроллера. Использование ISP-микроконтроллеров избавляет от необходимости покупать специальный программатор, дает возможность обновлять программное обеспечение без изменения расположенных на плате аппаратных средств, и позволяет производителям создавать запас готовых изделий, которые могут легко модифицироваться в соответствии с поступающими заказами.


Безопасность памяти программ

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

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

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


Интерфейсы отладки

Для большинства рассмотренных в книге микроконтроллеров разработаны и выпускаются схемные эмуляторы ICE (In-Circiiit Emulator), предназначенные для отладки проектируемых устройств. Эти эмуляторы физически заменяют микроконтроллер в проектируемом устройстве и реализуют интерфейс разработчика с данным устройством, обеспечивая доступ к аппаратным средствам и программному обеспечению. Часто разработчики эмуляторов обеспечивают их интеграцию с системой разработки программного обеспечения (редактор и компилятор), давая возможность производить отладку в режиме реального времени, когда исключаются задержки, связанные со стиранием перепрограммированием памяти или выполнением последовательного ввода-вывода (в том числе на светодиодные индикаторы) для определения текущего состояния микроконтроллера. Единственной проблемой для потребителя может стать стоимость таких эмуляторов, которая может составлять тысячи долларов.

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


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