Память микроконтроллеров AVR
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Микроконтроллеры AVR

Введение

 

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

Со времени появления первых микропроцессоров в 1970-х годах их сложность постоянно возрастала за счет появления новых аппаратных решений и добавления новых команд, предназначенных для решения новых задач. Так постепенно сложилась архитектура, получившая впоследствии название CISC (Complete Instruction Set Computers – компьютеры со сложным набором команд). В дальнейшем обозначилось и нашло активное развитие еще одно направление: архитектура RISC (Reduced Instruction Set Computers – компьютеры с сокращенным набором команд). Именно к этой архитектуре относятся микроконтроллеры AVR от компании Atmel и PIC от компании Microchip, которым посвящена эта книга.

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

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

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

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

 


1. Архитектура микроконтроллеров AVR и PIC

 

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

 

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

 

Будем рассматривать микроконтроллеры в общем, не привязываясь к какому-либо конкретному типу микроконтроллеров AVR, поэтому ниже будут рассмотрены только общие для большинства микроконтроллеров особенности архитектуры памяти, вопросы ввода/вывода, обработки прерываний, сброса и др.


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

 

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

Здесь и далее шестнадцатеричные числа будут представлены в форме, принятой в языке С: с префиксом 0х.

 

Рис. 2.1. Структура памяти данных в микроконтроллерах AVR и PIC

 

Область статической памяти SRAM (Static Random Access Memory) обозначена на рис. 2.1 пунктиром, поскольку используется не всеми микроконтроллерами AVR (это относится как к внутренней, так и к внешней SRAM). Ее начальный адрес – 0x060, а верхний адрес – разный в различных устройствах.

В некоторых микроконтроллерах AVR можно увеличивать пространство памяти SRAM посредством подключения внешних блоков памяти вплоть до 64 Кбайт, однако для этого приходится пожертвовать портами А и С, которые в этом случае применяются для передачи данных и адресов.

Регистры общего назначения

 

Область регистров общего назначения (рабочих регистров) предназначена для временного хранения переменных и указателей, используемых процессором для выполнения программ. В микроконтроллерах AVR она состоит из 32 восьмиразрядных регистров (диапазон адресов 0x000 – 0x01F). В микроконтроллерах PIC регистры общего назначения также восьмиразрядные, однако их количество и диапазон адресов зависят от конкретного типа устройства.

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

Стек

 

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

Стек действует по принципу LIFO – "Last In, First Out", что означает "последним вошел, первым вышел". Это означает, что новые данные вначале помещаются на вершину (первый уровень) стека, а затем, с поступлением следующих данных, "проталкиваются" на его нижние уровни. Извлечение из стека происходит в обратном порядке: вначале считываются данные, помещенные последними на вершину, после чего данные, размещенные на нижних уровнях, как бы "выталкиваются" на один уровень вверх. Ячейка памяти, которая является в данный момент вершиной стека, адресуется указателем стека (для AVR – регистровой парой SPL, SPH).

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

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

 

Память программ как в микроконтроллерах AVR, так и в микроконтроллерах PIC реализована по технологии Flash–EPROM, которая подразумевает программирование пользователем и вытирание электрическим способом. Размер этой памяти варьируется в зависимости от микроконтроллера и обычно составляет несколько Кбайт командных слов.

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

Адресация команд в памяти программ реализуется с помощью специального регистра – счетчика команд, разрядность которого определяет допустимый размер этой памяти. Разрядность ячеек памяти программ, в зависимости от типа микроконтроллера, может составлять 14…16 бит.

Кроме того, следует отметить, что в микроконтроллерах PIC в первых ячейках памяти программ (начиная с адреса 0x0000) содержатся векторы (адреса перехода) сброса и прерываний.

Обработка прерываний

 

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

Прерывания бывают внутренними и внешними. Источниками внутреннего прерывания являются встроенные модули микроконтроллера (например, таймер/счетчик или сторожевой таймер). Внешние прерывания вызываются сбросом (сигнал на выводе RESET) или сигналами предустановленного уровня на выводах INT. К примеру, в микроконтроллерах AVR за характер сигналов на выводах INT0/INT1, вызывающих прерывание, определяется с помощью разрядов регистра управления MCUCR: ISC00 (разряд 0), ISC01 (разряд 1) – для входа INT0; ISC 10 (разряд 2), ISC11 (разряд 3) – для входа INT1 (табл. 3.1 и табл. 3.2).

 

Таблица 3.1. Выбор способа активизации прерывания по входу INT0

Разряд ISC01 Разряд 1SC00 Описание
0 0 Прерывание вызывается по уровню лог. 0 на входе INT0
1 0 Прерывание вызывается по ниспадающему фронту сигнала INT0
1 1 Прерывание вызывается по нарастающему фронту сигнала INT0

 

Таблица 3.2. Выбор способа активизации прерывания по входу INT1

Разряд ISC11 Разряд ISC10 Описание
0 0 Прерывание вызывается по уровню лог. 0 на входе INT1
1 0 Прерывание вызывается по нарастающему фронту сигнала INT1
1 1 Прерывание вызывается по ниспадающему фронту сигнала INT1

 

В ряде микроконтроллеров PIC выбор фронта для активизации прерывания по входу INT определяется состоянием разряда 6 регистра OPTION: лог. 1 в этом разряде соответствует прерывание по нарастающему, а лог. 0 – по ниспадающему фронту сигнала. Для установки этого разряда в языке С обычно используют специальные функции.

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

 

Таблица 3.3. Векторы прерываний

Адрес в памяти программ Источник прерывания Описание
0x0000 RESET Сигнал сброса
0x0001 INT0 Внешний запрос на прерывание по входу INT0
0x0002 INT1 Внешний запрос на прерывание по входу INT1
0x0003 Т/С1 Захват по таймеру/счетчику Т/С1
0x0004 Т/С1 Совпадение с регистром сравнения А таймера Т/С1
0x0005 Т/С1 Совпадение с регистром сравнения В таймера Т/С1
0x0006 Т/С1 Переполнение таймера/счетчика Т/С1
0x0007 Т/С0 Переполнение таймера/счетчика Т/С0
0x0008 SPI Завершение передачи данных по интерфейсу SPI
0x0009 UART Прием байта приемопередатчиком UART завершен
0х000А UART Регистр данных приемопередатчика UART пуст
0x000В UART Передача данных приемопередатчиком UART завершена
0х000С ANA_COMP Прерывание от аналогового компаратора

 

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

В момент возникновения прерывания в стек помещается адрес возврата – адрес команды, которая должна быть выполнена первой после выхода из подпрограммы обработки прерывания. В результате выполнения последней ассемблерной команды подпрограммы обработки прерывания (для микроконтроллеров AVR – это команда reti, а для микроконтроллеров PIC – retfie) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается.

Регистр GIMSK

 

Регистр GIMSK (рис. 3.1), расположенный в области ввода/вывода по адресу 0x003В (адрес в SRAM – 0x005В), используется для разрешения внешних прерываний.

 

7 6 5 4 3 2 1 0
INT1 INT0

