Счетчик команд и стековая память 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Счетчик команд и стековая память



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

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

Этот регистр не доступен для программиста в том смысле, что не существует команд прямой записи или чтения его содержимого. Размер счетчика команд составляет для разных микроконтроллеров AVR от 9 до 12 разрядов.

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

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

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

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

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

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

В микроконтроллерах серии AVR применяется широко распространенный способ организации стековой памяти, когда в качестве стека используется часть ОЗУ Для реализации принципа «последний зашел – первый вышел» и служит регистр-указатель стека. В зависимости от размеров ОЗУ, разрядность указателя стека бывает разная. В микроконтроллерах с небольшим объемом ОЗУ используется восьмиразрядный указатель стека. Он представляет собой один регистр ввода-вывода и доступен для свободного считывания и записи. Называется такой регистр spl. Для ОЗУ больших размеров к регистру spl добавляется еще один регистр SPH. Вместе они составляют один шестнадцатиразрядный указатель стека.

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

Для работы со стеком в системе команд микроконтроллера есть две специальные команды:

- команда записи в стек (push);

- команда извлечения из стека (pop).

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

Выполняя команду pop, микроконтроллер сначала увеличивает содержимое указателя стека на единицу, а затем извлекает содержимое ячейки ОЗУ, на которое указывает указатель. Считанное значение помещается в один из РОН. В результате из стека считывается последнее записанное туда число. Следующая команда pop опять сначала увеличит указатель стека и прочитает предпоследнее записанное туда число. Благодаря регистру-указателю стека и описанному выше алгоритму реализуется полноценная стековая память.

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

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

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

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

Подсистема ввода-вывода

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

Для управления каждым портом ввода-вывода используется три специальных РВВ. Это регистры PORTx, DDRx и PINx. Под «х» здесь подразумевается конкретная буква – имя порта. Например, для порта А имена регистров управления будут такими: PORTA, DDRA и PINA.

Рассмотрим теперь назначение каждого из этих регистров:

PORTx – регистр данных (используется для вывода информации);

DDRx – регистр направления передачи информации;

PINx – регистр ввода информации.

Отдельные разряды приведенных выше регистров также имеют свои имена. Разряды регистра PORTx обычно именуются как Рхп. Где «п» – это номер разряда. К примеру, разряды регистра PORTA будут именоваться следующим образом: РАО, PAI, РА2 –РА7.

Разряды порта DDRx именуются как DDxn (для порта А – DDA0, DDA1 –DDA7).

Разряды порта PINx именуются как PINxn (для порта А – PINA0, PINA1 –PINA7).

Для других портов буква А заменяется соответственно на В, С, D, Е, F, G.

Любой порт ввода-вывода микроконтроллера серии AVR устроен таким образом, что каждый его разряд может работать как на ввод, так и на вывод. То есть он может быть входом, а может быть выходом. Для переключения режимов работы служит регистр DDRx. Каждый разряд регистра DDRx управляет своим разрядом порта. Если в каком-либо разряде регистра DDRx записан ноль, то соответствующий разряд порта работает как вход.

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

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

Только после этого на данный вывод микроконтроллера можно подавать цифровой сигнал от внешнего устройства. Далее микроконтроллер просто читает байт из регистра PINx. Содержимое соответствующего бита прочитанного байта соответствует сигналу на внешнем выводе порта.

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

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

Таблица 2.2

Конфигурирование порта ввода-вывода

DDxn Pxn Режим Резистор Примечание
0 0 Вход Отключен Вывод отключен от схемы
0 1 Вход Подключен Вывод является источником тока
1 0 Выход Отключен На выходе «0»
1 1 Выход Отключен На выходе «1»

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

Система прерываний

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

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

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

Самая развитая на сегодняшний день система прерываний – у микроконтроллера Atmega 128. Этот микроконтроллер способен в общей сложности обслуживать 48 внутренних и 17 внешних источников прерываний. Источниками прерываний могут служить встроенные таймеры, компараторы, АЦП, любой последовательный канал и система управления EEPROM.

