Лабораторная работа №2 (Методичка - Лабораторная работа №2)
Описание файла
Файл "Лабораторная работа №2" внутри архива находится в папке "Методичка - Лабораторная работа №2". Документ из архива "Методичка - Лабораторная работа №2", который расположен в категории "". Всё это находится в предмете "элементы управления в асоиу" из 7 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "элементы управления в асоиу" в общих файлах.
Онлайн просмотр документа "Лабораторная работа №2"
Текст из документа "Лабораторная работа №2"
Московский государственный технический университет им. Н.Э. Баумана
Факультет информатики и систем управления
Автоматизированные системы обработки информации и управления
Адейкин С.
Романов А.
Романов П.
Методические указания
«Введение в программирование микроконтроллеров AVR»
Лабораторная работа №2
Москва 2010г.
Цель работы
Получить общие сведения о системе прерываний и таймерах.
Введение
В прошлой лабораторной работе вы сделали вывод раз в секунду на порт какого-то числа. Что бы обеспечить секундный интервал, необходимо было точно посчитать, сколько команд требуется выполнить при данной тактовой частоте микроконтроллеру, что бы это заняло ровно 1 секунду. Хотя для этой цели и существуют специальные программы, для выполнения какого-то действия с заданной периодичностью лучше использовать таймеры. Что бы использовать таймеры, надо сначала познакомится с системой прерываний.
Прерывания
Прерывание нарушает нормальный ход выполнения программы для выполнения какой-либо задачи, определяемой внешними или внутренними событиями МК. При возникновении прерывания МК сохраняет в стеке содержимое счетчика команд и загружает в него адрес соответствующего вектора прерывания. По этому адресу обычно находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой этой подпрограммы должна быть команда reti – она обеспечит возврат из подпрограммы, разрешение прерываний и восстановление счетчика команд.
Таблица векторов прерываний
МК имеет развитую систему приоритетных прерываний. Все возможные прерывания перечислены в таблице прерываний, которая располагается в младших адресах памяти программ. Причем, чем меньше адрес вектора, тем выше приоритет соответствующего прерывания. Размер ьаблицы векторов прерываний зависит от объема памяти программ и составляет 2 байта для ATmega16. Это означает, что для перехода к подпрограмме обработки прерывания необходимо использовать команду jmp, а использование rjmp недопустимо (вообще говоря это возможно, но проще использовать команду jmp).
Подпрограмма обработки прерывания
При в ходе в подпрограмму обработки прерывания флаг I регистра SREG сбрасывается, запрещая прерывания, но разработчик может разрешить их, использую соответствующую команду. Надо помнить, что в подпрограмме обработки прерывания следует сохранять в стеке используемые в ней регистры, в том числе и регистр SREG. Если, например, у вас в программе складывается два числа, результат записывается в r16, а потом из него вычитается третье. Предположим, в обработчике прерывания не сохраняются регистры. Если прерывание возникнет до сложения этих двух чисел, все прекрасно, все будет работать как надо. Но если оно возникнет уже после их сложения, но до вычитания третьего, а в обработчике используется регистр r16, то после выхода из прерывания там будет мусор, а никак не результат сложения. Так могут возникнуть крайне трудноуловимые баги, которые могут проявляться раз в 100 лет.
Два типа прерываний
Все прерывания можно разделить на два типа:
-
Прерывания «с флагом»
-
Прерывания «без флага»
При возникновении прерывания первого типа в специальном регистре устанавливается специальный флаг. Если прерывания не разрешены, он так и останется установленным. Если же прерывания разрешены, произойдет переход по соответствующему адресу в таблице векторов прерываний, и флаг аппаратно сбросится. Из этой схемы вытекает вывод: если на момент возникновения прерывания первого типа они были запрещены, то флаг так и останется установленным. Когда же прерывания будут разрешены, вызовутся обработчики этих прерывания в соответствии с их приоритетом.
Прерывания второго типа просто возникают, пока есть условия, необходимые для возникновения прерывания. Когда условия изменятся, прерывание возникать не будет. Отсюда следует, что, если на момент возникновения прерывания они были запрещены, а потом прерывания разрешили, то нет возможности узнать, было прерывание или не было.
Пример программы с прерываниями
.include "m16def.inc"
jmp MAIN
jmp NO_INTERRUPT // INT0
jmp NO_INTERRUPT // INT2
jmp NO_INTERRUPT // TIMER2 COMP
jmp NO_INTERRUPT // TIMER2 OVF
jmp NO_INTERRUPT // TIMER1 CAPT
jmp NO_INTERRUPT // TIMER1 COMP1
jmp NO_INTERRUPT // TIMER1 COMPB
jmp NO_INTERRUPT // TIMER1 OVF
jmp NO_INTERRUPT // TIMER0 OVF
jmp NO_INTERRUPT // SPI, STC
jmp NO_INTERRUPT // USART, RXC
jmp NO_INTERRUPT // USART, UDRE
jmp NO_INTERRUPT // USART, TXC
jmp NO_INTERRUPT // ADC
jmp NO_INTERRUPT // EE_RDY
jmp NO_INTERRUPT // ANA_COMP
jmp NO_INTERRUPT // TWI
jmp NO_INTERRUPT // INT2
jmp NO_INTERRUPT // TIMER0 COMP
jmp NO_INTERRUPT // SPM_RDY
// Основная программа
MAIN:
// Инициализируем стек
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
// Разрешаем прерывания
sei
// Делаем что-то
ser r16
out DDRA, r16
// и т.д. ...
LOOP:
rjmp LOOP
// Обработчики прерываний
NO_INTERRUPT: reti
Таймеры
МК ATmega16 имеет в своем составе два 8-разрядных таймера – T0 и T2 и одни 16-разрядный – T1. Кроме реализации функций таймера, они могут работать и как счетчики внешних сигналов, а таймер Т1 – запоминать свое состояние по внешнему сигналу.
Рис 1. Структурная схема таймера T0 (упрощенная)
Таймеры и выводы
Каждый таймер использует несколько выводов МК. Эти выводы перечислены в справочнике. Не забывайте, что при использовании этих выводов надо соответствующе их настроить – если это выход, то на выход, а если вход – то на вход.
Если надо по таймеру просто мигать лампочкой, то достаточно просто подключить её к соответствующему выводу и настроить таймер на изменение состояние этого вывода. Причем нельзя настроить таймер на произвольный вывод – он заранее предопределен и у каждого таймера он свой. Если надо подключить две лампочки, причем что бы вторая мигала инверсно первой – можно настроить второй таймер, а можно использовать один таймер и его систему прерываний.
Прерывания таймера
Каждый таймер может генерировать несколько прерываний при возникновении соответствующих условий: это может быть и переполнение счетчика, и совпадение с регистром сравнения. Для того, что бы использовать эти прерывания, надо:
-
Глобально разрешить прерывания
-
Разрешить конкретное прерывание конкретного таймера
Для управления прерываниями от таймеров используется регистр TIMSK. Описание разрядов этого регистра приведено в справочнике. Для разрешения прерывания необходимо просто установить в 1 соответствующий разряд этого регистра.
Для индикации наступления прерывания от таймера предназначен регистр TIFR. Описание его разрядов приведено в справочнике. При наступлении прерывания соответствующий разряд этого регистра устанавливается в 1, а при запуске подпрограммы обработки прерывания – аппаратно сбрасывается в 0.
Но разрешить прерывания (или не разрешать их, если вы используете вывод МК) мало, таймер работать не будет – надо еще сконфигурировать его.
Настройка таймера
Каждому таймеру соответствует несколько регистров – как минимум, регистр управление и счетный регистр, а в большинстве случаев, еще и регистр сравнения.
Рассмотрим настройку таймера на примере таймера Т0 – как вы помните, это 8-разрядный таймер. Этому таймеру соответствует три регистра: TCNT0 – счетный регистр, TCCR0 – регистр управления и OCR0 – регистр сравнения.
После подачи напряжения в счетном регистре находится нулевое значение. По каждому тактовому сигналу значение этого регистра может инкрементироваться, декрементироваться или сбрасываться в зависимости от режима работы таймера. Счетный регистр доступен как для записи, так и для чтения, но любая операция записи в него блокирует работу блока сравнения на время одного периода тактового сигнала таймера. По переполнению этого регистра могут вызываться прерывания, если они, конечно, разрешены.
Во время работы таймера в каждом машинном цикле происходит сравнение содержимого счетного регистра и регистра сравнения. В случае их равенства может сгенерироваться прерывание.
Регистр TCCR0 предназначен для управления таймером. Описание этого регистра при ведено в справочнике. Разряды этого регистра позволяют выбрать режим его работы, режим работы блока сравнения и выбрать источник тактового сигнала.
Режимы работы таймера
Таймер может работать в четырех режимах:
-
Нормальный режим
-
Сброс при совпадении
-
Быстродействующий ШИМ
-
ШИМ с точной фазой
Нормальный режим. В этом режиме таймер функционирует как обычный суммирующий счетчик. ПО каждому импульсу тактового сигнала происходит инкремент счетного регистра. При достижении 0xFF возникает переполнение и счет продолжается с 0x00. В этом же такте устанавливается флаг TOV0. При равенстве счетного регистра и регистре сравнения устанавливается флаг прерывания OCF0, и если разрешено прерывание, оно генерируется. Наряду с этим может изменяться и состояние вывода OC0 микроконтроллера.
Сброс при совпадении. Этот режим похож на предыдущий, но максимально возможное значение счетного регистра определяется регистром сравнения. После достижения заданной величины счет продолжается со значения 0x00.
Источник тактового сигнала
Регистр управления определяет и источник тактового сигнала таймера. Им может быть или системный тактовый сигнал (clkI/O), или масштабируемый системный тактовый сигнал (clkI/O/n), или внешний сигнал, поступающий на вход Т0 микроконтроллера. Масштабирование системного тактового сигнала позволяет легко регулировать частоту возникновения прерывания от таймера.
Режим работы блока сравнения
Регистр управления определяет также поведение вывода OC0 при наступлении события «Совпадение». Данный вывод может или бездействовать, или инвертироваться, или устанавливаться/сбрасываться при наступлении этого события.
Таким образом, для использования таймеров необходимо выполнить следующие действия:
-
Выбрать режим работы таймера
-
Определить, нужно ли изменение вывода при событии «Совпадение»
-
Выбрать источник тактового сигнала
-
Если это необходимо, разрешить прерывания
Выполнение работы
-
Ознакомится с методическими указаниями.
-
Написать программу вывода определенного значения на порт B раз в секунду. Значение формируется так, как указанно в таблице 1. Предусмотреть кнопки управления – СТОП, СТАРТ, ПАУЗА. Внимание! Вариант в этой таблице – не ваш вариант! Номер варианта для выполнения надо узнать у преподавателя!
Таблица 1. Варианты формирования значений для вывода.
№ | Формируется как… |
1 | Инкрементирующий счетчик |
2 | Декрементрирующий счетчик |
3 | Циклический сдвиг влево единицы |
4 | Циклический сдвиг вправо двойки |
5 | Инверсное мигание – 10101010 -> 01010101 |
6 | Случайное число |
7 | Как в «Рыцаре дорог» |
8 | Зажигаются последовательные 0..n светодиодов, где n – случайное число, каждый раз новое. |
9 | Два огонька летят навстречу друг другу |
10 | Два огонька летят из одной точки в разные стороны |
11 | Срез расходящейся волны – 2 огонька на одну сторону |
12 | Срез сходящейся волны – 2 огонька на одну сторону |
13 | Использовать 2 порта для пункта 7, но значения должны сходиться к центру |
14 | Использовать 2 порта для пункта 7, но значения должны расходиться из центра |
15 | 16-битный инкрементирующий счетчик |
16 | 16-битный декрементирующий счетчик |
17 | Циклический сдвиг влево/вправо единицы, направление сдвига зависит от состояния какого-либо вывода. |