Как сделать функциональную схему микроконтроллера

Обновлено: 08.07.2024

Чтобы вы смогли разобраться, как этот чёрный ящик работает, я расскажу вам, о микроконтроллере (далее МК) ATmega8. В принципе фирма Atmel выпускает целую серию МК семейства AVR – это подсемейства Tiny и Mega. Я не буду расписывать достоинства тех или иных МК, это уж вам решать, что вам больше всего подходит.

Некоторые представители большой семьи:

Итак, ATmega8, самый простой МК из всех ATmega:

Начнем изучать внутренности по упрощенной структурной схеме:

Это обобщённая схема всех ATmega.

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

А теперь о требухе по порядку.
1. Тактовый генератор выполняет синхронизацию всех внутренних устройств.
2. ПЗУ – постоянное запоминающее устройство, используется для хранения программы и неизменяемых данных (констант).
3. Дешифратор команд – он тут самый главный, управляет всем, что ему под руку попадётся.
4. АЛУ – арифметико-логическое устройство, выполняет арифметические (сложение, вычитание и т.д.) и логические (И, ИЛИ, НЕ, Исключающее ИЛИ) операции над числами.
5. РОН – регистры общего назначения, ими АЛУ оперирует, а так же используются для временного хранения данных. Регистры РОН могут объединяться в регистровые пары:
r26 : r27 – X;
r28 : r29 – Y;
r30 : r31 – Z.
Регистровые пары используются для косвенной адресации данных в ОЗУ.
6. ОЗУ – оперативное запоминающее устройство, используется для хранения данных, массивов и стека.
7. PORTA-PORTn – связь с внешним миром, порты ввода/вывода, ну енто понятно для чего…
8. Спец. УВВ – специальные устройства ввода/вывода, контроллеры разной периферии, например USART (по другому СОМ-порт), иногда USB, АЦП, ЦАП, I2C, короче, чего только там нет…

Ну да это всё теория, а вам не терпится что-то склеить, попробовать, и чтобы енто дело работало! Тогда перечислим что нам нужно:

1. Программатор с соответствующим софтом, об этом я писал в прошлой статье;
2. Компилятор языка Си, Code Vision AVR, имеет неплохой инструментарий для разработки программ для МК;

Ну да ладно, начнём…

Тестовая схема.

Давайте соберём такую схему:

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

Включим питание… НОЛЬ. А что вы хотели без программы?
Значит…

Пишем программу!

Итак, вы запустили CVAVR, что нужно сделать первым делом? Запускаем мастер Code Wizard AVR, нажав на кнопочку с шестерёнкой в панели инструментов, появится окно мастера:

Здесь выбираем тип МК и тактовую частоту. Далее переходим на вкладку Ports:

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

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

Скомпилируем программу, для этого нажмём кнопочку Make the Project, или через меню Project / Make. Ошибок быть не должно, если вы что-нибудь не подправили.

Кстати, Pony Prog поддерживает скрипты, и чтобы не мучаться с перезагрузкой, стиранием и записью, можно просто написать скрипт с расширением .e2s, и обозвать его, например, prog.e2s. Сделать это можно с помощью блокнота. Содержимое у него будет такое:

SELECTDEVICE ATMEGA8
CLEARBUFFER
LOAD-ALL prj.hex
ERASE-ALL
WRITE-ALL

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

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

AVR микроконтроллер изнутри

Микроконтроллер изнутри - это компьютер со своим вычислительным устройством, постоянной и динамической памятью, портами ввода-вывода и разной периферией.

Структура AVR микроконтроллера

Внутри микроконтроллер содержит:

  • Быстродействующий процессор с RISC-архитектурой;
  • FLASH-память;
  • EEPROM-память;
  • Оперативную память RAM;
  • Порты ввода/вывода;
  • Периферийные и интерфейсные модули.

RISC (Reduced Instruction Set Computer) - архитектура с тщательно подобранным набором команд, которые как правило выполняются за один такт работы процессора. Современные AVR микроконтроллеры содержат около 130 команд, которые очень быстро выполняются и не требуют больших затрат как по внутри-процессорным ресурсам, так и по потребляемой мощности.