Управление системой прерываний

Управление системой прерываний осуществляется при помощи специальных регистров ввода-вывода. Определяющим регистром здесь является регистр SREG (регистр состояния системы). Этот регистр предназначен для хранения флагов состояния. Каждый бит регистра – это один из флагов. Седьмой бит регистра состояния называется «флаг I». Это флаг глобального разрешения прерываний. Когда значение этого флага равно нулю, все прерывания в микроконтроллере запрещены.

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

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

В микроконтроллерах AVR применяются два регистра маски. Регистр GIMSK управляет всеми видами прерываний, кроме прерываний от таймеров. В некоторых микроконтроллерах семейства «Mega» этот регистр называется GICR. Для управления прерываниями от таймеров имеется специальный регистр TIMSK.

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

В определенных режимах после установки флага процедура обработки прерывания вызывается автоматически. Сразу после вызова процедуры соответствующий флаг сбрасывается. Микроконтроллеры AVR имеют два регистра флагов: регистр GIFR (обслуживает те же прерывания, что и регистр GIMSK) и регистр TIFR (флаги прерываний от таймеров).

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

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

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

При поступлении запроса на прерывание устанавливается флаг соответствующего прерывания. Флаг устанавливается даже в том случае, если прерывание запрещено. Если прерывание разрешено, то микроконтроллер приступает к его выполнению. Текущая программа временно приостанавливается, и управление передается на адрес соответствующего вектора прерывания.

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

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

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

В качестве примера, таблица векторов прерываний для микроконтроллеров семейства «Ttiny» (см. табл. 3.3).

Таблица 2.3

Адреса векторов прерываний микроконтроллеров семейства «Tiny»

Источник Описание Tinyl1 х Tiny12x Tiny15L Tiny28x
INTO Внешнее прерывание 0 $001 $001 $001 $001
INT1 Внешнее прерывание 1 - - - $002
PIN.CANGE По изменению сигнала на любом из выводов $002 $002 $002 -
LOW_LEVEL По низкому уровню на входе порта В - - - $003
TIMER1 COMPA По совпадению показаний таймера/счетчика Т1 с содержимым контрольного регистра - - $003 -
TIMER1 OVF Переполнение таймера/счетчика Т1 - - $004 -
TIMERO OVF Переполнение таймера/счетчика ТО $003 $003 $005 $004
EE_RDY По готовности EEPROM  – $004 $006 -
ANA_COMP По сигналу от аналогового компаратора $004 $005 $007 $005
ADC По завершению преобразования в АЦП - - $008 -

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

Любой микроконтроллер серии AVR содержит несколько встроенных таймеров. Причем по своему назначению их можно разделить на две категории.

К первой категории относятся таймеры общего назначения.

Вторую категорию составляет сторожевой таймер.

Сторожевой таймер предназначен для автоматического перезапуска микроконтроллера в случае «зависания» его программы.

Для каждой микросхемы нужен всего один сторожевой таймер. В любом микроконтроллере AVR такой таймер имеется.

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

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

Например: Timer/Counter0, Timer/Counter1 и т.д.

В русскоязычной литературе их чаще именуют сокращенно Т1, Т1, Т2, Т3. Таймеры Т0 и Т2 в большинстве микроконтроллеров – восьмиразрядные. Таймеры Т1 и ТЗ – шестнадцатиразрядные. Таймер Т0 имеется в любой микросхеме AVR. Остальные добавляются по мере усложнения модели.

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

Счетный регистр восьмиразрядного таймера именуется TCNTx, где «х» – это номер таймера. Для таймера Т0 регистр называется TCNT0. Для таймера Т2 – TCNT2. Шестнадцатиразрядные регистры именуются похожим образом. Отличие в том, что каждый шестнадцатиразрядный счетный регистр для микроконтроллера представляет собой два регистра ввода-вывода.

