Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Донбасский государственный технический университет
Кафедра электронных систем
Методические указания
к выполнению лабораторных работ
по дисциплине
«Микропроцессоры и микропроцессорные системы»
Составитель: ас. Ермоленко Е. А.
г.Алчевск, 2011
Лабораторная работа №1 Система виртуального моделирования электронных устройств Proteus. Ознакомление с лабораторным стендом 3
Лабораторная работа №2 Работа с портами ввода-вывода микроконтроллеров AVR. Использование AVR-Assembler 16
Лабораторная работа №3 Использование внешних прерываний в микропроцессорных системах на примере микроконтроллера AVR 36
Лабораторная работа №4 Применение таймеров в микропроцессорных системах. Изучение 8-разрядного таймера/счетчика микроконтроллера AVR ATmega8 47
ПРИЛОЖЕНИЕ А Расположение выводов микроконтроллера AVR ATMega8 58
ПРИЛОЖЕНИЕ Б Общие характеристики микросхемы HEF4511 59
ПРИЛОЖЕНИЕ В Характеристики семисегментного индикатора
BS-C535RD 61
ПРИЛОЖЕНИЕ Г Система команд микроконтроллеров AVR 62
ПРИЛОЖЕНИЕ Д Адреса векторов прерываний микроконтроллера ATmega8 70
Лабораторная работа № 1
Система виртуального моделирования
электронных устройств Proteus.
ознакомление с лабораторным стендом
Цель работы:
1 Теоретические сведения
Система виртуального моделирования Proteus представляет собой пакет программ для автоматизированного проектирования электронных схем. Пакет представляет собой систему схемотехнического моделирования, базирующуюся на основе моделей электронных компонентов PSpice. Основное назначение программы моделирование работы электронных схем, создание и отладка устройств, начиная с его графического изображения (принципиальной схемы) и заканчивая изготовлением печатной платы.
Отличительной чертой пакета Proteus является возможность моделирования работы программируемых устройств: микроконтроллеров, микропроцессоров, цифровых сигнальных процессоров и пр.
Среди преимуществ среды Proteus перед другими САПР электронных устройств можно выделить следующие:
Proteus состоит из двух самостоятельных программ: ARES (трассировка печатных плат) и ISIS (создание электронных схем), которая будет использоваться в лабораторном практикуме дисциплины.
После запуска программы Proteus ISIS появляется основное окно (рис. 1.1). Самое большое пространство в нем отведено под окно редактирования, в котором происходят все основные процессы создания, редактирования и отладки схемы устройства.
Рисунок 1.1 Главное окно программы
В левом верхнем углу расположено окно предварительного просмотра (рис. 1.2), с помощью которого можно перемещаться по окну редактирования.
Рисунок 1.2 Окно предварительного просмотра
Щелкая левой кнопкой мыши по окну предварительного просмотра, можно перемещать окно редактирования по схеме. Увеличивать и уменьшать масштаб схемы в окне можно кнопками F6, F7 соответственно или колесом мыши, F5 центрирует схему в окне, а F8 подгоняет масштаб схемы под окно редактирования.
Под окном предварительного просмотра находится список объектов (компоненты, символы и другие элементы). Выделенный в этом списке объект отображается в окне предварительного просмотра.
Все функции Proteus ISIS доступны через главное меню программы и панели инструментов, расположенные в верхней и левой части окна (горизонтально и вертикально соответственно). Рассмотрим основные из них.
Рисунок 1.3 Панель инструментов
1 Инструменты работы с файлами (создать, открыть, сохранить, печать)
2 Инструменты позиционирования (обновить изображение, включить/выключить сетку, установить начало координат, центрировать, изменить масштаб)
3 Инструменты стандартных команд (отменить, повторить, вырезать, копировать, вставить из буфера обмена)
4 Инструменты групповых операций (копирование выделенного блока, перемещение блока, поворот и удаление блока)
Рассмотрим вертикальную панель инструментов
режим выбора, позволяет выделять компоненты на схеме; режим размещения компонентов на схеме; инструмент расстановки точек соединения; инструмент расстановки меток соединения (необходим при работе с шиной); инструмент рисования шины; режим размещения на схеме терминальных соединений (таких как питание, заземление, вход/выход схемы); инструменты построения различных диаграмм (АЧХ, ФЧХ, спектр сигнала, анализ Фурье и пр.); инструмент выбора генераторов сигнала; инструменты размещения пробников сигнала щупы напряжения и тока (позволяют наблюдать напряжение и ток в любой точке схемы); инструмент размещения на схеме виртуальных приборов (осциллограф, логический анализатор, вольтметр, амперметр и др.); |
Одними из основных элементов программы также являются кнопки управления процессом симулирования, расположенные в нижней части главного окна (рис. 1.4): запуск, пошаговый режим, пауза, стоп.
Рисунок 1.4 Кнопки управления процессом симулирования
После запуска процесса симулирования ISIS Proteus имитирует работу собранной схемы и виртуальных приборов. В режиме симулирования изменения схемы невозможны.
Все электронные компоненты, доступные в программе, находятся в библиотеке компонентов. Для того чтобы открыть библиотеку, необходимо перейти в режим и нажать кнопку «P» (Pick) в списке объектов (рис. 1.5).
Рисунок 1.5 Открытие библиотеки компонентов
В открывшемся окне (рис. 1.6) можно выбирать необходимые в схеме компоненты по категориям, подкатегориям, производителю или через маску поиска. После выбора нужного компонента необходимо дважды на нем щелкнуть либо нажать кнопку «ОК». Выбранный компонент добавится в список объектов.
Рисунок 1.6 Библиотека компонентов
Для того чтобы разместить отобранные компоненты в окно редактирования, необходимо выбрать нужный компонент в списке объектов и щелкнуть на рабочей области программы.
1.3 Лабораторный стенд
Основой лабораторного стенда является беспаечная макетная плата, внешний вид которой представлен на рисунке 1.7. Плата представляет собой набор контактных отверстий для установки полупроводниковых приборов, микросхем, проводников и пр. Для удобства контактные отверстия расположены со стандартным интервалом 2.54 мм и соединены между собой определенным образом. На макетной плате реализованы отдельные линии питания и земли (обозначены красным и синим цветом соответственно). Остальные контактные отверстия сгруппированы в четыре независимых поля. В пределах одного поля контакты под каждым номером соединены вертикально. Порядок соединения контактов показан на рис. 1.7 черными линиями.
Рисунок 1.7 Внешний вид макетной платы
2 Самостоятельная подготовка
3 Порядок выполнения работы
Рисунок 1.8 Принципиальная схема последовательного счетчика
Рисунок 1.9 Кабель для подключения шлейфа программатора к микроконтроллеру
4 КОНТРОЛЬНЫЕ ВОПРОСЫ
Лабораторная работа № 2
Использование AVR-assembler. Работа с портами ввода-вывода микроконтроллеров AVR
Цель работы: изучить общую структуру микропрограммы контроллера; ознакомиться с общими принципами программирования портов ввода-вывода микроконтроллеров AVR; получить навыки работы со средствами отладки, предоставляемые средой Proteus; ознакомиться с арифметическими и логическими командами AVR-Assembler.
1 Теоретические сведения
Процесс программирования любого микроконтроллера состоит из трех основных этапов:
После того, как в память микроконтроллера записана программа, последний начнет ее пошаговое исполнение после подачи питания или сигнала сброса.
Для создания программы на языке Assembler, предпочтительнее, прежде всего, ознакомиться с принципами и правилами языка, после чего можно использовать команды и инструкции AVR-Assembler, пользуясь справочными данными.
Особенности мнемонической записи большинства команд в AVR-ассемблере такие же, как и в других ассемблерах. Вначале пишется команда (в AVR команды бывают двух-, трех-, и четырехбуквенные), затем через пробел или знак табуляции следуют операнды. Некоторые команды операндов не имеют (ret, reti), в других один операнд (inc R16). Если команда имеет два операнда, то сначала указывают приемник, затем источник. Между приемником и источником обязательно ставится запятая. Так выражение «sub R16, R17» означает, что из содержимого регистра R16 нужно вычесть содержимое R17, а результат окажется в R16.
Общее правило для использования пробелов и знаков табуляции следующее: нельзя разбивать идентификатор на части и, наоборот, нельзя объединять разные идентификаторы между собой хотя бы один пробел, знак табуляции или препинания между наименованиями инструкций, переменных, регистров т. п. должен быть.
AVR-ассемблер не различает регистр букв (одинаково правильной будет форма записи Jmp, JMP или jmp)
Каждая команда должна занимать отдельную строку, разбивать команду на части разрывом строки нельзя. Кроме команды, каждая строка может содержать метки и комментарии
Метка идентификатор произвольной длины с произвольным именем, заканчивающийся двоеточием без пробела перед ним (например, «RESET:»). Кроме простого указания на адрес перехода для команд ветвления, метки служат также указанием на адрес подпрограмм и также являются их именем.
Комментарии можно добавлять в конце строки после знака «;». Все, что расположено после точки с запятой и до конца строки игнорируется компилятором.
Числа по умолчанию считаются десятичными. Шестнадцатеричные числа можно записывать двумя способами: «0x0A» или «$0A». Двоичные числа записываются так: «0b00001010».
Кроме команд в AVR-Assembler могут встречаться директивы компилятора. Самые распространенные директивы:
Пример использования директив компилятора приведен ниже:
Любой микроконтроллер семейства AVR всегда имеет в своем составе один или несколько портов ввода-вывода. Каждый разряд такого порта подсоединен к одному из выводов (контактов) микросхемы. Порты ввода-вывода служат для обмена информацией с внешними устройствами. В микроконтроллерах AVR порты именуются латинскими буквами от A до G.
Для управления каждым портом ввода-вывода используется три специальных регистра: PORTx, DDRx и PINx, где «х» буква имя порта. Например, для порта «А» имена регистров управления будут такими: PORTA, DDRA и PINA.
Рассмотрим назначение каждого из этих регистров:
Любой порт ввода-вывода микроконтроллера AVR устроен таким образом, что каждый его разряд может работать как на ввод, так и на вывод информации (т.е. соответствующий контакт микросхемы может быть как входом, так и выходом). Для переключения этих режимов работы служит регистр DDRх. Каждый разряд регистра DDRx управляет своим разрядом порта. Если в каком либо разряде регистра DDRx записан ноль, то соответствующий разряд порта работает как вход, если единица как выход.
Например, следующий фрагмент кода конфигурирует контакты PC0-PC3 микроконтроллера ATmega8 как входы, а PC4-PC7 как выходы:
Для того чтобы вывести информацию на внешний контакт микросхемы, нужно в соответствующий разряд DDRx записать логическую единицу (сконфигурировать как выход), а затем записать нужные данные в регистр PORTx. Содержимое регистра PORTx появится на внешних выводах микросхемы в виде цифровых сигналов (нулей или единиц), и будет присутствовать там постоянно, пока не будет заменено другим значением.
Например, следующий фрагмент кода устанавливает единицы (высокий уровень напряжения) на всех выводах порта «С» микросхемы:
Для того чтобы считать информацию с внешнего вывода микроконтроллера, необходимо сначала перевести нужный разряд порта в режим ввода (записать ноль в соответствующий разряд регистра DDRx), после чего подавать цифровой сигнал от внешнего устройства. Считать байт можно с помощью регистра PINx.
Например, следующий фрагмент кода устанавливает вывод PB1 как вход и считывает байт данных с порта «B» микроконтроллера:
Операция |
Команда |
Действие |
Сложение |
add R16, R17 |
R16 = R16 + R17 |
Вычитание |
sub R16, R17 |
R16 = R16 R17 |
subi R16, <число> |
R16 = R16 - <число> |
|
Логическое И |
and R16, R17 |
R16 = R16 AND R17 |
andi R16, <число> |
R16 = R16 AND <число> |
|
Логическое ИЛИ |
or R16, R17 |
R16 = R16 OR R17 |
ori R16, <число> |
R16 = R16 OR <число> |
|
Установка бита порта ввода-вывода |
sbi <порт>, n sbi PORTC, 4 |
<порт>[n] = 1 PORTC[4] = 1 |
Сброс бита порта ввода-вывода |
cbi <порт>, n cbi PORTC, 4 |
<порт>[n] = 0 PORTC[4] = 0 |
Инкремент |
inc R16 |
R16 = R16 + 1 |
Декремент |
dec R16 |
R16 = R16 - 1 |
Полная система команд микроконтроллеров AVR приведена в приложении А.
Для того чтобы войти в режим отладки необходимо использовать пункт «Запуск/перезапуск отладки» из меню «Отладка» или запустить моделирование в пошаговом режиме. Средства отладки среды Proteus позволяют выполнять микропрограмму построчно, одновременно наблюдая за содержимым внутренних регистров, портов, состоянием программного счетчика, стека, а также за изменениями работы схемы в интерактивном режиме.
Одними из основных инструментов отладки, предоставляемых средой, являются окно исходного кода (AVR Source Code, рис. 2.1) и окно содержимого регистров (AVR CPU Registers, рис. 2.2).
На рис. 2.1 обозначены:
Рис. 2.1 Окно исходного кода (AVR Source Code)
Рис. 2.2 Окно содержимого регистров (AVR CPU Registers)
На рис. 2.2 обозначены:
2 Самостоятельная подготовка
3 Порядок выполнения работы
4 Варианты заданий
Номер варианта соответствует порядковому номеру студента по списку.
№ вар-та |
Задание |
1 |
После включения устройства, в регистры R16 и R17 микроконтроллера заносятся значения 20 и 17 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит вычитание R16 R17 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
2 |
После включения устройства, в регистры R20 и R21 микроконтроллера заносятся значения 5 и 12 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит вычитание R21 R20 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
3 |
После включения устройства, в регистры R19 и R20 микроконтроллера заносятся значения 7 и 2 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит вычитание R19 R20 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
4 |
После включения устройства, в регистры R16 и R17 микроконтроллера заносятся значения 128 и 122 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит вычитание R16 R17 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
5 |
После включения устройства, в регистры R24 и R20 микроконтроллера заносятся значения 3 и 4 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит сложение R24 + R20 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
6 |
После включения устройства, в регистры R16 и R17 микроконтроллера заносятся двоичные значения 00001101 и 00000011 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит логическое сложение R16 OR R17 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
7 |
После включения устройства, в регистр R17 микроконтроллера заносится значение 20 и отображается в двоичной форме на красных светодиодах, после чего устройство ожидает замыкания ключа. Если ключ замыкается, от значения R17 отнимается число 16 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
8 |
После включения устройства, загораются все красные светодиоды, после чего устройство ожидает замыкания ключа. Если ключ замыкается, средний светодиод гаснет, после чего загорается зеленый светодиод, сигнализируя об окончании работы. |
9 |
После включения устройства, в регистры R16 и R17 микроконтроллера заносятся двоичные значения 00001101 и 00000011 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит логическое умножение R16 AND R17 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
10 |
После включения устройства, в регистры R20 и R21 микроконтроллера заносятся значения 1 и 4 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит сложение R21 + R20 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
11 |
После включения устройства, в регистры R21 и R22 микроконтроллера заносятся двоичные значения 00001000 и 00000001 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит логическое сложение R21 OR R22 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
12 |
После включения устройства, в регистры R22 и R23 микроконтроллера заносятся значения 254 и 247 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит вычитание R22 R23 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
13 |
После включения устройства, загораются все красные светодиоды, после чего устройство ожидает замыкания ключа. Если ключ замыкается, красные светодиоды гаснут, после чего загорается зеленый светодиод, сигнализируя об окончании работы. |
14 |
После включения устройства, в регистр R17 микроконтроллера заносится значение 2 и отображается в двоичной форме на красных светодиодах, после чего устройство ожидает замыкания ключа. Если ключ замыкается, к значению R17 добавляется число 3 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
15 |
После включения устройства, в регистры R16 и R17 микроконтроллера заносятся значения 2 и 5 соответственно, после чего устройство ожидает замыкания ключа. Если ключ замыкается, происходит сложение R16 + R17 и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
16 |
После включения устройство ожидает замыкания ключа. Если ключ замыкается, загораются первый красный светодиод и зеленый светодиод. |
17 |
После включения устройства, в регистр R16 микроконтроллера заносится значение 5 и отображается в двоичной форме на красных светодиодах, после чего устройство ожидает замыкания ключа. Если ключ замыкается, к значению R16 добавляется единица и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
18 |
После включения устройства, загорается зеленый светодиод, после чего устройство ожидает замыкания ключа. Если ключ замыкается, зеленый светодиод гаснет, и загораются все красные светодиоды. |
19 |
После включения устройства, в регистр R20 микроконтроллера заносится значение 8 и отображается в двоичной форме на красных светодиодах, после чего устройство ожидает замыкания ключа. Если ключ замыкается, от значения R20 отнимается единица и результат выводится в двоичной форме на красные светодиоды. После вывода загорается зеленый светодиод, сигнализируя об окончании работы. |
5 КОНТРОЛЬНЫЕ ВОПРОСЫ
Лабораторная работа № 3
Использование внешних прерываний микроконтроллеров AVR
Цель работы: освоить принципы использования прерываний в микропроцессорных системах на примере микроконтроллера AVR; ознакомится со структурой микропрограммы, использующей прерывания; получить основные навыки проектирования микропроцессорных систем, использующих прерывания.
1 Теоретические сведения
Прерывание (interrupt) это сигнал, сообщающий микропроцессору о наступлении какого-либо события. При поступлении такого сигнала выполнение основной программы приостанавливается, и управление передается подпрограмме-обработчику прерывания, после работы которого, продолжается выполнение основной программы.
Основное занятие практически любой микропроцессорной системы это ожидание и обработка неких событий (сигналы от других устройств, действия пользователя и т.д.). В таких случаях нередко основной программой процессора является пустой бесконечный цикл, а вся функциональность устройства заложена в подпрограммах, выполняющихся только при наступлении каких-либо событий. В микроконтроллерах механизм, обеспечивающий автоматический переход к подпрограммам при наступлении события, называется подсистемой прерываний.
Возможность аппаратно прерывать выполнение основной программы важная функция современных микроконтроллеров. Использование системы аппаратных прерываний позволяет автоматизировать обработку возникающих событий, не прибегая к программным опросам. При этом упрощается код программы, уменьшается ее размер, значительно сокращается время реакции микроконтроллера на событие.
У микроконтроллеров AVR источников прерываний может быть несколько: изменение сигнала на внешнем выводе, прерывание от таймера/счетчика, встроенного компаратора, АЦП и пр. У разных моделей микроконтроллеров количество источников прерываний может быть различно. При этом, как правило, используются только те из них, которые необходимы для реализации данной конкретной задачи.
В программе используемые прерывания описываются с помощью таблицы векторов прерываний. Таблица векторов указывает микроконтроллеру, какую именно необходимо выполнить подпрограмму при возникновении определенного прерывания. Пример таблицы векторов прерываний приведен ниже:
С помощью данной таблицы векторов прерываний микроконтроллеру указано, что в случае сброса необходимо перейти на метку RESET, в случае возникновения сигнала внешнего прерывания INT0 перейти на метку ON_INT0, в случае возникновения сигнала внешнего прерывания INT1 на метку ON_INT1, после завершения очередного преобразования АЦП перейти на метку ON_ADCCOMPLETE.
Директива org устанавливает абсолютный адрес в памяти программ. Т.е. с помощью этой директивы мы можем задавать, в какой ячейке памяти программ расположить тот или иной участок кода. Например, запись «.org 0x40» означает, что все команды, идущие после директивы org, будут располагаться в памяти, начиная с ячейки с адресом 0х40.
Применение директивы org в таблице векторов прерываний обусловлено следующим. Механизм обработки прерываний в микроконтроллере устроен таким образом, что в случае возникновения прерывания, выполнение программы автоматически перемещается на участок кода, расположенный по определенному адресу. Этот адрес жестко закреплен за каждым типом прерывания. Например, при возникновении прерывания INT0 выполняется команда, расположенная по адресу $001 в памяти программ, при возникновении прерывания INT1 команда, расположенная по адресу $002, и т.д. Эти адреса в различных моделях микроконтроллеров могут отличаться, но заданы они аппаратно и изменению не подлежат.
Таким образом, чтобы при возникновении прерывания автоматически выполнялся необходимый участок кода (обработчик прерывания), нужно этот участок расположить по определенному адресу в памяти программ.
В листинге, приведенном выше, после применения директив org, команды rjmp располагаются в тех ячейках памяти, на которые микроконтроллер передаст управление при возникновении определенного прерывания.
Адреса векторов прерываний микроконтроллера ATMega8 приведены в приложении Д.
Общая структура AVR-программы, использующей прерывания, состоит из четырех основных секций (инициализация, таблица векторов прерываний, основная программа, обработчики прерываний) и выглядит следующим образом:
При написании программы, использующей прерывания, необходимо придерживаться следующих основных правил:
Работу подсистемы прерываний микроконтроллера можно конфигурировать с помощью специальных внутренних регистров, которые позволяют разрешать/запрещать определенные прерывания, настраивать условия их срабатывания (по фронту, по спаду, по уровню) и пр.
За настройку внешних прерываний INT0, INT1 отвечают два регистра микроконтроллера:
Когда седьмой бит INT1 регистра установлен (единица), внешние прерывания INT1 разрешены, если сброшен (ноль) запрещены
Если шестой бит INT0 регистра установлен (единица), внешние прерывания INT0 разрешены, если сброшен (ноль) запрещены.
Команда разрешения прерываний INT0 и INT1 будет выглядеть следующим образом:
Различные комбинации битов ISCxx (Interrupt Sense Control) определяют условие срабатывания внешнего прерывания по фронту, по спаду, по уровню. Подробные сведения приведены в таблицах 3.1 и 3.2:
Таблица 3.1
ISC11 |
ISC10 |
Условие срабатывания прерывания INT1 |
0 |
0 |
Низкий уровень сигнала на выводе INT1 |
0 |
1 |
Любое изменение логического уровня на выводе INT1 |
1 |
0 |
Спад сигнала на выводе INT1 |
1 |
1 |
Фронт сигнала на выводе INT1 |
Таблица 3.2
ISC01 |
ISC00 |
Условие срабатывания прерывания INT0 |
0 |
0 |
Низкий уровень сигнала на выводе INT0 |
0 |
1 |
Любое изменение логического уровня на выводе INT0 |
1 |
0 |
Спад сигнала на выводе INT0 |
1 |
1 |
Фронт сигнала на выводе INT0 |
По умолчанию все биты ISC сброшены (0).
Помимо регистров, на глобальную обработку прерываний влияют две команды:
2 описание проектируемого устройства
В ходе лабораторной работы необходимо спроектировать устройство, осуществляющее подсчет и отображение количества нажатий кнопки на семисегментном индикаторе. При этом устройство должно непрерывно выводить «бегущий огонь» на светодиодах. Нажатия кнопки на процесс непрерывного вывода влиять не должны.
Для реализации данной задачи необходимы семисегментный индикатор (например, с общим катодом) и драйвер-дешифратор для него, кнопка, резисторы и микроконтроллер, который будет управлять работой описанных выше периферийных устройств.
Для подключения перечисленных устройств, можно использовать три различных порта ввода-вывода микроконтроллера. Возможная схема устройства, в таком случае, будет выглядеть следующим образом (рис. 3.1).
Компоненты среды Proteus, используемые в схеме:
Для удобства написания микропрограммы индикатор и светодиоды подключены к различным портам микроконтроллера (первый к порту «B», второй к порту «C»). Так как во время работы устройство должно непрерывно выводить «бегущий огонь» на светодиодах, то основной частью программы будет сдвиг единицы и отправка каждого значения на порт «B»:
В случае нажатия кнопки, этот фрагмент программы должен прерваться, на втором семисегментном индикаторе должно отобразиться текущее количество нажатий, после чего, выполнение цикла main должно продолжиться с того места, с которого оно прервалось. Таким образом, в данном устройстве нажатие кнопки будет служить микроконтроллеру сигналом прерывания основной программы. Согласно схеме, приведенной на рис. 3.1, таким сигналом будет возникновение «0» на выводе PD2 микроконтроллера.
Таким образом, общая структура микропрограммы будет выглядеть следующим образом (см. раздел 1):
Окончательный вариант программы для проектируемого устройства может выглядеть следующим образом:
3 Самостоятельная подготовка
4 Порядок выполнения работы
5 варианты заданий
Номер варианта соответствует порядковому номеру студента по списку.
Задание четного варианта: добавить в схему устройства, описанного в разделе 2, кнопку, при нажатии на которую число, отображаемое красным семисегментным индикатором, уменьшалось бы на единицу.
Задание нечетного варианта: добавить в схему устройства, описанного в разделе 2, кнопку, при нажатии на которую происходило бы обнуление счетчика нажатий, отображаемого красным семисегментным индикатором.
6 КОНТРОЛЬНЫЕ ВОПРОСЫ
Лабораторная работа № 4
Применение таймеров в микропроцессорных системах. Таймер/счетчик микроконтроллера atmega8
Цель работы: ознакомиться с основными способами применения таймеров/счетчиков в микропроцессорных системах; изучить регистры, управляющие работой таймеров; получить навыки конфигурирования таймеров/счетчиков в составе микроконтроллера ATMega8.
1 Теоретические сведения
Любой таймер в микроконтроллере представляет собой простой двоичный счетчик, осуществляющий подсчет входных импульсов. Каждый счетчик имеет возможность предварительной загрузки значений и может работать от тактовой частоты процессора непосредственно, или поделенной на 8, 64, 256 и 1024, а также от внешнего сигнала.
Большинство микроконтроллеров серии AVR содержат несколько встроенных таймеров/счетчиков, один из которых шестнадцатиразрядный, а оставшиеся один или два восьмиразрядные. Каждый восьмиразрядный таймер/счетчик представляет собой один восьмиразрядный регистр, который для микроконтроллера является регистром ввода-вывода. Этот регистр хранит текущее значение таймера и называется счетным регистром.
Микроконтроллер может записать в любой счетный регистр любое число в любой момент времени, а также в любой момент прочитать содержимое любого счетного регистра. После включения таймера на его вход начинают поступать счетные импульсы с заданной частотой. После прихода каждого такого импульса содержимое счетного регистра увеличивается на единицу. При переполнении счетного регистра его содержимое обнуляется, и счет начинается сначала.
Зная частоту и количество подсчитанных импульсов можно рассчитывать точные интервалы времени, используя двоичный счетчик как таймер.
Основной способ измерения временных интервалов с помощью таймера/счетчика заключается в использовании прерывания, возникающего при его переполнении. Максимальное количество импульсов, которое может подсчитать восьмиразрядный таймер, составляет 256. После прихода 257-го импульса счетный регистр таймера TCNTx сбросится в 0 и возникнет прерывание, сигнализирующее о переполнении счетного регистра. Если таймер постоянно запущен, то код, написанный в обработчике этого прерывания, будет периодически повторяться с интервалом времени, равным:
,
где f частота импульсов на входе таймера (см. рис. 4.1).
Рисунок 4.1 Счет импульсов
Очевидно, что чем меньше частота f, тем больше интервал времени tп между прерываниями (рис. 4.1). Изменять длительность этого интервала можно путем изменения частоты импульсов f, либо изменяя начальное значение счетного регистра TCNTx.
Однако такой способ приемлем для соблюдения интервалов малой длительности. Наименьшая частота входных импульсов таймера f, которую можно получить, составляет
,
где fCLK - тактовая частота микроконтроллера;
1024 коэффициент деления частоты (может быть равен 1, 8, 64, 256 или 1024).
Если микроконтроллер работает с тактовой частотой 1 МГц, то, выставив наибольший коэффициент деления, мы получим частоту на входе таймера fmin ≈ 976 Гц. Согласно формуле 4.1 подсчет 256 импульсов, следующих с такой частотой, займет время tп ≈ 262 мс.
Поэтому, для измерения больших интервалов времени применяют другой способ. Он заключается в том, что в программе считают не количество импульсов, а количество переполнений таймера, т.е. сколько раз таймер посчитал 256 импульсов (рис. 4.2).
Рисунок 4.2 Счет количества переполнений
Исходя из требуемого интервала времени tп рассчитывают частоту f и необходимое количество переполнений X, а в обработчике события считают эти переполнения. При достижении рассчитанного значения (например, R16 = X) выполняют необходимые операции и начинают счет заново:
Максимальный интервал времени, который может отмерять восьмиразрядный таймер, определяется по формуле:
,
где f частота импульсов на входе таймера.
Для конфигурирования таймера/счетчика необходимо рассчитать коэффициент деления частоты и количество переполнений таймера, использование которых позволит получить необходимый интервал времени. Ниже приведен общий алгоритм расчета этих параметров на примере интервала времени 2 с.
,
где tп необходимый интервал времени.
Поскольку tп = 2, расчетная частота будет равна fнеобх = 32768 Гц.
,
где fCLK тактовая частота микроконтроллера;
К коэффициент деления частоты.
Коэффициент деления для большинства микроконтроллеров AVR может быть равен 1, 8, 64, 256 и 1024. Исходя из формулы 4.2, K = 64.
Т.к. fCLK = 1000000 Гц, tп = 2с, К = 64, то необходимое количество переполнений Х ≈ 122.
Конфигурирование таймера/счетчика в микроконтроллере ATmega8 осуществляется с помощью двух внутренних регистров, которые позволяют разрешать/запрещать прерывания таймера, а также настраивать частоту входных импульсов таймера.
Для настройки частоты служит регистр TCCR0 (Timer/Counter Control Register). Различные комбинации первых трех битов этого регистра позволяют задавать источник входного сигнала таймера (см. таблицу 4.1):
Таблица 4.1
CS02 |
CS01 |
CS00 |
Описание |
0 |
0 |
0 |
Нет источника (таймер остановлен) |
0 |
0 |
1 |
K = 1. На входе таймера импульсы частотой fCLK / 1 |
0 |
1 |
0 |
K = 8. На входе таймера импульсы частотой fCLK / 8 |
0 |
1 |
1 |
K = 64. На входе таймера импульсы частотой fCLK / 64 |
1 |
0 |
0 |
K = 256. На входе таймера импульсы частотой fCLK / 256 |
1 |
0 |
1 |
K=1024. На входе таймера импульсы частотой fCLK /1024 |
1 |
1 |
0 |
Внешний источник (вывод Т0). Срабатывание по спаду |
1 |
1 |
1 |
Внешний источник (вывод Т0). Срабатывание по фронту |
Команда установки коэффициента деления частоты K=256 будет выглядеть следующим образом:
Для разрешения/запрета прерываний от таймеров служит внутренний регистр TIMSK (Timer/Counter Interrupt Mask Register). Нулевой бит регистра отвечает за разрешение/запрет прерываний от восьмиразрядного таймера 0.
Когда нулевой бит TOIE0 регистра установлен (единица), прерывание при переполнении таймера 0 разрешено, если сброшен (ноль) запрещено.
Команда разрешения прерываний от таймера/счетчика 0 будет выглядеть следующим образом:
2 описание проектируемого устройства
В ходе лабораторной работы необходимо спроектировать устройство, осуществляющее вывод числовых значений, изменяющихся через определенный интервал времени, на семисегментный индикатор. Запуск (или остановка) процесса вывода должны осуществляться нажатием кнопки.
Для реализации данной задачи необходимы семисегментный индикатор и микросхема-дешифратор соответственно, кнопка, резисторы и микроконтроллер, который будет управлять работой перечисленных устройств. Поскольку таймеры/счетчики, необходимые для точной выдержки интервалов времени, присутствуют в составе микроконтроллеров AVR, никаких дополнительных компонентов в схеме устройства не требуется.
Принципиальную схему описанного устройства в среде Proteus можно собрать следующим образом (рис. 4.1):
Рисунок 4.1 Принципиальная схема проектируемого устройства
В принципиальной схеме задействованы следующие компоненты среды Proteus:
После создания принципиальной схемы необходимо продумать алгоритм работы микроконтроллера. Согласно заданию, микроконтроллер должен реагировать на нажатие кнопки и выводить числовые значения с определенным интервалом времени. Следовательно, в программе необходимо задействовать 2 прерывания: при возникновении низкого уровня сигнала на выводе PD2 (INT0) и при переполнении таймера/счетчика (для выдержки заданного интервала времени). Адреса векторов данных прерываний хранятся в константах INT0addr и OVF0addr (см. приложение Д). Поскольку вне этих событий микроконтроллер не должен выполнять никаких операций, то основной частью его программы будет пустой бесконечный цикл:
С учетом вышесказанного, шаблон микропрограммы можно реализовать следующим образом:
До момента выполнения микроконтроллером строки «main: rjmp main» необходимо настроить все используемые периферийные устройства: сконфигурировать выводы порта «C» как выходы (регистр DDR), разрешить внешние прерывания INT0 (регистр GICR), настроить частоту восьмиразрядного таймера/счетчика (регистр TCCR0). В зависимости от задания, включение прерываний от таймера/счетчика (регистр TIMSK) необходимо производить либо до основного цикла, либо в обработчике нажатия кнопки.
3 Самостоятельная подготовка
4 Порядок выполнения работы
5 варианты заданий
Номер варианта соответствует порядковому номеру студента по списку.
Таблица 4.1 Варианты индивидуальных заданий
№ вар-та |
Интервал времени |
Текст задания |
1, 11 |
0,5 с |
Задание 1 |
2, 12 |
1 с |
Задание 2 |
3, 13 |
1,5 с |
Задание 1 |
4, 14 |
2 с |
Задание 2 |
5, 15 |
2,5 с |
Задание 1 |
6, 16 |
3 с |
Задание 2 |
7, 17 |
3,5 с |
Задание 1 |
8, 18 |
4 с |
Задание 2 |
9, 10 |
4 с |
Задание 1 |
Задание 1: после запуска семисегментный индикатор отображает «0», отображаемое значение не изменяется. В случае нажатия кнопки устройство начинает последовательный счет числовых значений от «0» до «9», отображая каждое из них на семисегментном индикаторе. Интервал между изменениями чисел указан в таблице 4.1.
Задание 2: после запуска устройство ведет обратный отсчет числовых значений от «9» до «0», отображая каждое значение на семисегментном индикаторе. Интервал между изменением чисел указан в таблице 4.1. В случае нажатия кнопки счет прекращается.
6 КОНТРОЛЬНЫЕ ВОПРОСЫ
Приложение А
РАСПОЛОЖЕНИЕ ВЫВОДОВ МИКРОКОНТРОЛЛЕРА AVR ATMEGA8
Обозначение |
Описание |
VCC |
Вывод для подачи напряжения питания |
GND |
Земля |
Port B (PB7..PB0) |
8-битный двунаправленный порт ввода/вывода с внутренними подтягивающими резисторами |
Port C (PC5..PC0) |
7-битный двунаправленный порт ввода/вывода с внутренними подтягивающими резисторами |
|
В зависимости от конфигурационных битов, бит PC6 порта «С» может использоваться либо как обычный вывод, либо как вход, отвечающий за сброс программы микроконтроллера |
Port D (PD7..PD0) |
8-битный двунаправленный порт ввода/вывода с внутренними подтягивающими резисторами |
AVCC |
Вывод для подачи напряжения питания встроенного АЦП |
AREF |
Опорное напряжение встроенного АЦП |
Приложение Б
ОБЩИЕ ХАРАКТЕРИСТИКИ МИКРОСХЕМЫ HEF4511
Обозначение |
Описание |
VDD |
Вывод для подачи напряжения питания |
VSS |
Земля |
DA, DB, DC, DD |
Входы данных. Число, которое необходимо отобразить на семисегментном индикаторе, подается на эти входы в двоичном виде. |
Oa, Ob, Oc, Od, Oe, Of, Og |
Выходы, подключаемые к сегментам A-G семисегментного индикатора соответственно |
EL (Enable Latch) |
Запомнить входные данные в регистре. Активный уровень «0». |
BI (Blanking Input) |
Погасить все сегменты индикатора, независимо от входных данных. Активный уровень «0». |
LT (Lamp Test) |
Засветить все сегменты индикатора, независимо от входных данных. Активный уровень «0». |
Максимальный выходной ток 25 мА.
Отображение символов:
Таблица истинности:
Приложение В
ХАРАКТЕРИСТИКИ СЕМИСЕГМЕНТНОГО ИНДИКАТОРА BS-C535RD
Приложение Г
Система команд микроконтроллеров AVR
Мнемо-ническое обозначе-ние |
Операнды |
Расшифровка |
Описание |
Операция |
Кол-во тактов |
1 |
2 |
3 |
4 |
5 |
6 |
АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ КОМАНДЫ |
|||||
ADD |
Rd, Rr |
Add without Carry two Registers |
Сложить два регистра |
Rd ¬ Rd + Rr |
1 |
ADC |
Rd, Rr |
Add with Carry two Registers |
Сложить два регистра с учетом флага С |
Rd ¬ Rd + Rr + C |
1 |
ADIW |
Rdl, K |
Add Immediate to Word |
Добавить к двухбайтовому регистру число K |
Rdh:Rdl Rdh:Rdl+K |
2 |
SUB |
Rd, Rr |
Subtract without Carry two Registers |
Вычесть из одного регистра другой |
Rd ¬ Rd - Rr |
1 |
SUBI |
Rd*, K |
Subtract Constant from Register |
Вычесть из регистра число K |
Rd ¬ Rd - K |
1 |
SBC |
Rd, Rr |
Subtract with Carry two Registers |
Вычесть из одного регистра другой с учетом флага С |
Rd ¬ Rd - Rr - C |
1 |
SBCI |
Rd*, K |
Subtract with Carry Constant from Register |
Вычесть из регистра число K с учетом флага C |
Rd ¬ Rd - K - C |
1 |
SBIW |
Rdl, K |
Subtract Immediate from Word |
Вычесть из двухбайтового регистра число K |
Rdh:Rdl ¬ Rdh:Rdl - K |
2 |
AND |
Rd, Rr |
Logical AND Registers |
Операция И между двумя регистрами |
Rd ¬ Rd · Rr |
1 |
ANDI |
Rd*, K |
Logical AND Register and Constant |
Операция И между регистром и числом K |
Rd ¬ Rd · K |
1 |
OR |
Rd, Rr |
Logical OR Registers |
Операция ИЛИ между двумя регистрами |
Rd ¬ Rd v Rr |
1 |
ORI |
Rd*, K |
Logical OR Register and Constant |
Операция ИЛИ между регистром и числом K |
Rd ¬ Rd v K |
1 |
EOR |
Rd, Rr |
Exclusive OR Registers |
Исключающее ИЛИ между двумя регистрами |
Rd ¬ Rd Å Rr |
1 |
1 |
2 |
3 |
4 |
5 |
6 |
COM |
Rd |
Ones Complement |
Поразрядная инверсия регистра |
Rd ¬ $FF - Rd |
1 |
NEG |
Rd |
Twos Complement |
Изменения знака содержимого регистра |
Rd ¬ $00 - Rd |
1 |
SBR |
Rd*, K |
Set Bit(s) in Register |
Установить биты в регистре по маске K |
Rd ¬ Rd v K |
1 |
CBR |
Rd*, K |
Clear Bit(s) in Register |
Сбросить биты в регистре по маске K |
Rd ¬ Rd · ($FF - K) |
1 |
INC |
Rd |
Increment |
Инкремент |
Rd ¬ Rd + 1 |
1 |
DEC |
Rd |
Decrement |
Декремент |
Rd ¬ Rd - 1 |
1 |
TST |
Rd |
Test for Zero or Minus |
Тестирование на ноль или минус |
Rd ¬ Rd · Rd |
1 |
CLR |
Rd |
Clear Register |
Очистить регистр |
Rd ¬ Rd Å Rd |
1 |
SER |
Rd |
Set Register |
Установить регистр |
Rd ¬ $FF |
1 |
CP |
Rd, Rr |
Compare |
Сравнить два регистра |
Rd - Rr |
1 |
CPC |
Rd, Rr |
Compare with Carry |
Сравнить два регистра с учетом флага С |
Rd - Rr - C |
1 |
CPI |
Rd*, K |
Compare Register with Immediate |
Сравнить регистр с числом |
Rd - K |
1 |
КОМАНДЫ ВЕТВЛЕНИЯ |
|||||
RJMP |
k |
Relative Jump |
Перейти на метку K |
PC ¬ PC + k + 1 |
2 |
IJMP |
Indirect Jump to (Z) |
Перейти на метку |
PC ¬ Z |
2 |
|
JMP |
k |
Jump |
Перейти на метку K |
PC k |
3 |
RCALL |
k |
Relative Subroutine Call |
Вызвать подпрограмму K |
PC ¬ PC + k + 1 |
3 |
CALL |
k |
Call Subroutine |
Вызвать подпрограмму K |
PC k |
4 |
ICALL |
Indirect Call to (Z) |
Вызвать подпрограмму |
PC ¬ Z |
3 |
|
RET |
Subroutine Return |
Возврат из подпрограммы |
PC ¬ STACK |
4 |
|
RETI |
Interrupt Return |
Возврат из подпрограммы |
PC ¬ STACK |
4 |
|
CPSE |
Rd,Rr |
Compare, Skip if Equal |
Сравнить регистры, пропустить следующую команду, если они равны |
if (Rd = Rr)PC ¬ PC + 2 or 3 |
1 / 2 / 3 |
SBRC |
Rr, b |
Skip if Bit in Register Cleared |
Пропустить следующую команду, если бит b регистра сброшен |
if (Rr(b)=0)PC ¬ PC + 2 or 3 |
1 / 2 |
1 |
2 |
3 |
4 |
5 |
6 |
SBRS |
Rr, b |
Skip if Bit in Register is Set |
Пропустить следующую команду, если бит b регистра установлен |
if (Rr(b)=1)PC ¬ PC + 2 or 3 |
1 / 2 |
SBIC |
P*, b |
Skip if Bit in I/O Register Cleared |
Пропустить следующую команду, если бит b в регистре ввода-вывода сброшен |
if (P(b)=0)PC ¬ PC + 2 or 3 |
1 / 2 |
SBIS |
P*, b |
Skip if Bit in I/O Register is Set |
Пропустить следующую команду, если бит b в регистре ввода-вывода установлен |
if (P(b)=1)PC ¬ PC + 2 or 3 |
1 / 2 |
BRBS |
s, k |
Branch if Status Flag Set |
Перейти на метку k, если флаг с номером s регистра состояний SREG установлен |
if (SREG(s) = 1) then PC¬PC+k + 1 |
1 / 2 |
BRBC |
s, k |
Branch if Status Flag Cleared |
Перейти на метку k, если флаг с номером s регистра состояний SREG сброшен |
if(SREG(s) = 0) then PC¬PC+k + 1 |
1 / 2 |
BREQ |
k |
Branch if Equal |
Перейти на метку k, если равны |
if (Z = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRCS |
k |
Branch if Carry Set |
Перейти на метку k, если установлен флаг С |
if (C = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRNE |
k |
Branch if Not Equal |
Перейти на метку k, если не равны |
if (Z = 0) then PC ¬ PC + k + 1 |
1 / 2 |
BRCC |
k |
Branch if Carry Cleared |
Перейти на метку k, если флаг С сброшен |
if (C = 0) then PC ¬ PC + k + 1 |
1 / 2 |
BRSH |
k |
Branch if Same or Higher |
Перейти на метку k, если больше или равно |
if (C = 0) then PC ¬ PC + k + 1 |
1 / 2 |
BRLO |
k |
Branch if Lower |
Перейти на метку k, если меньше |
if (C = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRMI |
k |
Branch if Minus |
Перейти на метку k, если отрицательно |
if (N = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRPL |
k |
Branch if Plus |
Перейти на метку k, если положительно |
if (N = 0) then PC ¬ PC + k + 1 |
1 / 2 |
BRGE |
k |
Branch if Greater or Equal, Signed |
Перейти на метку k, если больше или равно |
if (N Å V= 0) then PC ¬ PC + k + 1 |
1 / 2 |
1 |
2 |
3 |
4 |
5 |
6 |
BRLT |
k |
Branch if Less Than Zero, Signed |
Перейти на метку k, если меньше нуля |
if (N Å V= 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRHS |
k |
Branch if Half Carry Flag Set |
Перейти на метку k, если флаг H установлен |
if (H = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRHC |
k |
Branch if Half Carry Flag Cleared |
Перейти на метку k, если флаг H сброшен |
if (H = 0) then PC ¬ PC + k + 1 |
|
BRTS |
k |
Branch if T Flag Set |
Перейти на метку k, если флаг T установлен |
if (T = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRTC |
k |
Branch if T Flag Cleared |
Перейти на метку k, если флаг T сброшен |
if (T = 0) then PC ¬ PC + k + 1 |
1 / 2 |
BRVS |
k |
Branch if Overflow Flag is Set |
Перейти на метку k, если флаг V установлен |
if (V = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRVC |
k |
Branch if Overflow Flag is Cleared |
Перейти на метку k, если флаг V сброшен |
if (V = 0) then PC ¬ PC + k + 1 |
1 / 2 |
BRIE |
k |
Branch if Interrupt Enabled |
Перейти на метку k, если флаг I установлен |
if ( I = 1) then PC ¬ PC + k + 1 |
1 / 2 |
BRID |
k |
Branch if Interrupt Disabled |
Перейти на метку k, если флаг I сброшен |
if ( I = 0) then PC ¬ PC + k + 1 |
1 / 2 |
КОМАНДЫ ПЕРЕДАЧИ ДАННЫХ |
|||||
MOV |
Rd, Rr |
Move Between Registers |
Передача между регистрами |
Rd ¬ Rr |
1 |
LDI |
Rd*, K |
Load Immediate |
Загрузить в регистр число K |
Rd ¬ K |
1 |
LD |
Rd, X |
Load Indirect |
Загрузить в регистр данные регистра Х |
Rd ¬ (X) |
2 |
LD |
Rd, X+ |
Load Indirect and Post-Inc. |
Загрузить в регистр данные регистра Х и увеличить на 1 |
Rd ¬ (X), X ¬ X + 1 |
2 |
LD |
Rd, - X |
Load Indirect and Pre-Dec. |
Уменьшить на 1 и загрузить в регистр данные регистра Х |
X ¬ X - 1, Rd ¬ (X) |
2 |
LD |
Rd, Y |
Load Indirect |
Загрузить в регистр данные регистра Y |
Rd ¬ (Y) |
2 |
LD |
Rd, Y+ |
LDLoad Indirect and Post-Inc. |
Загрузить в регистр данные регистра Y и увеличить на 1 |
Rd ¬ (Y), Y ¬ Y + 1 |
2 |
1 |
2 |
3 |
4 |
5 |
6 |
LD |
Rd, - Y |
Load Indirect and Pre-Dec. |
Уменьшить на 1 и загрузить в регистр данные регистра Y |
Y ¬ Y - 1, Rd ¬ (Y) |
2 |
LDD |
Rd,Y+q |
Load Indirect with Displacement |
Загрузить в регистр данные регистра Y со смещением q |
Rd ¬ (Y + q) |
2 |
LD |
Rd, Z |
Load Indirect |
Загрузить в регистр данные регистра Z |
Rd ¬ (Z) |
2 |
LD |
Rd, Z+ |
Load Indirect and Post-Inc. |
Загрузить в регистр данные регистра Z и увеличить на 1 |
Rd ¬ (Z), Z ¬ Z+1 |
2 |
LD |
Rd, -Z |
Load Indirect and Pre-Dec |
Уменьшить на 1 и загрузить в регистр данные регистра Z |
Z ¬ Z - 1, Rd ¬ (Z) |
2 |
LDD |
Rd, Z+q |
Load Indirect with Displacement |
Загрузить в регистр данные регистра Z со смещением q |
Rd ¬ (Z + q) |
2 |
LDS |
Rd, k |
Load Direct from SRAM |
Загрузить в регистр данные из внешней памяти |
Rd ¬ (k) |
2 |
ST |
X, Rr |
Store Indirect |
Загрузить в Х данные регистра |
(X) ¬ Rr |
2 |
ST |
X+, Rr |
Store Indirect and Post-Inc. |
Загрузить в Х данные регистра и увеличить на 1 |
ST (X) ¬ Rr, X ¬ X + 1 |
2 |
ST |
- X, Rr |
Store Indirect and Pre-Dec. |
Уменьшить на 1 Х и загрузить данные регистра |
X ¬ X - 1, (X) ¬ Rr |
2 |
ST |
Y, Rr |
Store Indirect |
Загрузить в Y данные регистра |
(Y) ¬ Rr |
2 |
ST |
Y+, Rr |
Store Indirect and Post-Inc. |
Загрузить в Y данные регистра и увеличить на 1 |
(Y) ¬ Rr, Y ¬ Y + 1 |
2 |
ST |
- Y, Rr |
Store Indirect and Pre-Dec. |
Уменьшить на 1 Y и загрузить данные регистра |
Y ¬ Y - 1, (Y) ¬ Rr |
2 |
STD |
Y+q,Rr |
Store Indirect with Displacement |
Загрузить в Y данные регистра со смещением |
(Y + q) ¬ Rr |
2 |
ST |
Z, Rr |
Store Indirect |
Загрузить в Z данные регистра |
(Z) ¬ Rr |
2 |
ST |
Z+, Rr |
Store Indirect and Post-Inc. |
Загрузить в Z данные регистра и увеличить на 1 |
(Z) ¬ Rr, Z ¬ Z + 1 |
2 |
1 |
2 |
3 |
4 |
5 |
6 |
ST |
-Z, Rr |
Store Indirect and Pre-Dec |
Уменьшить на 1 Z и загрузить данные регистра |
Z ¬ Z - 1, (Z) ¬ Rr |
2 |
STD |
Z+q,Rr |
Store Indirect with Displacement |
Загрузить в Z данные регистра со смещением |
(Z + q) ¬ Rr |
2 |
STS |
k, Rr |
Store Direct to SRAM |
Загрузить непосредственно в память данные регистра |
(k) ¬ Rr |
2 |
LPM |
Load Program Memory |
Загрузить память программ |
R0 ¬ (Z) |
3 |
|
ELPM |
Load Program Memory |
Загрузить память программ |
R0 ¬ (RAMPZ: Z) |
3 |
|
IN |
Rd, P |
In Port |
Загрузить в регистр данные порта ввода-вывода |
Rd ¬ P |
1 |
OUT |
P, Rr |
Out Port |
Загрузить в порт ввода-вывода данные регистра |
P ¬ Rr |
1 |
PUSH |
Rr |
Push Register on Stack |
Записать регистр в стек |
STACK ¬ Rr; SP¬ SP-1 |
2 |
POP |
Rd |
Pop Register from Stack |
Извлечь регистр из стека |
SP¬ SP+1, Rd ¬ STACK |
2 |
КОМАНДЫ РАБОТЫ С БИТАМИ |
|||||
SBI |
P*,b |
Set Bit in I/O Register |
Установить бит b в регистре ввода-вывода |
I/O(P,b) ¬ 1 |
2 |
CBI |
P*,b |
Clear Bit in I/O Register |
Сбросить бит b в регистра ввода-вывода |
I/O(P,b) ¬ 0 |
2 |
LSL |
Rd |
Logical Shift Left |
Логический сдвиг влево |
Rd(n+1) ¬ Rd(n), Rd(0) ¬ 0 |
1 |
LSR |
Rd |
Logical Shift Right |
Логический сдвиг вправо |
Rd(n) ¬ Rd(n+1), Rd(7) ¬ 0 |
1 |
ROL |
Rd |
Rotate Left Through Carry |
Циклический сдвиг влево |
Rd(0)¬C,Rd(n+1)¬ Rd(n), C¬Rd(7) |
1 |
ROR |
Rd |
Rotate Right Through Carry |
Циклический сдвиг вправо |
Rd(7)¬C,Rd(n)¬ Rd(n+1),C¬Rd(0) |
1 |
ASR |
Rd |
Arithmetic Shift Right |
Арифметический сдвиг вправо |
Rd(n) ¬ Rd(n+1), n=0..6 |
1 |
SWAP |
Rd |
Swap Nibbles |
Поменять местами тетрады регистра |
Rd(3..0)¬Rd(7..4),Rd(7..4)¬Rd(3..0) |
1 |
BSET |
s |
Flag Set |
Установить флаг № s регистра состояний SREG |
SREG(s) ¬ 1 SREG(s) |
1 |
1 |
2 |
3 |
4 |
5 |
6 |
BCLR |
s |
Flag Clear |
Сбросить флаг № s регистра состояний SREG |
SREG(s) ¬ 0 SREG(s) |
1 |
BLD |
Rd, b |
Bit load from T to Register |
Установить бит b регистра равным значению флага T |
Rd(b) ¬ T |
1 |
BST |
Rr, b |
Bit Store from Register to T |
Установить флаг T равным значению бита b регистра |
T ¬ Rr(b) |
1 |
SEC |
Set Carry |
Установить флаг |
C ¬ 1 |
1 |
|
CLC |
Clear Carry |
Сбросить флаг |
C ¬ 0 |
1 |
|
SEN |
Set Negative Flag |
Установить флаг |
N ¬ 1 |
1 |
|
CLN |
Clear Negative Flag |
Сбросить флаг |
N ¬ 0 |
1 |
|
SEZ |
Set Zero Flag |
Установить флаг |
Z ¬ 1 |
1 |
|
CLZ |
Clear Zero Flag |
Сбросить флаг |
Z ¬ 0 |
1 |
|
SEI |
Global Interrupt Enable |
Общее разрешение прерываний |
I ¬ 1 |
1 |
|
CLI |
Global Interrupt Disable |
Общий сброс прерываний |
I ¬ 0 |
1 |
|
SES |
Set Signed Test Flag |
Установить флаг |
S ¬ 1 |
1 |
|
CLS |
Clear Signed Test Flag |
Сбросить флаг |
S ¬ 0 |
1 |
|
SEV |
Set Twos Complement Overflow |
Установить флаг |
V ¬ 1 |
1 |
|
CLV |
Clear Twos Complement Overflow |
Сбросить флаг |
V ¬ 0 |
1 |
|
SET |
Set T in SREG |
Установить флаг |
T ¬ 1 |
1 |
|
CLT |
Clear T in SREG |
Сбросить флаг |
T ¬ 0 |
1 |
|
SEH |
Set Half Carry Flag in SREG |
Установить флаг |
H ¬ 1 |
1 |
|
CLH |
Clear Half Carry Flag in SREG |
Сбросить флаг |
H ¬ 0 |
1 |
|
NOP |
No Operation |
Пустая операция |
None |
1 |
|
SLEEP |
Sleep (see specific description) |
Спящий режим |
None |
3 |
|
WDR |
Watchdog Reset |
Сброс сторожевого таймера |
None |
1 |
Обозначения, используемые в приложении А:
Разряды регистра состояния SREG:
Приложение Д
Адреса векторов прерываний микроконтроллера ATmega8
Символическая константа |
Адрес в памяти программ |
Описание |
Условие срабатывания |
1 |
2 |
3 |
4 |
|
$000 |
Reset |
Сброс микроконтроллера |
INT0addr |
$001 |
External Interrupt0 |
INT0 внешнее прерывание 0 |
INT1addr |
$002 |
External Interrupt1 |
INT1 внешнее прерывание 1 |
OC2addr |
$003 |
Output Compare2 Interrupt |
Совпадение таймера/счетчика 2 с заданным значением |
OVF2addr |
$004 |
Overflow2 Interrupt |
Переполнение таймера/счетчика 2 |
ICP1addr |
$005 |
Input Capture1 Interrupt |
Захват сигнала таймером/счетчиком 1 |
OC1Aaddr |
$006 |
Output Compare1A Interrupt |
Совпадение счетного регистра таймера/счетчика 1 со значением А |
OC1Baddr |
$007 |
Output Compare1B Interrupt |
Совпадение счетного регистра таймера/счетчика 1 со значением B |
OVF1addr |
$008 |
Overflow1 Interrupt |
Переполнение таймера/счетчика 1 |
OVF0addr |
$009 |
Overflow0 Interrupt |
Переполнение таймера/счетчика 0 |
SPIaddr |
$00a |
SPI Interrupt |
Передача по интерфейсу SPI завершена |
URXCaddr |
$00b |
USART Receive Complete Interrupt |
Прием по USART завершен |
1 |
2 |
3 |
4 |
UDREaddr |
$00c |
USART Data Register Empty Interrupt |
Готовность регистра данных USART |
UTXCaddr |
$00d |
USART Transmit Complete Interrupt |
Передача по USART завершена |
ADCCaddr |
$00e |
ADC Interrupt |
Преобразование АЦП завершено |
ERDYaddr |
$00f |
EEPROM Interrupt |
Готовность EEPROM |
ACIaddr |
$010 |
Analog Comparator Interrupt |
Срабатывание компаратора |
TWIaddr |
$011 |
Irq. vector address for Two-Wire Interface |
Прерывание интерфейса TWI |
SPMaddr |
$012 |
SPM complete Interrupt |
Готовность SPM |
SPMRaddr |
$012 |
SPM complete Interrupt |
Готовность SPM |