Рис. 3.1. Структура регистра GIMSK микроконтроллеров AVR

 

Если разряд INT1/INT0 установлен в лог. 1, то внешнее прерывание по входу INT1/INT0 будет разрешено до тех пор, пока установлен в лог. 1 разряд I в регистре состояния SREG.

Регистр GIFR

 

Состояние внешнего прерывания определяется по регистру GIFR (рис. 3.2), который расположен в области ввода/вывода по адресу 0х003А (адрес SRAM – 0х005А).+

 

7 6 5 4 3 2 1 0
INTF1 INTF0

Рис. 3.2. Структура регистра GIFR микроконтроллеров AVR

 

Флаг INTF1/INTF0 устанавливается в лог. 1, если возникает внешнее прерывание по сигналу на выводе INT1/INT0. При входе в подпрограмму обработки прерывания этот разряд переводится аппаратно в исходное состояние лог. 0.

Регистры TIMSK и TIFR

 

Регистр TIMSK (рис. 3.3), расположенный в области ввода/вывода по адресу 0x0039 (адрес в SRAM – 0x0059), используется для разрешения прерываний от таймеров/счетчиков.

 

7 6 5 4 3 2 1 0
TOIE1 OCIE1A OCIE1B TICIE1 TOIE0

Рис. 3.3. Структура регистра TIMSK микроконтроллеров AVR

 

Состояние прерываний, имеющих отношение к таймерам/счетчикам микроконтроллеров AVR, определяется по регистру TIFR (рис. 3.4), который расположен в области ввода/вывода по адресу 0x0038 (адрес SRAM – 0x0058).

 

7 6 5 4 3 2 1 0
TOV1 OCF1A OCF1B ICF1 TOV0

Рис. 3.4. Структура регистра TIFR микроконтроллеров AVR

 

Когда разряд TOIE1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при переполнении Т/С1. В случае переполнения в регистре TIFR устанавливается флаг TOV1.

Если разряд OCIE1A и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при совпадении содержимого регистра сравнения А с текущим состоянием Т/С1. В случае совпадения, в регистре TIFR устанавливается флаг OCF1 А.

Если разряд OCIE1B и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при совпадении содержимого регистра сравнения В с текущим состоянием Т/С1. В случае совпадения, в регистре TIFR устанавливается флаг OCF1B.

Если разряд TICIE1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при выполнении условия захвата. Когда возникает срабатывание по захвату, в регистре TIFR устанавливается флаг ICF1.

Если разряд TOIE0 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при переполнении таймера/счетчика Т/СО. В таком случае, в регистре TIFR устанавливается флаг TOV0.

Установка в лог. 1 одного из флагов в регистре TIFR приводит к переходу по соответствующему вектору прерывания. При входе в подпрограмму обработки прерывания, флаг в регистре TIFR аппаратно сбрасывается в лог. 0.



Сброс

 

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

Возможны следующие варианты сброса:

-сброс при включении питания;

-внешний сброс – сигнал сброса подается на соответствующий вывод микроконтроллера;

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

"Спящие" режимы процессора

 

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

Переход в "спящий" режим реализуется по ассемблерной команде sleep. В случае микроконтроллеров AVR, при этом должен быть предварительно установлен в лог. 1 разряд SE (разряд 5) регистра управления MCUCR.

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

Для микроконтроллеров AVR может быть выбран один из двух "спящих" режимов:

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

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

Выбор одного из "спящих" режимов в микроконтроллерах AVR осуществляется с помощью разряда SM (разряд 4) регистра управления MCUCR. Если разряд SM установлен в лог. 1, то микроконтроллер переводится в режим пониженного энергопотребления последующей командой sleep, если же разряд SM сброшен в лог. 0, то последующей микроконтроллер переводится в ждущий режим в том случае, если ранее в регистре MCUCR был установлен разряд SE.

Таймеры/счетчики

 

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

В микроконтроллерах AVR и PIC используются как 8-ми, так и 16-ти разрядные таймеры/счетчики. Разрядность определяет момент переполнения счетчика (возврат в нулевое состояние). Так, для 8-разрядного счетчика переполнение наступает, когда счет достигает 255, а для 16-разрядного – 65535.

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

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

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

Т/С0

 

Схема работы таймера/счетчика Т/С0, представлена на рис. 4.1.

Как только с помощью разрядов CS00, CS01 и CS02 регистра TCCR0 (адрес 0x33 в области ввода/вывода, адрес 0x53 в SRAM) для делителя частоты будет установлена комбинация, отличная от 000, таймер/счетчик Т/С0 по каждому импульсу, поступающему на тактовый вход, начинает увеличивать на единицу содержимое регистра TCNT0 (адрес 0x32 в области ввода/вывода, адрес 0x52 в SRAM). Когда состояние счетчика в регистре TCNT0 изменяется с 0xFF на 0x00, в регистре TIFR (адрес 0x38 в области ввода/вывода) устанавливается флаг переполнения TOV0.

 

Рис. 4.1. Схема таймера/счетчика Т/С0

 

Кроме разрядов CS00, CS01 и CS02 регистра TCCR0 (разряды 0-2), никакие другие разряды этого регистра не используются.

Таймер/счетчик Т/С0 хорошо подходит для оценки временных интервалов. Для этого в ходе выполнения программы в регистр TCNT0 записывается исходное значение. Затем может быть запущен Т/С0 с требуемым входным тактом. Программа ожидает появления в регистре TIFR флага переполнения TOV0, указывающего на то, что требуемое время истекло.

Предположим частота системной синхронизации составляет 4 МГц, а некоторое действие должно выполняться программой каждые 0,5 с. В этом случае можно воспользоваться делением частоты на 8, что соответствует частоте тактирования 500 кГц или 2 мкс. Таким образом, на подсчет 256 тактовых импульсов счетчику потребуется 512 мкс. Это значение должно быть кратно 500 мкс, чтобы с помощью множителя 1000 в программе можно было реализовать требуемое действие в точности с периодом 500 мс. Для этого в счетчик перед началом каждого счета должно быть загружено значение 6, чтобы до переполнения выполнялся подсчет не 256, а только 250 тактовых импульсов.

Т/С1

 

16-разрядный таймер/счетчик Т/С1 гораздо сложнее Т/С1 (рис. 4.2).

 

Рис. 4.2. Схема таймера/счетчика T/C1

 

В дополнение к счетному регистру и регистру управления, он содержит регистр захвата по входу (ICR1) и два 16-ти разрядных регистра сравнения на выходе (в некоторых моделях микроконтроллеров регистр сравнения В отсутствует).

Рассмотрим назначение отдельных регистров:

-TCNT1 – счетный регистр (содержимое счетчика);

-TCCR1А – регистр управления для определения реакции выводов

-ОС1А/ОС1В в случае совпадения состояния счетчика в регистре TCNT1 с регистрами сравнения OCR1A/OCR1B, а также для выбора режима широтно-импульсной модуляции;

-TCCR1B – регистр управления для настройки делителя частоты, для разрешения подачи сигнала сброса для регистра TCNT1 и для управления захватом;