Структурная схема AVR микроконтроллера

Посмотрим на рисунок ниже и разберемся из каких блоков состоит микроконтроллер и как они связаны между собою:

Структура AVR микроконтроллера

Рис. 2. Структурная схема AVR микроконтроллера.

Рассмотрим кратко что изображено на блоках в схеме:

Подробнее о внутренних блоках микроконтроллера

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

JTAG Interface - важный интерфейс который позволяет производить внутреннюю отладку прямо в чипе используя блок внутренней отладки (OCD), без использования эмуляторов. Можно сказать что JTAG - это интерфейс для "железной" отладки микроконтроллера. Через JTAG-адаптер микросхема напрямую подключается к программному комплексу для программирования и отладки.

Используя данный интерфейс можно в пошаговом режиме выполнять программу прямо в микроконтроллере, смотреть как изменяется содержимое регистров, как мигают индикаторы и светодиоды что подключены к микроконтроллеру после каждого шага и т.п. Для подключения к JTAG интерфейсу достаточно 4-х проводников: TDI(Test Data In), TDO(Test Data Out), TCK(Test Clock), TMS (Test Mode Select).

JTAG интерфейс доступен далеко не во всех микроконтроллерах AVR, как правило таким вкусным дополнением обладают чипы у которых 40 и более лапок, а объем памяти доступен в размере не менее 16КБ. Для серьезных задач - серьезные материалы и инструменты. )

FLASH - память программ, энергонезависимое ПЗУ(постоянное запоминающее устройство) что выполнено по технологии FLASH. Здесь хранится программа, которая будет исполняться блоком ALU микроконтроллера. Флешь-память чипа можно многократно перезаписывать, тем самым меняя или дополняя программный код для выполнения. Данный тип памяти может сохранять записанные в нее данные в течение 40 лет, а количество возможных циклов стирания/записи может достигать 10000.

В зависимости от модели микроконтроллера размер FLASH-памяти может достигать 256 KБ.

Serial Peripheral Interface, SPI - последовательный периферийный интерфейс (SPI) который зачастую применяется для обмена данными между несколькими микроконтроллерами со скоростью до нескольких MГц (нескольких миллионов тактов в секунду).

Для обмена данными по SPI интерфейсу между двумя устройствами достаточно 3-х проводников:

  1. MOSI (Master Output Slave Input) - Данные от ведущего к ведомому;
  2. MISO (Master Input Slave Output) - Данные от ведомого к ведущему;
  3. CLK (Clock) — тактовый сигнал.

Устройства с SPI-интерфейсом делятся на два типа: ведущий(Master) и ведомый(Slave). Если к интерфейсу подключено несколько устройств то для обмена данными между ними нужны дополнительные линии связи(проводники) чтобы мастеру можно было выбрать ведомое устройство и сделать запрос к нему.

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

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

Для EEPROM выделено отдельное адресное пространство которое отличается от адресного пространства RAM и FLASH. Память EEPROM микроконтроллера - очень ценный ресурс, поскольку ее как правило очень мало - от 0,5 до нескольких килобайт на чип. Количество перезаписей для данного типа памяти составляет порядка 100000 что в 10 раз больше чем ресурс FLASH памяти.

ALU - Арифметико-логическое устройство, которое синхронно с тактовым сигналом и опираясь на состояние счетчика команд (Program Counter) выбирает из памяти программ (FLASH) очередную команду и производит ее выполнение.

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

  • внутренний RC-генератор, который можно калибровать на нужную частоту;
  • керамический или кварцевый резонатор с конденсаторами (не у всех моделей);
  • внешний тактовый сигнал.

Установка источника тактовых импульсов производится при помощи FUSE-битов.

FUSES (с англ.: плавление, пробка, предохранитель) - специальные 4 байта(4*8=32 бит) данных, которые настраивают некоторые глобальные параметры микроконтроллера в процессе прошивки. После прошивки данные биты нельзя изменить через внутреннюю программу что записана в МК.

