Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
880 Кб
Скачать

Лабораторная работа №3 Организация подпрограмм микроконтроллера ATmega8

Цель работы: изучение приемов программирования микроконтроллера ATmega8.

1. Краткие сведения из теории

Ассемблер микроконтроллера ATmega8

Весь список инструкций контроллеров серии AVR вместе с описанием каждой инструкции приведен в приложении 1. Таблица инструкций содержит следующие столбцы.

Mnemonics – мнемоническое представление инструкции (именно его мы используем при программировании).

Operands – операнды инструкции. Для обозначения операндов принята следующая система записи: Rd – регистр назначения; Rr – регистр источник; K – константные данные; k – константный адрес; b – бит в регистре либо регистре ввода/вывода; s – бит в регистре статуса; X,Y,Z – адресные регистры; A – адрес регистра ввода/вывода; q – смещение адреса.

Description – описание инструкции.

Operation – схематическая запись действий команды. Flags – флаги, на которые влияет команда.

#Clocks – время выполнения команды.

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

ARITHMETIC AND LOGIC INSTRUCTIONS – содержит арифметические и логические команды.

BRANCH INSTRUCTIONS – содержит инструкции перехода.

DATA TRANSFER INSTRUCTIONS – содержит инструкции передачи данных.

BIT AND BIT-TEST INSTRUCTIONS – содержит инструкции для работы с битами.

MCU CONTROL INSTRUCTIONS – содержит инструкции для управления ЦПУ.

20

Способ организация подпрограмм на ассемблере для микроконтроллеров ATmega8 ничем не отличается от организации подпрограмм для привычных процессоров архитектуры x86. Подпрограмма вызывается командой rcall k (переход относительно адреса текущей команды) либо icall (переход по адресу Z). При вызове адрес текущей команды запоминается в стеке, а счетчик команд устанавливается на новый адрес. Выполнение программы начинается по новому адресу. Как только обработчик команд встречает команду ret, из стека достается последний адрес и выполнение программы продолжается со следующей после вызова подпрограммы команды.

Пример:

FUNCTION: ;метка во время ассемблирования все метки в коде преобразуются в адреса

ret ; из стека извлекается верхний адрес и по нему осуществляется переход

rcall FUNCTION ; в стек помещается текущий адрес

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

как минимум два способа передачи параметров в подпрограмму.

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

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

сохраненный указатель.

21

Во всех примерах для простоты используется первый метод.

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

Пример:

SUM: ; функция сложения принимает r16 и r17 результат сложения возвращает в r18

push r16 ; запоминаем r16 push r17 ; и r17

add r16,r17 ; складываем r16 + r17

mov r18,r16 ; результат сложения помещаем в r18 pop r17 ; возвращаем значения r17

pop r16 ; и r16 в обратном порядке

ldi r16,10 ; помещаем аргументы функции в регистры ldi r17,10

rcall SUM ; вызываем функцию результат будет возвращен в r18

2. Оборудование рабочего места

Компьютер с установленным пакетом программ PROTEUS VSM.

4.Задание

Соберите схему, соответствующую заданию. Напишите программу для микроконтроллера ATmega8.

Вариант 1. Напишите программу сложения двух 4х битных чисел. Числа задаются двумя блоками переключателей. Операция выполняется при нажатии на кнопку.

22

Вариант 2. Напишите программу вычитание двух 4х битных чисел. Числа задаются двумя блоками переключателей. Операция выполняется при нажатии на кнопку.

Вариант 3. Напишите программу умножения двух 4х битных чисел. Числа задаются двумя блоками переключателей. Операция выполняется при нажатии на кнопку.

Вариант 4. Напишите программу «Бегущие огни». Светодиоды (8 шт.) загораются последовательно по нажатию кнопки. По достижении последнего, цикл повторяется с первого светодиода.

4. Содержание и оформление отчета

Отчет по лабораторной работе оформляется на листах формата А4 и должен содержать:

1.Экранный снимок готовой схемы, собранной в окне программы ISIS.

2.Листинг программы.

3.Выводы по эксперименту.

5.Порядок выполнения работы

Собрать схему на основе ATmega8.

1. Подключить к ножкам микроконтроллера PB0-PB7 два блока переключателей для задания бинарных чисел DIPSW_4 (для вариантов, требующих задания исходных чисел). Неиспользуемые контакты блоков переключателей соединить с корпусом (рис 1.).