-ICR1 – регистр захвата по входу (при появлении на выводе ICP фронта входного сигнала, определенного как активный, текущее состояние счетчика будет перенесено в этот регистр);

-OCR1A, OCR1B – регистры сравнения; их содержимое постоянно сравнивается с состоянием счетчика. В случае совпадения выполняются действия, определенные регистром TCCR1A.

Регистр управления TCCR1A (рис. 4.3) находится в области ввода/вывода по адресу 0x2F (адрес 0x4F в SRAM).

 

7 6 5 4 3 2 1 0
COM1A1 COM1A0 COM1B1 COM1B0 PWM11 PWM10

Рис. 4.3. Регистр TCCR1A таймера/счетчика T/C1

 

Разряды СОМ1А1/СОМ1А0 и СОМ1В1/СОМ1В0 определяют состояние вывода ОС1 А/ОС 1В при совпадении содержимого регистра сравнения А/В с содержимым счетчика. Возможные настройки для режима сравнения показаны в табл. 4.2.


Таблица 4.2. Возможные варианты для работы в режиме сравнения

СОМ1х1 СОМ1Х0 Действия в случае совпадения
0 0 Выходное значение отсутствует
0 1 При совпадении ОС1х переключается в другое состояние
1 0 При совпадении на выходе ОС1х устанавливает лог. 0
1 1 При совпадении на выходе ОС1х устанавливает лог. 1

 

В случае активизации режима ШИМ, разряды 4…7 в регистре TCCR1А имеют значения, отличные от указанных в табл. 1.6. Когда регистр управления TCCR1A определяет работу в конфигурации широтно-импульсного модулятора, то Т/С1 работает как суммирующий и вычитающий счетчик, осуществляя циклические переходы от 0x0000 к максимальному значению ТОР, и затем снова возвращаясь к 0x0000. При запрограммированной разрешающей способности ШИМ в N разрядов значение ТОР рассчитывается как:

 

 

Частота fШИМ, с которой повторяются циклы ШИМ, вычисляется по формуле:

 

 

причем частота таймера/счетчика fT/ci выбирается с помощью разрядов CSIO–CS 12 регистра TCCR1B, а разрешающая способность N – с помощью разрядов PWM10 и PWM11 регистра TCCR1A. Соответствующие взаимосвязи показаны в табл. 4.3.

 

Таблица 4.3. Выбор режима ШИМ (PWM11 и PWM10)

PWM11 PWWI10 Разрешающая способность Значение ТОР Частота ШИМ
0 0

Режим ШИМ не активен

0 1 8 разрядов 0x00FF (255) fT/С1 /510
1 0 9 разрядов 0x01FF (511) fT/С1 /1022
1 1 10 разрядов 0x03FF(1023) fT/С1 /2046

 

Когда состояние счетчика в регистре TCNT1 совпадает со значением 10 младших разрядов регистра OCR1A/OCR1B, то, в зависимости от состояния разрядов СОМ1А1/СОМ1А0 или СОМ1В1/СОМ1В0 регистра TCCR1A, вывод ОС1А/ОС1В последующим тактовым импульсом устанавливается или сбрасывается. Соответствующие взаимосвязи показаны в табл. 4.4.

 

Таблица 4.4. Возможности выбора для режима сравнения

СОМ1х1 СОМ1х0 Действие в случае совпадения
0 0 На выводе ОС1х нет никакого сигнала
0 1 На выводе ОС1х нет никакого сигнала
1 0 Неинвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х устанавливается лог. 0, а при подсчете с вычитанием – лог. 1
1 1 Инвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х устанавливается лог. 1, а при подсчете с вычитанием –лог. 0

 

В случае неинвертирующего широтно-импульсного модулятора, коэффициент заполнения g прямоугольного сигнала на выводе с ШИМ соответствует значению n / (2N - 1), где n – значение в соответствующем регистре OCR, a N – разрешающая способность ШИМ в разрядах (рис. 4.4).

 

Рис. 4.4. Определение периода Т, коэффициента заполнения g и среднего арифметического UAV прямоугольных импульсов напряжения U

 

Если регистр сравнения OCR1A/OCR1B содержит значение ТОР или 0, то на соответствующем выводе, в соответствии с правилами, представленными в табл. 4.5, постоянно поддерживаются уровень лог. 0 или лог. 1.

На рис. 4.5. на примере фиктивной трехразрядной ШИМ показано формирование неинвертированного и инвертированного выходного ШИМ – сигнала на выходе ОС1В. На диаграмме А показан примерный вид ступенчатого сигнала, соответствующий состоянию счетчика TCNT1, на диаграмме В – неинвертированный, а на диаграмме С – инвертированный выходной сигнал. Продолжительность периода TPWM в этом случае вычисляется в соответствии с рассмотренным выше уравнением TPWM = TT/C1 * (2N+1 - 2). Таким образом, при N=3 период ШИМ-сигнала состоит из 14 периодов тактового сигнала fT/C1 на входе TCNT1.

 

Таблица 4.5. Вывод ШИМ для особых случаев

СОМ1х1 СОМ1хО OCR1X Вывод ОС1х
1 0 0 0
1 0 ТОР 1
1 1 0 1
1 1 ТОР 0

Рис. 4.5. Способ формирования неинвертированных и инвертированных выходных ШИМ-сигналов

 

В данном примере регистр сравнения OCR1B содержит значение 5. В регистре TCNT1, учитывая тот факт, что его исходное значение равно 0, значение 5 появляется после пяти тактовых импульсов. На следующем тактовом импульсе, после распознания совпадения на выводе ОС 1В устанавливается уровень лог. 0 (рис. 1.12, В).

Регистр TCNT1 инкрементируется далее до тех пор, пока не будет достигнуто значение ТОР, которое при трехразрядной ШИМ составляет 7. Как только достигнуто значение ТОР, направление счета меняется на обратное, и регистр выполняет вычитание. После девятого тактового импульса, начиная от стартового значения 0, содержимое регистра TCNT1 опять совпадает с содержимым регистра OCR1B. На следующем тактовом импульсе на выходе ОС1В устанавливается уровень лог. 1.

Регистр TCNT1 декрементируется далее до тех пор, пока опять не будет достигнуто значение 0. Это происходит после в общей сложности четырнадцати тактовых импульсов, считая от начального значения 0. Таким образом завершается период ШИМ-сигнала, направление счета вновь меняется на обратное и регистр TCNT1 опять выполняет сложение. Как видно на рис. 1.12 (В), "высокая" составляющая выходного сигнала составляет 6 тактовых периодов, а "низкая" – 4. Таким образом, коэффициент заполнения g = 6/10 или g = 3/5. Аналогично, диаграмма С на рис. 1.12 показывает соотношения для инвертированного выходного ШИМ-сигнала.