Данной конфигурацией бит мы указываем микроконтроллеру вот что:

  • какой использовать задающий генератор (внешний или внутренний);
  • делить частоту генератора на коэффициент или нет;
  • использовать ножку сброса (RESET) для сброса или же как дополнительный пин ввода-вывода;
  • количество памяти для загрузчика;
  • другие настройки зависимо от используемого микроконтроллера.

CPU - это мозг микроконтроллера, который содержит в себе АЛУ, регистры и оперативную память.

К ALU подключен блок из 32-х регистров общего назначения (32 General Purpose Registers - регистровая память), каждый из которых представляет собою 1 байт памяти (8 бит). Адресное пространство регистров общего назначения размещено в начале оперативной памяти (RAM) но не является ее частью. С данными что помещаются в регистры можно производить разнообразные арифметические, логические и битовые операции. Выполнение подобных операций в оперативной памяти не доступно. Для работы с данными из RAM нужно их записать в регистры, произвести в регистрах нужные операции, а потом записать результирующие данные из регистров в память или в другие регистры для выполнения каких-то действий.

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

  • ATxmega - до 32 KБ;
  • ATmega - 16 Кб;
  • ATtiny - 1 Кб.

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

A/D Converter - данный блок преобразовывает аналоговое значение напряжения в цифровое значение, с которым можно работать в программе и на основе которого можно выполнять определенные действия. Как правило диапазон напряжений что подаются на вход АЦП в AVR микроконтроллере находится в пределах 0-5,5 Вольт. Для данного блока очень важно чтобы микроконтроллер питался от стабильного и качественного источника питания. Во многих AVR микроконтроллерах есть специальный отдельный вывод для подачи стабильного питания на схему АЦП.

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

USART - последовательный асинхронный интерфейс для обмена данными с другими устройствами. Есть поддержка протокола RS-232, благодаря чему микроконтроллер можно соединить для обмена данными с компьютером.

Для подобной связи МК с COM-портом компьютера нужен конвертер логических уровней напряжения (+12В для COM - в +5В для микроконтроллера), или же просто RS232-TTL. Для подобных целей используют микросхемы MAX232 и им подобные.

Для подключения микроконтроллера к компьютеру через USB используя UART-интерфейс можно использовать специализированную микросхему FT232RL. Таким образом на новых компьютерах и ноутбуках можно не имея физического COM-порта привязать микроконтроллер используя USB-порт через USART интерфейс.

TWI - интерфейс для обмена данными по двухпроводной шине. К такой шине данных можно подключить до 128 различных устройств, используя две линии данных: тактовый сигнал (SCL) и сигнал данных (SDA). Интерфейс TWI является аналогом базовой версии интерфейса I2C.

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

Watchdog Timer представляет собою систему контроля зависания устройства с последующим его перезапуском. Это как автоматическая кнопка RESET для старенького компьютера с глючной ОС. ))

I/O Ports, GPIO - это набор блоков портов ввода/вывода к пинам которых можно подключить разнообразные датчики, исполняющие устройства и цепи. Количество пинов вход/выход, что идут от портов в микроконтроллере, может быть от 3 до 86.

Выходные драйверы в портах AVR микроконтроллера позволяют напрямую подключать нагрузку з потребляемым током 20 мА(максимум 40 мА) при напряжении питания 5В. Общий нагрузочный ток для одного порта не должен превышать значение в 80 мА (например на 4 пина для одного из портов повесить по светодиоду с током 15-20 мА).

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

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

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

Заключение

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

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

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

Если Вы помните, микроконтроллеры являются потомками управляющих ЭВМ. И сами являются ЭВМ, но специализированными. А какая составляющая ЭВМ является основной и главной? Конечно процессор. Вот с него и начнем изучать микроконтроллеры.

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

Процессор

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

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

Давайте вспомним, какие основные арифметические и логические операции нам известны:

  • Сложение
  • Вычитание
  • Деление
  • Умножение
  • И
  • ИЛИ
  • ИСКЛЮЧАЮЩЕЕ ИЛИ
  • НЕ
  • Сдвиги

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

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

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