Рисунок 1- Схема подключения два блоков переключателей

23

2. Подключить необходимое количество светодиодов (LED-RED, LED-GREEN и т.д.) подключить к ножкам PС или PD (например, как на рис. 2) через токоограничивающие резисторы 300Ом.

Рисунок 3- Схема подключения светодиодов

3.Напишите программу в соответствии с заданием и запустите эмуляцию её выполнения контроллеромATmega8.

4.Убедитесь в корректности работы программы.

6.Контрольные вопросы

1.Какой командой вызывается подпрограмма? Каков механизм вызова?

2.Приведите команды работы со стеком. В чем особенности стековой памяти?

3.Перечислите команды перемещения данных.

4.Перечислите команды арифметических операции.

5.Перечислите команды логических операций.

24

Лабораторная работа №4

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

микроконтроллера ATmega8 с использованием механизма прерываний.

1. Краткие сведения из теории

Прерывания Механизм прерываний, предназначен для определения реакции

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

Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей

последовательности

команд

приостанавливается,

и

управление

передаётся обработчику

прерывания. В зависимости

от

источника

возникновения сигнала, прерывания делятся на:

 

 

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

синхронные, или внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение стека, обращение к недопустимым адресам памяти или недопустимый код операции;

программные (частный случай внутреннего прерывания) —

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

25

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

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

Вдокументации к контроллеру можно найти таблицу векторов прерываний. Для записи инструкции безусловного перехода по нужному адресу следует использовать директиву ассемблера .org <адрес>. Адреса всех прерываний, для удобства разработчиков, определены в подключаемом файле m8def.inc.

Пример записи в таблицу векторов прерываний:

.org INT0addr ; следующие инструкции будут размещены по адресу INT0addr rjmp INT0_IRQ ; переход к обработчику прерывания

.org INT1addr

rjmp INT1_IRQ

.org OVF0addr

rjmp TIM0_OVF

26

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

Настройка прерывания по переполнению таймера.

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

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

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

Для таймера Timer/Counter0 частота устанавливается через регистр TCCR0. В который можно записать одно из следующих значений (рис. 1.):

Рисунок 1 - Структура регистра TCCR0

27

Таблица 1 – Возможные настройки таймера

Значение

Описание

 

Комментарий

 

 

 

 

 

 

 

0 0 0

No

clock

source

Таймер выключен

 

 

(Timer/Counter stopped).

 

 

 

 

 

 

 

 

0 0 1

clkI/O/(No prescaling).

Работает

с

частотой

 

 

 

 

микроконтроллера.

Без

 

 

 

 

делителя.

 

 

 

 

 

0 1 0

clkI/O/8 (From prescaler).

Делитель = 8. Частота делится

 

 

 

 

на 8.

 

 

 

 

 

 

0 1 1

clkI/O/64 (From prescaler).

Делитель = 64.

 

 

 

 

 

 

1 0 0

clkI/O/256

(From

Делитель = 256.

 

 

prescaler).

 

 

 

 

 

 

 

 

 

1 0 1

clkI/O/1024

(From

Делитель = 1024.

 

 

prescaler).

 

 

 

 

 

 

 

 

 

 

 

1 1 0

External

clock

source on

Внешний

источник.

Таймер

 

T0 pin. Clock on falling

срабатывает по падению уровня

 

edge.

 

 

на ножке T0.

 

 

 

 

 

 

 

 

1 1 1

External

clock

source on

Внешний

источник.

Таймер

 

T0 pin. Clock on rising

срабатывает

по возрастанию

 

edge.

 

 

уровня на ножке T0.

 

 

 

 

 

 

 

 

2. Включение прерывания. Необходимо установить флаг прерывания, для его активации. Для таймера Timer/Counter0 этот флаг устанавливается в первом бите регистра TIMSK.

28

Рисунок 2 - Структура регистра TIMSK

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

Пример настройки таймера:

.org OVF0addr ; адрес в таблице векторов прерываний rjmp TIM0_OVF

TIM0_OVF: ; прерывание по таймеру

reti

;TIM0 настройка на 1MHz ldi r16,0x00

out TCNT0,r16 ldi r16,0x05

out TCCR0,r16 ldi r16,0x01 out TIMSK,r16

Настройка внешнего прерывания.

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

29

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]