В режиме ШИМ устанавливается флаг переполнения TOV1, если счетчик при достижении состояния 0 меняет направление счета на обратное. Это прерывание по Т/С1 при переполнении, как и при нормальной работе в режиме счетчика, вызывается в том случае, если установлен флаг общего разрешения прерываний I в регистре состояния SREG, а также флаг TOIE1 в регистре TIMSK. В соответствии с этим, прерывания при совпадении регистров TCNT1 и OCR1A/OCR1B вызываются тогда, когда в регистре TIMSK установлен флаг общего разрешения прерываний и флаг OCIE1A/OCIE1B.

В отношении таймера/счетчика Т/С1 осталось рассмотреть еще регистр управления TCCR1B (адресу 0х2Е в области ввода/вывода, адрес 0х4Е в SRAM). Структура регистра TCCR1B показана на рис. 4.6.

 

7 6 5 4 3 2 1 0
ICNC1 ICES1 CTC1 CS12 CS11 CS10

Рис. 4.6. Регистр TCCR1В таймера/счетчика Т/С1

 

Разряды 0 – 2 используются для выбора частоты тактирования Т/С1 (табл. 1.5). Если разряд СТС1 установлен в лог. 1, то Т/С1 возвращается в состояние 0x0000 по импульсу такта системной синхронизации, следующего после совпадения содержимого счетчика и регистра сравнения А. При работе в режиме ШИМ этот разряд на процесс работы никак не влияет.

Разряд ICES1 определяет, каким образом должна осуществляться передача состояния счетчика в регистр захвата ICR1: по нарастающему (ICES 1 = 1) или по ниспадающему фронту (ICES 1=0).

Разряд ICNC1 определяет, должно ли быть активизировано подавление помех (если ICNC1 = 0, то подавление помех отключено), Для подавления кратковременных импульсов помех, которые могут привести к ошибочному запуску, входной сигнал зондируется на протяжении четырех периодов такта системной синхронизации. Только после того как будут распознаны четыре последовательных низких или высоких уровня входного сигнала, что определяется разрядом ICES1, при активном подавлении помех будет выполнена запись текущего состояния счетчика в регистр ICR1.



Т/С2

 

Таймер/счетчик Т/С2 обычно имеет разрядность 8 бит и реализует функции сравнения на выходе и ШИМ, аналогичные Т/С1. Основная особенность Т/С2 заключается в том, что в качестве источника тактовых импульсов он может использовать генератор, независимый от системного. Для управления Т/С2 используются два регистра: ASSR (рис. 4.7) и TCCR2 (рис. 4.8).

 

7 6 5 4 3 2 1 0
AS2 TCN2UB OCR2UB TCR2UB

Рис. 4.7. Регистр ASSR таймера/счетчика Т/С2

 

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

 

7 6 5 4 3 2 1 0
PWM2 COM21 COM20 CTC2 CS22 CS21 CS20

Рис. 4.8. Регистр TCCR2 таймера/счетчика Т/С2

 

Установка в лог. 1 разряда PWM2 переводит Т/С2 в режим ШИМ. Назначение разрядов COM21 и СОМ20 идентично назначению разрядов COM lxl и СОМ 1x0 таймера/счетчика Т/С1 – выбор режима сравнения на выходе.

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

TMR0

 

TMR0 (рис. 4.9) – это 8-разрядный таймер/счетчик. Таким образом, счет для него ограничен диапазоном 0-255. Его тактирование реализуется от внешнего источника или на основании такта системной синхронизации.


Рис. 4.9. Схема таймера/счетчика TMR0

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

-разряд 5 – T0CS – определяет выбор источника синхроимпульсов (0 – внутренний; 1 – внешний на входе TOCKI);

-разряд 4 – T0SE – определяет выбор фронта, по которому происходит увеличение содержимого счетного регистра TMR0 (0 – по нарастающему; 1 – по ниспадающему фронту тактового сигнала);

-разряд 3 – PSA – использование предварительного делителя частоты (0 – делитель используется для управления таймером TMR0; 1 – для управления сторожевым таймером);

-разряды 0-2 – PS0, PS1, PS2 – выбор коэффициента деления частоты входного тактового сигнала (табл. 4.6).

 

Таблица 4.6. Назначение разрядов PSO - PS2 регистра OPTIONJREG

PS2 PS1 PSO Коэффициент деления частоты входного тактового сигнала
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
1 0 1 64
1 1 0 128
1 1 1 256

 

Для управления прерываниями от таймера TMR0 используются следующие разряды регистра INTCON:

-разряд 2 – TOIF – флаг прерывания при переполнении TMR0;

-разряд 5 – TOIE – флаг разрешения прерывания при переполнении TMR0;

-разряд 7 – GIE – флаг общего разрешения прерываний.


TMR1

 

TMR1 (рис. 4.11) – это 16-разрядный таймер/счетчик, который может использоваться для формирования запросов на прерывание, подобно TMR0, или же работать в режимах захвата, сравнения и ШИМ.

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

Для управления таймером TMR1 используется регистр T1CON (рис. 4.12). Назначение отдельных разрядов регистра T1CON:

-TMRION – подключение таймера (0 – отключен, 1 – включен);

-TMR1CS – выбор источника тактирующих сигналов (0 – такт системной синхронизации; 1 – генератор 32,768 кГц);

-Tl SYNC – включение/отключение синхронизация специального генератора с генератором импульсов системной синхронизации (0 – включена; 1 – отключена);

-T10SCEN – разрешение/запрет тактирования таймера TMR1 от специального генератора (0 – генератор отключен; 1 – тактирование разрешено);

T1CKPS0, T1CKPS1 – выбор коэффициента деления частоты (табл. 4.7).


Рис. 4.11. Схема таймера/счетчика TMR1

 

7 6 5 4 3 2 1 0
T1CKPS1 T1CKPS0 T10SCEN T1SYNC TMR1CS TMR1ON

Рис. 4.12. Регистр T1CON микроконтроллеров PIC

 

Таблица 4.7. Назначение разрядов T1CKPS0 - T1CKPS1 регистра T1CON

T1CKPS1 T1CKPS0 Коэффициент деления частоты тактового сигнала
0 0 1
0 1 2
1 0 4
1 1 8

 

Счетный регистр таймера TMR1 представляет собой регистровую пару TMR1H, TMR1L, а управление прерываниями осуществляется с помощью разрядов регистров PIR1 и РIЕ1:

Регистр PIR1:

 

-разряд 0 – TMR1IF – флаг переполнения TMR1;

-разряд 2 – ССР 1 IF – флаг прерывания при возникновении захвата по входу/


Регистр PIE1:

 

-разряд 0 – TMR1IE – флаг разрешения прерывания при переполнении TMR1;

-разряд 2 – ССР НЕ – флаг разрешения прерывания при возникновении захвата по" входу.



TMR2

Назначение таймера TMR2 (рис. 4.13) – измерение временных интервалов для реализации ШИМ, обеспечения определенной скорости обмена по последовательному порту и т.п. В этом смысле он подобен таймеру TMR0.

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

 

Рис. 4.13. Схема таймера/счетчика TMR2

 

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

Для управления таймером TMR2 используется регистр T2CON (рис. 4.14).

7 6 5 4 3 2 1 0
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

Рис. 4.14. Регистр T2CON микроконтроллеров PIC

 

Назначение отдельных разрядов регистра T2CON:

-T2CKPS0-T2CKPS1 –управление предварительным делителем частоты (табл. 4.8);

-TMR20N – подключение таймера (0 – отключен, 1 – включен);

-TOUTPS0-TOUTPS3 – выбор коэффициента деления частоты запросов на прерывание при TMR2::=:PR2 (табл. 4.9).

 

Таблица 4.8. Назначение разрядов T2CKPS0 - T2CKPS1 регистра T2CON

T1CKPS1 T1CKPS0 Коэффициент деления частоты тактового сигнала
0 0 1
0 1 4
1 X 16

 

Таблица 4.9. Назначение разрядов TOUTPS0 - TOUTPS3 регистра T2CON

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 Коэффициент деления частоты запросов
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
0 1 0 0 5
о 1 0 1 6
0 1 1 0 7
0 1 1 1 8
  0 0 0 9
  0 0 1 10
  0 1 0 11
  0 1 1 12
  1 0 0 13
  1 0 1 14
  1 1 0 15
  1 1 1 16

 

Для организации прерываний используются разряды TMR2JE (флаг разрешения) и TMR2IF (флаг прерывания) регистров PIE1 и PIR1 соответственно.

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

 

 

где Т – требуемая временная задержка, К1 – коэффициент деления предварительного делителя частоты; К2 – коэффициент деления делителя частоты запросов на прерывание; PR2 – содержимое регистра PR2; F – частота системной синхронизации.

Модуль ССР

Таймеры TMR1 и TMR2 микроконтроллеров PIC применяются в составе модуля сравнения/захвата/ШИМ – ССР (Compare-Capture-PWM). Таких модулей может быть два: ССР1 и ССР2, – управление которыми реализовано с помощью регистров CCPxCON (рис. 4.15),

 

7 6 5 4 3 2 1 0
DC1BX1 DC1BX0 CCP1M3 CCP1M2 CCP1M1 CCP1M0

Рис. 4.15. Регистр CCPxCON микроконтроллеров PIC

 

Назначение отдельных разрядов регистра CCPxCON:

ССР1М0 – ССР1МЗ – выбор режима захвата/сравнения (табл. 4.9) DC1ВХ0 – DC1ВХ1 – два младших разряда 10-разрядной ШИМ.

Таблица 4.9. Назначение разрядов ССР1М1 -ССР1МЗ регистра CCPxCON

ССР1МЗ ССР1М2 ССР1М1 ССР1М0 Значение
0 0 X X Модуль ССР отключен
0 1 0 0 Захват по каждому ниспадающему фронту
0 1 0 1 Захват по каждому нарастающему фронту
0 1 1 0 Захват по каждому 4-му нарастающему фронту
0 1 1 1 Захват по каждому 16-му нарастающему фронту
1 0 0 0 В случае совпадения на выходе – высокий уровень
1 0 0 1 В случае совпадения на выходе – низкий уровень
1 0 1 0 В случае совпадения – запрос на прерывание
1 0 1 1 Особый случай режима сравнения
1 1 X X Режим ШИМ

 

В режиме захвата (то есть, фиксации значения таймера в момент появления определенного условия) используются регистры CCPR1H, CCPR1L (в случае TMR1) или CCPR2H, CCPRL (в случае TMR2). В таком режиме таймер выполняет функции счетчика тактовых импульсов, и при наступлении условия захвата его содержимое переписывается в регистровую пару CCPRx.

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

В режиме ШИМ таймер работает как делитель частоты, формирующий период ШИМ-сигнала. Его значение постоянно сравнивается с содержимым регистра PR2, и при совпадении компаратор сбрасывает таймер в исходное состояние, после чего цикл повторяется. Параллельно организован контур сравнения, включающий в себя таймер, второй компаратор и регистр CCPRxH. Выходы обоих компараторов управляют RS-триггером, выход которого соединен с выводом ССРх.

Вначале триггер устанавливается в "1" по сигналу сброса таймера, а по сигналу компаратора контура сравнения – сбрасывается в "О". Таким образом, на выходе RS-триггера формируется сигнал с периодом, определяемым содержимым регистров PR2 и CCPRxH.

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

 

Сторожевой таймер (watchdog timer) – встроенный таймер, тактируемый внутренним RC-осциллятором, который автоматически сбрасывает микроконтроллер при переполнении своего счетного регистра. В частности, он используется для предотвращения перехода микроконтроллера в режим бесконечного цикла, когда на него невозможно повлиять извне. Обобщенная структурная схема сторожевого таймера показана на рис. 5.1.

В микроконтроллерах AVR и PIC управление сторожевым таймером несколько отличается. Так, в микроконтроллерах AVR для этого используется регистр управления WDTCR (адрес в области ввода/вывода – 0x21, адрес SRAM – 0x41) (рис. 5.2).

 

Рис. 5.1. Структурная схема сторожевого таймера

 

7 6 5 4 3 2 1 0
WDTOE WDE WDP2 WDP1 WDP0

Рис. 5.2. Регистр WDTCR микроконтроллеров AVR

 

Назначение отдельных разрядов регистра WDTCR:

-WDP0-WDP2 – выбор коэффициента деления частоты следования сигналов сброса (при этом период до наступления сброса зависит от рабочего напряжения процессора – табл. 5.1);

-WDE – включение/отключение сторожевого таймера (1 – включен);

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

 

Таблица 5.1 Назначение разрядов WDP0 - WDP2 регистра WDTCR

WDP2 WDP1 WDPP Коэффициент деления Период до сброса (при Vcc в 5 В) Период до сброса (при Vcc = 3 В)
0 0 0 1 16 мс 47 мс
0 0 1 2 32 мс 94 мс
0 1 0 4 64 мс 190 мс
0 1 1 8 128 мс 380 мс
1 0 0 16 256 мс 750 мс
1 0 1 32 512 мс 1,5с
1 1 0 64 1 с Зс
1 1 1 128 2,1 с

 

В системе команд AVR сторожевой таймер сбрасывается в исходное состояние по команде wdr. В микроконтроллерах PIC для управления сторожевым таймером предназначен рассмотренный выше регистр OPTION. Для этого разряд PSA должен быть установлен в лог. 1, чтобы предварительный делитель частоты был переключен на использование совместно со сторожевым таймером, а не с TMR0. Коэффициент деления выбирается с помощью разрядов PS2-PS0 (табл. 5.2). В отличие от микроконтроллеров AVR, в микроконтроллерах PIC отсутствует возможность включать/отключать сторожевой таймер с помощью регистра управления. Единственный способ предотвратить сброс от сторожевого таймера – периодически выполнять ассемблерную команду clrwdt.

 

Таблица 5.2. Выбор коэффициента деления частоты следования сигналов сброса от сторожевого таймера в микроконтроллерах PIC

PS2 PS1 PS0 Коэффициент деления Период до сброса
0 0 0 1 18 мс
0 0 1 2 36 мс
0 1 0 4 72 мс
0 1 1 8 144 мс
1 0 0 16 288 мс
1 0 1 32 576 мс
1 1 0 64 1,2 с
1 1 1 128 2,3 с

 

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

 

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

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

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

 

Рис. 7.1. Типичный формат асинхронной передачи данных (в данном примере – байта 10000010)

 

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

В микроконтроллерах AVR асинхронная передача данных осуществляется с помощью приемопередатчика UART, а в микроконтроллерах PIC – приемопередатчика USART или по шине CAN. Для синхронного ввода/вывода используется особый режим приемопередатчика USART, а также интерфейсы SPI и I2С (в микроконтроллерах PIC – с помощью порта MSSP).

Адресация ведомых устройств

 

Выбор ведомого устройства, с которым хотело бы обмениваться данными ведущее устройство, осуществляется посредством первого байта, который всегда определяется как адрес ведомого устройства – первый байт последовательности данных. Он однозначно сопоставлен определенному устройству, подключенному к шине, и имеет длину 7 бит (разряды от 1 до 7). Теоретически, таким образом можно адресовать до 128 ведомых устройств, однако по определению некоторые адреса ведомых устройств имеют особое значение. Адрес ведомого устройства состоит из двух частей: постоянной и переменной (рис. 7.14).

 

Рис. 7.14. Формат адреса шины I2C

 

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

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

в большинстве случаев определяется пользователем с помощью внешних схем (через дополнительные выводы).

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

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

Работа с интерфейсом I2С в микроконтроллерах PIC

 

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

В микроконтроллерах PIC обмену данными по интерфейсу 12С соответствует особый режим работы порта MSSP. Линии SCL соответствует вывод 3 порта С, а линии SDA – вывод 4 того же порта.

Для управления передачей в режиме I2С используются три регистра: уже рассмотренные выше SSPSTAT (рис. 7.8) и SSPCON1 (рис. 7.9), а также SSPCON2 (рис. 7.10).

Назначение разрядов регистра SSPSTAT, имеющих отношение к 12С:

-BF – флаг заполнения буфера данных;

-UA – устанавливается в лог. 1 в том случае, если необходимо модифицировать адрес устройства (содержимое регистра SSPADD);

-R/W – указывает на тип операции: 0 – запись, 1 – чтение;

-S – устанавливается в лог. 1 при обнаружении условия начала передачи;

-Р – устанавливается в лог. 1 при обнаружении условия завершения передачи;

-D/A – признак переданного байта: 0 – байт адреса, 1 – байт данных. Назначение разрядов регистра SSPCON1, имеющих отношение к I2С:

-SSPM0-SSPM3 – выбор режима работы порта MSSP (значения для интерфейса I С представлены в табл. 7.6);

-СКР – установка этого разряда в лог. 1 разрешает тактирование;

-SSPEN – флаг разрешения работы интерфейса;

-SSPOV – флаг переполнения приемного буфера;

-WCOL – флаг коллизий при записи (1 – запись новых данных в буферный регистр была произведена в момент передачи).

 

Таблица 7.6. Выбор режима работы порта MSSP для интерфейса l2C

SSPM3 SSPM2 SSPM1 SSPMO Режим
0 1 1 0 Режим Slave, используется 7-разрядный адрес
0 1 1 1 Режим Slave, используется 10-разрядный адрес
1 0 0 0 Режим Master, частота = F0sc / (4 (SSPADD + 1))
1 0 1 1 Режим Master с программным управлением
1 1 1 0 Режим Slave, используется 7-разрядный адрес
1 1 1 1 Режим Slave, используется 10-разрядный адрес

 

7 6 5 4 3 2 1 0
GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

Рис. 7.15. Регистр SSPCON2 микроконтроллеров PIC

 

Назначение разрядов регистра SSPCON2:

-SEN – устанавливается в лог. 1 для создания условия начала передачи;

-RSEN – устанавливается в лог. 1 для создания повторных условий начала передачи;

-PEN – сбрасывается в лог. О для создания условия окончания передачи;

-RCEN – устанавливается в лог. 1 для разрешения режима приема;

-ACKEN – инициирует последовательность битов квитирования;

-ACKDT – устанавливается в лог. 1 для отправки подтверждения при приеме байта;

-ACKSTAT – устанавливается в лог. 1 при получении подтверждения приема от ведомого устройства.

Модуль шины CAN

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

Протокол определяет метод адресации, проверку ошибок и общий формат данных для всех устройств, использующих шину. Один из таких протоколов – протокол CAN (Controller Area Network), поддерживаемый рядом микроконтроллеров семейства PIC18 и некоторыми последними разработками компании Atmel.

3. Аналого-цифровое преобразование

 

Число в цифровой форме определяется на основании отношения входного напряжения к полному номиналу напряжения аналого-цифрового преобразователя (АЦП). Например, если на вход АЦП с номинальным напряжением 5 В подать напряжение 1 В„ то на цифровом выходе появится число, соответствующее 1/5=0,2 разрешающей способности преобразователя. Так, если используется АЦП с разрешением 8 бит, то максимальное возможное значение на его выходе 2 - 1 = 255. Таким образом, напряжению 1 В на аналоговом входе соответствует 0,2 - 255 = 51 на цифровом выходе.

Встроенные АЦП микроконтроллеров AVR и PIC имеют разрешение 10 бит и позволяют считывать напряжение на одном из восьми (в некоторых моделях – пяти) аналоговых входов (обычно – порт А).

В микроконтроллерах AVR для управления режимом АЦП используются два регистра: регистр управления ADCSR (рис. 8.1) и регистр мультиплексирования ADMUX (определяет, какие из восьми входов порта А являются аналоговыми).

 

7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0

Рис. 8.1. Регистр ADCSR микроконтроллеров AVR

 

Назначение разрядов регистра ADCSR:

-ADPS0 – ADPS2 – выбор коэффициента деления тактовой частоты (табл. 8.1); чем выше частота работы АЦП (производная от частоты системной синхронизации), тем ниже эффективное разрешение, поэтому следует устанавливать коэффициент деления;

-ADIE – разряд маскирования прерывания от АЦП (1 – по окончанию преобразования разрешено прерывание);

-ADIF – флаг прерывания от АЦП (устанавливается аппаратно по окончанию цикла преобразования);

-ADFR – лог. 1 в этом разряде переводит АЦП в несинхронизированный режим работы – обычно АЦП работает в режиме прерывания, чтобы процессор каждый раз не ожидал завершения медленно протекающего преобразования, однако в несинхронизированном режиме АЦП выполняет преобразование постоянно, как можно быстрее (на период такого преобразования должны быть запрещены все прерывания);

-ADSC – флаг начала преобразования;

-ADEN – флаг разрешения использования АЦП.

 

Таблица 8.1. Выбор коэффициента деления частоты системной синхронизации для тактирования АЦП микроконтроллеров AVR

ADPS2 ADPS1 ADPS0 Коэффициент деления
0 0 0 1
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

 

Таким образом, в общем случае процесс аналого-цифрового преобразования в микроконтроллерах AVR протекает следующим образом:

-установить в лог. 1 разряды регистра ADMUX, соответствующие аналоговым входам;

-установить разряды 0-2 регистра ADCSR для выбора коэффициента деления частоты системной синхронизации;

-установить в лог. 1 разряд ADIE для разрешения режима прерывания;

-установить в лог. 1 разряд ADEN, чтобы разрешить использование АЦП;

-установить в лог. 1 разряд ADSC, чтобы начать преобразование;

-результат преобразования сохраняется в регистровой паре ADCL, ADCH;

В микроконтроллерах PIC для управления работой встроенного АЦП также используются два регистра: ADCON0 (рис. 8.2) и ADCON1 (рис. 8.3).

 

7 6 5 4 3 2 1 0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE ADIF ADON

Рис. 8.2. Регистр ADCON0 микроконтроллеров PIC

 

Назначение разрядов регистра ADCON0:

-ADON – флаг разрешения использования АЦП;

-ADIF – разряд запроса на прерывание по окончанию преобразования;

-GO/DONE – установка этого разряда в лог. 1 активизирует АЦП; по окончанию преобразования автоматически сбрасывается в лог. 0;

-CHS0-CHS2 – выбор аналогового входа порта А (назначение этих разрядов зависит от типа микроконтроллера);

-ADCS0-ADCS1 – выбор рабочей частоты АЦП (табл. 1.24).

 

Таблица 8.2. Выбор рабочей частоты АЦП микроконтроллеров PIC

ADCS1 ADCS0 Частота
0 0 Частота системной синхронизации / 2
0 1 Частота системной синхронизации / 8
1 0 Частота системной синхронизации / 32
1 1 Тактирование от встроенного RC-осциллятора АЦП (250 кГц)

 

Максимальная допустимая рабочая частота АЦП микроконтроллеров PIC – 625 кГц. Это следует учитывать при выборе коэффициента деления частоты системной синхронизации.

Использование внутреннего RC-осциллятора АЦП не рекомендуется для микроконтроллеров с частотой системной синхронизации выше 1 МГц.

 

7 6 5 4 3 2 1 0
ADFM PCFG3 PCFG2 PCFG1 PCFG0

Рис. 8.3. Регистр ADC0N1 микроконтроллеров PIC

 

Назначение разрядов регистра ADCON1;

-PCFG0-PCFG3 – разряды конфигурации – определяют, какие выводы порта АЦП являются аналоговыми входами, а какие используются для подачи опорных напряжений Vref+ и Vref–; наиболее распространенная конфигурация: 0000, которая определяет все 8 выводов аналоговыми входами, а в качестве опорных напряжений – напряжения VDD и Vss; другие значения разрядов PCFG0-PCFG3 варьируются в зависимости от типа микроконтроллера;

-ADFM – выбор разрешения преобразования: 1 – 10 бит; 0 – 8 бит.

Результат преобразования сохраняется в регистровой паре ADRESL, ADRESH, причем в регистре ADRESH используются только младшие два разряда в случае преобразования с разрешением 10 бит.

Таким образом, в общем случае процесс аналого-цифрового преобразования в микроконтроллерах PIC протекает следующим образом:

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

-установить разряды 6-7 регистра ADCON0 для выбора рабочей частоты АЦП;

-установить разряды 3-5 регистра ADCON0 для выбора аналогового канала;

-установить в лог. 1 разряды ADON и GO регистра ADCON0, чтобы начать преобразование;

-дождаться окончания преобразования (лог. 0 в разряде DONE регистра ADCON0) и считать результат из регистровой пары ADRESLL, ADRESH.

Общие сведения

 

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

-режим последовательного программирования (по интерфейсу SPI);

-режим параллельного программирования при высоком напряжении;

-режим программирования через интерфейс JTAG.

Под “высоким” напряжением здесь понимается управляющее напряжение (12 В), подаваемое на вывод RESET микроконтроллера для перевода последнего в режим программирования.

Режимы программирования для конкретного микроконтроллера представлены в табл. 9.1.

 

Таблица 14.1. Режимы программирования микроконтроллеров семейства Mega

Режим программирования ATmega 8515x/8535x ATmega 8x ATmega 16x/32x ATmega 64x/128x ATmega 48x/88x/168x ATmega 162x ATmega 164x/324x ATmega 644x ATmega 165x ATmega 325x/3250x, ATmega 645x/6450x ATmega 640x, ATmega 1280x/1281x, ATmega 2560x2561x
1.Последовательное, по интерфейсу SPI + + + + + + + + + +
2. Параллельное, при высоком напряжении + + + + + + + + + +
3. По интерфейсу JTAG     + +   + + + + +

 

Кроме того, микроконтроллеры семейства Mega имеют возможность самопрограммирования. Под этим термином понимается изменение содержимого памяти программ, управляемое самим микроконтроллером.

В процессе программирования могут выполняться следующие операции:

-стирание кристалла (chip erase);

-чтение/запись FLASH-памяти программ;

-чтение/запись EEPROM-памяти данных;

-чтение/запись конфигурационных ячеек;

-чтение/запись ячеек защиты;

-чтение ячеек идентификатора;

-чтение калибровочного байта.

Все модели микроконтроллеров поставляются со стертой памятью программ и памятью данных (во всех ячейках находится число $FF) и пригодны к немедленному программированию.

Защита кода и данных

 

Содержимое FLASH-памяти программ, а также содержимое EEPROM-памяти данных может быть защищено от записи и/или чтения посредством программирования ячеек защиты (Lock Bits) LB1 и LB2. Возможные режимы защиты, соответствующие различным состояниям этих ячеек, приведены в табл. 8.2.

 

Таблица 8.2. Режимы защиты

№ режима

Ячейки защиты

Описание
  LB1 LB2  
1 1 1 Защита кода и данных отключена
2 0 1 Запись FLASH и EEPROM запрещена
3 0 0 Запрещены запись и чтение FLASH и EEPROM

 

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

Во всех микроконтроллерах семейства, кроме ATmega48x, имеется четыре дополнительные ячейки защиты — BLB02, BLB01, BLB12 и BLB11. Ячейки BLB02:BLB01 определяют уровень доступа из секции загрузчика к коду, расположенному в секции прикладной программы, а ячейки BLB12:BLB11, наоборот, определяют уровень доступа из секции прикладной программы к коду, расположенному в секции загрузчика. Отсутствие указанных ячеек в модели ATmega48x обусловлено отсутствием у последней выделенной секции загрузчика. Возможные режимы защиты, соответствующие различным состояниям этих ячеек, приведены в табл. 9.3 и табл. 9.4 соответственно.

 

Таблица 9.3. Режимы защиты секции прикладной программы

№ режима

Ячейки защиты

Описание
  BLB02 BLB01  