Один предназначен для хранения старших битов числа, а второй – для хранения младших битов. К имени регистра старших разрядов добавляется буква Н, а для регистра младших разрядов добавляется буква L. Таким образом, счетный регистр таймера Т1 – это два регистра ввода-вывода: TCNT1H и TCNT1L. Счетный регистр таймера ТЗ – это два регистра TCNT3H и TCNT3L.

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

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

Режимы работы таймеров

Таймеры микроконтроллеров семейства AVR могут работать в нескольких режимах. Разные микроконтроллеры имеют разные наборы режимов для своих таймеров. Для выбора режимов работы существуют специальные регистры – регистры управления таймерами. Для простых таймеров используется один регистр управления. Для более сложных – два регистра. Регистры управления таймером называются TCCRx (где «х» – номер таймера). Например, для таймера ТО используется один регистр с именем TCCR0. Для управления таймером Т1 используется два регистра: TCCR1А и TCCR1B. При помощи регистров управления производится не только выбор соответствующего режима, но и более тонкая настройка таймера. Ниже перечислены все основные режимы работы таймера и их описание.

Режим Normal

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

Режим «Захват» (Capture)

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

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

Микроконтроллер должен одновременно запустить два этих процесса: подать напряжение на конденсатор; запустить таймер в режиме Capture.

Конденсатор начнет заряжаться, напряжение на нем при этом будет плавно расти. Одновременно счетчик таймера будет отсчитывать тактовые импульсы заданной частоты. В тот момент, когда напряжение на конденсаторе сравняется с опорным напряжением, логический уровень на выходе компаратора изменится на противоположный. По этому сигналу текущее значение счетного регистра запоминается в специальном регистре захвата. Имя этого регистра ICRx (для таймера ТО это будет ICR0, для Т1 – ICR1 и т. д.). Одновременно вырабатывается запрос на прерывание.

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

Режим «Сброс при совпадении» (СТС)

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

Регистры сравнения также имеют свои имена. Например, регистр совпадения таймера Т1 состоит из двух регистров: OCR1L и OCR1H. В ряде микроконтроллеров существуют два регистра совпадения. Так, во всех микроконтроллерах семейства «Tiny» существует два регистра совпадения для таймера Т1. Это регистры OCR1A и OCR1B. Два регистра совпадения для таймера Т1 имеет и микроконтроллер ATmega8x. Во втором случае как таймер, так и его регистры совпадения имеют шестнадцать разрядов.

Если регистр совпадения шестнадцатиразрядный, то физически он состоят из двух регистров ввода-вывода. Например, два регистра совпадения таймера Т1 микросхемы ATmega8x представляют собой четыре регистра ввода-вывода с именами OCR1AL, OCR1AH, OCR1BL, OCR1BH.

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

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

сброс таймера (верно только для регистров совпадения OCR1 и OCR1A);

изменение состояния одного из выводов микроконтроллера (верно для всех регистров).

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

Режим «Быстродействующий ШИМ» (Fast PWM)

ШИМ – расшифровывается как Широтно-Импульсная Модуляция. На английском это звучит как «Pulse Width Modulation» (PWM). Сигнал с ШИМ часто используется в устройствах управления.

Сигнал с ШИМ можно, например, использовать для регулировки скорости вращения электродвигателя постоянного тока. Для этого вместо постоянного напряжения на двигатель подается прямоугольное импульсное напряжение. Благодаря инерции двигателя импульсы сглаживаются, и двигатель вращается равномерно. Меняя скважность импульсов (то есть отношение периода импульсов к их длительности), можно изменять среднее напряжение, приложенное к двигателю и, тем самым, менять скорость его вращения.

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

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

Для формирования сигнала ШИМ используются те же самые регистры совпадения, которые работают и в режиме СТС. Формирование сигнала ШИМ может осуществляться несколькими разными способами. Работа таймера в режиме Fast PWM проиллюстрирована на рис. 2.5.

Рис. 2.5. Работа таймера в режиме Fast PWM

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

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

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

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

Режим «ШИМ с точной фазой» (Phase Correct PWM)