РЕЗУЛЬТАТ ← ОПЕРАНД_1 ОПЕРАЦИЯ ОПЕРАНД_2

Кстати, обратите внимание, что ← это тоже операция, операция присваивания (пересылки), если быть точным. Операции с одним операндом можно записать так

РЕЗУЛЬТАТ ← ОПЕРАЦИЯ ОПЕРАНД

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

РЕЗУЛЬТАТ ← ОПЕРАЦИЯ(ОПЕРАНД_1, ОПЕРАНД_2)

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

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

А вот на FLG_I и FLG_O остановлюсь немного подробнее. Это так называемые флаги (флажки), или признаки. И они участвуют в выполнении операции точно так же, как и операнды. Я назову три основных флага. ZF - признак нулевого результата. NF - признак отрицательного результата. CF - признак переноса. В разных процессорах названия флагов могут быть иными, но смысл сохраняется. В реальных микроконтроллерах флагов может быть как меньше, например, нет флага NF, так и больше, например, может присутствовать флаг DF обозначающий перенос между тетрадами в байте. Я предполагаю, что вы знаете, что такое тетрада. Если нет, все таки прочитайте статью о простых типах данных, ссылку на которую я давал.

FLG_I это флаги на входе АЛУ, а FLG_O это флаги после выполнения операции. Флаг может быть сброшен, если соответствующее ему условие не выполнено, или установлен, если выполнено. Так флаг ZF будет установлен, если результат операции равен нулю.

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

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

Вы можете сказать, позвольте, а откуда берутся операнды и код операции? Это ведь не похоже на полноценный процессор. Все верно, АЛУ это лишь часть процессора. Давайте посмотрим, откуда берутся операнды и куда потом девается результат.

Включаем АЛУ в схему процессора

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

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

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

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

ОПЕРАНД_2 ← ОПЕРАНД_1 ОПЕРАЦИЯ ОПЕРАНД_2

Но и этого может оказаться недостаточно. Напомню, что мы говорим о микроконтроллерах - специализированных ЭВМ с весьма ограниченными ресурсами. Поэтому часто команды ограничивают возможностью указать лишь один операнд. Как же тогда быть, например, с операцией сложения? Очень просто, в командах, где необходимо два операнда, неявно участвует специальный регистр. Чаще всего его называют аккумулятором , но название может быть и иным, например, WREG в PIC Microchip. Кстати, аккумулятор часто является и единственным местом, куда может быть помещен результат операции. Более подробно все это будет рассмотрено в следующих статьях, пока нам достаточно такого упрощенного описания.

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

Процессорное ядро всегда имеет свою оригинальную схему и обязательно оригинальное имя. Например, МК фирмы Motorola построены на базе ядра НС05 и ЯС08, фирма Intel создала ядро MCS-51 и MCS-96, контроллеры фирмы Microchip имеют ядро PIC12, PIC16, Р1С17 или PIC18, фирма Atmel развивает семейство МК с ядром AVR.

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

Структура микроконтроллера

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