1 1 1 Нет никаких ограничений по доступу к коду, расположенному в секции прикладной программы
2 1 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции прикладной программы
3 0 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции прикладной программы, и команда LPM (ELPM), вызываемая из секции загрузчика, не может осуществлять чтение из секции прикладной программы. Если таблица векторов прерываний расположена в секции загрузчика, то при выполнении кода из секции прикладной программы прерывания запрещены
4 0 1 Команда lpm (elpm), вызываемая из секции загрузчика, не может осуществлять чтение из секции прикладной программы. Если таблица векторов прерываний расположена в секции загрузчика, то при выполнении кода из секции прикладной программы прерывания запрещены

 

Таблица 9.4. Режимы защиты секции загрузчика

№ режима

Ячейки защиты

Описание
  BLB12 BLB11  
1 1 1 Нет никаких ограничений по доступу к коду, расположенному в секции загрузчика
2 1 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции загрузчика
3 0 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции загрузчика, и команда LPM (ELPM), вызываемая из секции прикладной программы, не может осуществлять чтение из секции загрузчика. Если таблица векторов прерываний расположена в секции прикладной программы, то при выполнении кода из секции загрузчика прерывания запрещены
4 0 1 Команда lpm (elpm), вызываемая из секции прикладной программы, не может осуществлять чтение из секции загрузчика. Если таблица векторов прерываний расположена в секции прикладной программы, то при выполнении кода из секции загрузчика прерывания запрещены

 

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

 

Рис. 9.1. Байт ячеек защиты

 

В исходном (запрограммированном) состоянии во всех ячейках защиты содержится 1, после программирования – 0. Стирание ячеек (запись в них лог. 1) может быть произведено только при выполнении команды “Стирание кристалла”, уничтожающей также содержимое FLASH- и EEPROM-памяти.

Конфигурационные ячейки

 

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

Краткое назначение всех конфигурационных ячеек приведено в табл. 9.6. Подробное описание их назначений было приведено в соответствующих главах книги.

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

 

Таблица 9.5. Конфигурационные ячейки микроконтроллеров семейства

Бит

ATmega8515x

ATmega8535x

ATmega8x

ATmegal6x/

32x

ATtaega64x/ 128x

ATmega48x

Название * Название * Название * Название * Название * Название *

Идентификатор

 

Все микроконтроллеры фирмы Atmel имеют три 8-битные ячейки, содержимое которых позволяет идентифицировать устройство. В первой ячейке содержится код производителя $00, во второй — код объема FLASH-памяти $01, а в третьей — код устройства $02. Как и конфигурационные ячейки, ячейки идентификатора расположены в отдельном адресном пространстве, доступ к которому возможен только в режиме программирования. Однако в отличие от конфигурационных ячеек ячейки идентификатора, по понятным причинам, доступны только для чтения.

Значение кода устройства у разных моделей может совпадать. Поэтому устройство следует идентифицировать только по совокупности значений ячеек $01 и $02, так как именно эта пара чисел является уникальной для каждого микроконтроллера.

Калибровочные ячейки

 

В калибровочные ячейки при изготовлении микроконтроллера заносятся калибровочные константы, предназначенные для подстройки на номинальную частоту внутреннего RС-генератора. Количество этих ячеек зависит от того, на скольких частотах может работать внутренний RC-генератор. В моделях ATmega8515x/8535x и ATmega8x/16x/32x/64x/128x имеется четыре 8-битных ячейки, а в остальных моделях — одна ячейка. Располагаются они в старших байтах адресного пространства ячеек идентификатора.

Загрузка калибровочной константы в регистр OSCCAL осуществляется аппаратно при нахождении микроконтроллера в состоянии сброса. Однако в моделях ATmega8515x/8535x и ATmega8x/16x/32x/64x/128x генератор автоматически калибруется только на частоту 1 МГц. Поэтому при использовании другой частоты RС-генератора его калибровку необходимо осуществлять вручную. Для этого программатор во время программирования должен прочитать содержимое калибровочной ячейки и занести его по какому-либо адресу FLASH-памяти программ. А программа должна после старта считать это значение из памяти программ и занести его в регистр OSCCAL.

Стирание кристалла

 

Команда “Стирание кристалла” должна выполняться перед каждым перепрограммированием микроконтроллера. Данная команда полностью уничтожает содержимое FLASH- памяти и EEPROM-памяти, а затем сбрасывает ячейки защиты (записывает в них 1). Однако на состояние конфигурационных ячеек данная команда не влияет. Кроме того, в ряде моделей микроконтроллеров семейства Mega можно предотвратить стирание EEPROM-памяти путем программирования конфигурационной ячейки EESAVE.

Для выполнения команды “Стирание кристалла” необходимо выполнить следующие действия:

-загрузить команду “Стирание кристалла”;

-подать на вывод WR сигнал НИЗКОГО уровня;

-ждать появления на выводе RDY/BSY сигнала ВЫСОКОГО уровня.

Микроконтроллеры AVR

Введение

 

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

Со времени появления первых микропроцессоров в 1970-х годах их сложность постоянно возрастала за счет появления новых аппаратных решений и добавления новых команд, предназначенных для решения новых задач. Так постепенно сложилась архитектура, получившая впоследствии название CISC (Complete Instruction Set Computers – компьютеры со сложным набором команд). В дальнейшем обозначилось и нашло активное развитие еще одно направление: архитектура RISC (Reduced Instruction Set Computers – компьютеры с сокращенным набором команд). Именно к этой архитектуре относятся микроконтроллеры AVR от компании Atmel и PIC от компании Microchip, которым посвящена эта книга.

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

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

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

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

 


1. Архитектура микроконтроллеров AVR и PIC

 

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

 

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

 

Будем рассматривать микроконтроллеры в общем, не привязываясь к какому-либо конкретному типу микроконтроллеров AVR, поэтому ниже будут рассмотрены только общие для большинства микроконтроллеров особенности архитектуры памяти, вопросы ввода/вывода, обработки прерываний, сброса и др.


Память микроконтроллеров AVR

 

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

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

 

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

Здесь и далее шестнадцатеричные числа будут представлены в форме, принятой в языке С: с префиксом 0х.

 

Рис. 2.1. Структура памяти данных в микроконтроллерах AVR и PIC

 

Область статической памяти SRAM (Static Random Access Memory) обозначена на рис. 2.1 пунктиром, поскольку используется не всеми микроконтроллерами AVR (это относится как к внутренней, так и к внешней SRAM). Ее начальный адрес – 0x060, а верхний адрес – разный в различных устройствах.

В некоторых микроконтроллерах AVR можно увеличивать пространство памяти SRAM посредством подключения внешних блоков памяти вплоть до 64 Кбайт, однако для этого приходится пожертвовать портами А и С, которые в этом случае применяются для передачи данных и адресов.

Регистры общего назначения

 

Область регистров общего назначения (рабочих регистров) предназначена для временного хранения переменных и указателей, используемых процессором для выполнения программ. В микроконтроллерах AVR она состоит из 32 восьмиразрядных регистров (диапазон адресов 0x000 – 0x01F). В микроконтроллерах PIC регистры общего назначения также восьмиразрядные, однако их количество и диапазон адресов зависят от конкретного типа устройства.

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

Дата: 2019-05-28, просмотров: 237.