Описанный в предыдущем разделе режим ШИМ имеет один недостаток. При изменении длительности импульсов меняется и их фаза. Центр каждого импульса как бы сдвигается во времени. При управлении электродвигателем такое поведение фазы нежелательно. Поэтому в микроконтроллерах AVR предусмотрен еще один режим ШИМ. Это ШИМ с точной фазой. Принцип работы таймера в этом режиме изображен на рис. 2.6.

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

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

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

Недостатком режима «Phase Correct PWM» можно считать в два раза меньшую частоту выходного сигнала. Это существенно уменьшает динамичность регулирования. Кроме того, при использовании внешних фильтров для преобразования импульсного сигнала ШИМ в аналоговый, схема с более низкой частотой потребует применения комплектующих с большими габаритами и массой.

Рис.3.6. Работа таймера в режиме Phase Correct PWM

Асинхронный режим

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

Предделители таймеров/счетчиков

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

Рис. 2.7. Предделитель для таймера

Как видно из схемы, частота внутреннего тактового генератора CLK поступает на специальный десятиразрядный делитель. С выходов делителя снимаются сигналы CLK/8, CLK/32, CLK/64, CLK/128, CLK/256 и CLK/1024. Все эти сигналы поступают на входы данных мультиплексора. На адресные входы мультиплексора поступают сигналы от трех разрядов регистра управления таймером (TCCRn).

Таким образом, записывая в разряды CSnO, CSnl, CSn2 различные значения, можно выбирать один из восьми режимов работы предделителей

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

Схема, приведенная на рис. 2.7, не является стандартом для всех микроконтроллеров серии AVR. Она отражает лишь общий принцип построения предделителей.

Рис. 2.8. Предделитель со входом для внешнего сигнала

На рис. 2.8 приведена еще одна схема предделителя. Эта схема, в отличие от предыдущей, предусматривает подачу на входы таймеров тактового сигнала от внешнего источника. Для этого количество сигналов, снимаемых с десятиразрядного делителя, уменьшено до четырех, CLK/32 и CLK/128 исключены. Зато в схеме появились цепи, через которые на вход таймера может поступать внешние импульсы.

Эти импульсы должны подаваться на вход Tn. С этого входа импульсы поступают на формирователь, который осуществляет их предварительную обработку (приближает их форму к прямоугольной). Затем импульсы поступают на вход D7 дешифратора. На вход D6 поступают те же импульсы, но только в инвертированном виде. В результате для схемы, показанной на рис. 2.8, мы получаем следующие восемь режимов работы:

- режим 0 – отсутствие импульсов;

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

- режимы 2...5 – один из сигналов с делителя;

- режим 6 – инверсный сигнал с внешнего входа;

- режим 7 – прямой внешний сигнал.

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

Эти импульсы должны подаваться на вход Tn. С этого входа импульсы поступают на формирователь, который осуществляет их предварительную обработку (приближает их форму к прямоугольной). Затем импульсы поступают на вход D7 дешифратора. На вход D6 поступают те же импульсы, но только в инвертированном виде. В результате для схемы, показанной на рис. 2.8, мы получаем следующие восемь режимов работы:

режим 0 – отсутствие импульсов;

режим 1 – прямой сигнал от внутреннего генератора;

режимы 2...5 – один из сигналов с делителя;

режим 6 – инверсный сигнал с внешнего входа;

режим 7 – прямой внешний сигнал.

Другие встроенные периферийные устройства

Аналоговый компаратор

Мы уже упоминали о компараторе. Он предназначен для сравнения напряжений на двух специальных внешних входах. Такие входы имеют названия: AIN0 (неинвертирующий); AIN1 (инвертирующий).

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

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

Регистр называется ACSR. А разряд, куда выводится выходной сигнал компаратора, тоже имеет свое название. Он называется АСО. Другой разряд под названием ACD того же регистра отвечает за включение/выклю- чение компаратора. Еще два разряда ACIS0 и ACIS1 определяют способ влияния сигнала с выхода компаратора на последующие схемы. Есть три варианта: любое изменение на выходе; изменение с единицы на ноль; изменение с ноля на единицу.



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 1099; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.144.32 (0.09 с.)