Большинство высокопроизводительных МК имеют гарвардскую архитектуру, где память разделена на две части: память данных (Data

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

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

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

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

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

Состав процессорного ядра МК, назначение его элементов и их функционирование аналогично МП, рассмотренным выше.

Память. Память МК предназначена для хранения инструкций программы и данных. Физически память организована так же, как в микросхемах памяти. Она состоит из множества ячеек определенной разрядности, каждая из которых имеет свой адрес. Число ячеек (объем памяти) может быть различным.

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

Память программ МК по существующей классификации всегда является какой-либо разновидностью постоянной памяти типа ROM. Она энергонезависима, способна хранить записанную в нее информацию при отсутствии питающего напряжения. Основным режимом такой памяти является чтение данных, но способы записи программы (способы программирования) памяти могут быть разными. В зависимости от назначения микроконтроллера в нем может быть заложена память программ типа PROM, EPROM, EEPROM или Flash-memory.

Микроконтроллер с памятью типа PROM программируются только один раз. Микросхемы с памятью типа EPROM могут быть перепрограммированы. При программировании такие МК извлекаются из изделия и устанавливаются в специальные программаторы. При использовании контроллеров с памятью типа EEPROM и Flash-memory пользователь получает возможность изменения программы без извлечения из изделия. Память типа Flash-memory, кроме того, позволяет организовать перепрограммирование МК непосредственно во время работы.

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

Специализированные ячейки Flash-memory. В энергонезависимой памяти МК Flash-memory могут присутствовать специализированные ячейки различной разрядности, предназначенные для защиты программы пользователя и конфигурирования изделия. Эти ячейки не отображаются в общем массиве памяти программ, имеют оригинальные имена и индивидуально программируются. Такими ячейками могут быть:

  • • биты-блокировки, позволяющие запретить чтение программы, энергонезависимой памяти данных типа EEPROM и программирование кристалла. Запрограммированные биты блокировки, как правило, можно стереть только при очистке Flash-memory программ. При этом уничтожается и сама программа;
  • • биты-предохранители (fuse-биты), задающие некоторые конфигурационные особенности МК. Состав fuse-битов каждого конкретного МК обусловлен особенностями построения узлов сброса, тактирования и программирования кристалла. Fuse-биты могут задавать тип источника тактового сигнала МК, время задержки старта МК после сброса, объем секции начальной загрузки в памяти программ;
  • • байты-сигнатуры, служащие для идентификации типа кристалла. Эти ячейки программируются изготовителем и доступны только для чтения.

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

Для управления функциональными модулями в них предусматриваются регистры ввода-вывода и особые ячейки Flash-memory. В регистры ввода-вывода информация заносится в процессе выполнения программы, а в ячейки Flash-memory — на стадии программирования МК, одновременно с занесением программы в память программ.

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

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

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

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

  • • при поступлении запроса на прерывание завершается выполнение текущей инструкции программы;
  • • записывается в стек содержимое программного счетчика и текущее состояние некоторых наиболее важных регистров общего назначения;
  • • идентифицируется прерывающее устройство;
  • • осуществляется переход к выполнению подпрограммы обслуживания прерывания для идентифицированного устройства;
  • • по окончании подпрограммы обслуживания прерывания из стека извлекается содержимое регистров общего назначения и программного счетчика и восстанавливается состояние прерванной программы;

• возобновляется выполнение прерванной программы.

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

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

Аналого-цифровые преобразователи. АЦП в составе МК предназначен для оцифровки и ввода аналоговых сигналов с различных датчиков физических величин. В состав МК обычно входят 8—16-битные многоканальные преобразователи с большим набором встроенных функций. При этом все функции преобразователя программируются и могут быть изменены в процессе работы.

Для управления преобразователем в МК используются специальные регистры данных, управления и состояния АЦП.

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

Таймеры-счетчики. Таймеры-счетчики обеспечивают работу МК в реальном времени. С их помощью МК может выполнять определенные заранее действия с объектом в заданные моменты времени. Типовыми задачами таймеров-счетчиков являются:

  • • подсчет импульсов сигнала за фиксированный интервал времени;
  • • формирование интервалов времени определенной длительности;
  • • формирование периодических сигналов заданной частоты;
  • • формирование широтно-модулированных сигналов;
  • • формирование временных задержек;
  • • измерение времени и др.

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

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

Последовательные интерфейсы. Периферийные модули, реализующие стандартные последовательные интерфейсы, обеспечивают связь МК с другими элементами системы. Современные МК обычно поддерживают несколько стандартных протоколов обмена интерфейса. Наиболее распространенными среди них являются UART, SPI, 1 2 С. Число линий, по которым происходит передача информации, в таких модулях равно двум или трем.

Микроконтроллер может выступать в роли передатчика или приемника. Синхронизацию обмена обеспечивает передатчик.

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

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

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

  • 1) активный режим, в котором микроконтроллер выполняет заложенную в него программу и включены все его функциональные блоки;
  • 2) режимы энергосбережения, в которых отключаются те или иные функциональные блоки МК и его энергопотребление существенно снижается.

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

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

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

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

Читайте также: