Лаб.2. Программирование на С

Лабораторная работа №2 (4 часа)
«Режим CTC работы таймеров-счетчиков. Обслуживание внешних и внутренних
прерываний. Программирование на языке C с использованием компилятора WinAVR»
Цель работы
1. Изучить систему прерываний микроконтроллеров AVR.
2. Изучить работу таймеров в режиме CTC.
3. Изучить приемы программирования микроконтроллеров AVR на языке C.
Порядок выполнения работы
1. Изучить теоретический материал.
2. Изучить цикл программирования микроконтроллеров с использованием
компилятора WinAVR на примере реализации циклического переключения
светодиодов с фиксированной скоростью. Для этого:
1) В программе ProgrammersNotepad создать файл с исходным кодом
(согласно п. 3 раздела «Теоретические сведения»).
Исходный код программы для реализации циклического переключения
светодиодов с фиксированной скоростью.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned int d;
INTERRUPT(SIG_OVERFLOW1)
{
if((d&0x80)==0x80){d<<=1;d++;}else{d<<=1;};
PORTB=d;
}
int main(void)
{
d=254;
DDRB=255;
PORTB=d;
TCCR1B=0b00000011;
TIMSK=0b00000100;
sei();
while(1){}
}
2) Создать makefile. Установить в нем следующие значения параметров:
Main file name – имя файла с исходным кодом;
MCU type – atmega128;
F_CPU = 4000000.
3) Откомпилировать исходный код. В результате должен получиться файл с
расширением .hex для прошивки микроконтроллера.
4) Прошить микроконтроллер и убедиться, что программа работает
корректно.
2. Самостоятельно реализовать на индикаторной матрице контроллера включение
светодиодов по заданному алгоритму:
− произвести последовательное циклическое включение светодиодов
"бегущий огонь". Использовать первый таймер в качестве формирователя
времени свечения светодиодов индикаторной матрицы контроллера;
− использовать кнопки стенда для переключения скорости «бегущего огня».
Кнопки подключены к входам INT0…INT3 внешних прерываний
микроконтроллера.
Для выполнения задания использовать режим работы таймера «Сброс при
совпадении».
Теоретические сведения
1. Прерывания в ATMega128
1.1. Общие сведения
Прерывание прекращает нормальный ход программы для выполнения
приоритетной
задачи,
определяемой
внутренним
или
внешним
событием
микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке
содержимое счетчика команд PC и загружает в него адрес соответствующего вектора
прерывания. По этому адресу, как правило, находится команда безусловного перехода к
подпрограмме обработки прерывания. Последней командой подпрограммы обработки
прерывания должна быть команда RETI, которая осуществляет возврат в основную
программу и восстановление предварительно сохраненного счетчика команд.
1.2. Таблица векторов прерываний
Микроконтроллеры AVR семейства Mega имеют многоуровневую систему
приоритетных прерываний. Младшие адреса памяти программ, начиная с адреса $0002,
отведены под таблицу векторов прерывания. Каждому прерыванию соответствует адрес в
этой таблице, который загружается в счетчик команд при возникновении прерывания.
Положение вектора в таблице также определяет и приоритет соответствующего
прерывания: чем меньше адрес, тем выше приоритет прерывания. Размер вектора
прерывания составляет 2 байта. Соответственно, для перехода к подпрограммам
обработки прерываний используются команды JMP.
Положение таблицы векторов прерываний может быть изменено. Таблица может
располагаться не только в начале памяти программ, но также и в начале области
загрузчика, причем перемещение таблицы может быть осуществлено непосредственно в
ходе выполнения программы. Для управления размещением таблицы прерываний
используется регистр управления микроконтроллера MCUCR, расположенный по адресу
$35 ($55).
Распределение адресов таблицы векторов прерываний для микроконтроллера
ATmega128 приведено в Табл. 1.1. При размещении векторов прерываний в области
загрузчика к значениям, указанным в таблице, следует прибавить значение начального
адреса области загрузчика.
Таблица 1.1. Таблица векторов прерываний ATmega128
Источник
INT0
INT1
INT2
INT3
INT4
INT5
INT6
INT7
Описание
Внешнее прерывание 0
Внешнее прерывание 1
Внешнее прерывание 2
Внешнее прерывание 3
Внешнее прерывание 4
Внешнее прерывание 5
Внешнее прерывание 6
Внешнее прерывание 7
M103C=1
№
Адрес
1
$0002
2
$0004
3
$0006
4
$0008
5
$000A
6
$000C
7
$000E
8
$0010
M103C=0
№
Адрес
1
$0002
2
$0004
3
$0006
4
$0008
5
$000A
6
$000C
7
$000E
8
$0010
TIMER2COMP
TIMER2 0VF
TIMER1 САРТ
TIMER1 СОМРА
TIMER1 СОМРВ
TIMER1 OVF
TIMER0COMP
TIMER0OVF
SPI, STC
USARTO, RX
USARTO, UDRE
USARTO, TX
ADC
EE_RDY
ANA_COMP
TIMER1 СОМРС
TIMER3CAPT
TIMER3 СОМРА
TIMER3 СОМРВ
TIMER3 СОМРС
TIMER3 OVF
USART1,RX
USART1,UDRE
USART1,TX
TWI
SPM_RDY
Совпадение таймера/счетчика Т2
Переполнение таймера/счетчика Т2
Захват таймера/счетчика Т1
Совпадение А таймера/счетчика Т1
Совпадение В таймера/счетчика Т1
Переполнение таймера/счетчика Т1
Совпадение таймера/счетчика ТО
Переполнение таймера/счетчика ТО
Передача по SPI завершена
USARTO, прием завершен
Регистр данных USARTO пуст
USARTO, передача завершена
Преобразование АЦП завершено
EEPROM готово
Аналоговый компаратор
Совпадение С таймера/счетчика Т1
Захват таймера/счетчика ТЗ
Совпадение А таймера/счетчика ТЗ
Совпадение В таймера/счетчика ТЗ
Совпадение С таймера/счетчика ТЗ
Переполнение таймера/счетчика ТЗ
USART1, прием завершен
Регистр данных USART1 пуст
USART1, передача завершена
Прерывание от модуля TWI
Готовность SPM
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$0012
$0014
$0016
$0018
$001A
$001C
$001E
$0020
$0022
$0024
$0026
$0028
$002A
$002C
$002E
$0030
$0032
$0034
$0036
$0038
$003A
$003C
$003E
$0040
$0042
$0044
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-
$0012
$0014
$0016
$0018
$001A
$001C
$001E
$0020
$0022
$0024
$0026
$0028
$002A
$002C
$002E
-
Если прерывания в работе микроконтроллера не предусматриваются, то на месте
таблицы векторов прерываний может быть размещена часть основной программы.
1.3. Обработка прерываний
Для глобального разрешения/запрещения прерываний предназначен флаг I
регистра SREG. Для разрешения прерываний он должен быть установлен в 1, а для
запрещения — сброшен в 0. Индивидуальное разрешение или запрещение (маскирование)
прерываний производится установкой/сбросом соответствующих битов регистров масок
прерываний, рассматриваемых ниже.
При возникновении прерывания флаг I регистра SREG аппаратно сбрасывается,
запрещая тем самым обработку следующих прерываний. Однако в подпрограмме
обработки прерывания этот флаг можно снова установить в 1 для разрешения вложенных
прерываний. При возврате из подпрограммы обработки прерывания (при выполнении
команды RETI) флаг I устанавливается аппаратно.
Все имеющиеся прерывания можно разделить на два типа. Прерывания первого
типа генерируются при наступлении некоторого события, в результате которого
устанавливается флаг прерывания. Затем, если прерывание разрешено, в счетчик команд
загружается адрес вектора соответствующего прерывания. При этом флаг прерывания
аппаратно сбрасывается. Он также может быть сброшен программно, записью лог. 1 в бит
регистра, соответствующий флагу.
Прерывания второго типа не имеют флагов прерываний и генерируются в течение
всего времени, пока присутствуют условия, необходимые для генерации прерывания.
Соответственно, если условия, вызывающие прерывание, исчезнут до разрешения
прерывания, генерации прерывания не произойдет.
Следует помнить, что при вызове подпрограмм обработки прерываний регистр
состояния SREG не сохраняется. Поэтому пользователь должен самостоятельно
запоминать содержимое этого регистра при входе в подпрограмму обработки прерывания
(если это необходимо) и восстанавливать его значение перед вызовом команды RETI.
Микроконтроллеры семейства Mega поддерживают очередь прерываний, которая
работает следующим образом: если условия генерации одного или более прерываний
возникают в то время, когда флаг общего разрешения прерываний сброшен (все
прерывания запрещены), соответствующие флаги устанавливаются в 1 и остаются в этом
состоянии до установки флага общего разрешения прерываний. После разрешения
прерываний выполняется их обработка в порядке приоритета.
Наименьшее время отклика для любого прерывания составляет 4 такта. В течение
этого времени происходит сохранение счетчика команд в стеке. В течение последующих
трех тактов выполняется команда перехода к подпрограмме обработки прерывания. Если
прерывание произойдет во время выполнения команды, длящейся несколько циклов, то
генерация прерывания произойдет только после выполнения этой команды. Если же
прерывание произойдет во время нахождения микроконтроллера в «спящем» режиме, то
время отклика увеличивается еще на 4 или 5 тактов.
Возврат в основную программу занимает 4 такта, в течение которых происходит
восстановление счетчика команд из стека. После выхода из прерывания процессор всегда
выполняет одну команду основной программы, прежде чем обслужить любое отложенное
прерывание.
1.4. Внешние прерывания
В микроконтроллерах семейства Mega имеется две разновидности внешних
прерываний. Прерывания первого типа генерируются при появлении на входе внешнего
прерывания заданного сигнала. Прерывания второго типа генерируются при любом
изменении состояния определенных выводов микроконтроллера.
Для разрешения/запрещения внешних прерываний используется регистр
маскирования внешних прерываний EIMSK.
Для индикации наступления внешних прерываний используется регистр флагов
внешних прерываний EIFR.
Рис.1.1. Формат регистра EIMSK
Рис.1.2 Формат регистра EIFR
Прерывания INT0...INT7 могут быть сгенерированы по нарастающему/спадающему
фронту сигнала или при появлении НИЗКОГО уровня на входе.
Условия генерации прерываний INT0...INT3 определяются состоянием
определенных битов регистра EICRA. Условия генерации прерываний INT7...INT4
определяются регистром EICRB.
а)
б)
Рис.1.3. Формат регистров EICRA (а) и EICRB (б)
Таблица 1.2. Определение условий генерации внешних прерываний
ISCn1
ISCn0
Условие
0
0
По НИЗКОМУ уровню на выводе INTn
0
1
Зарезервировано
1
0
По спадающему фронту сигнала на выводе INTn
1
1
По нарастающему фронту сигнала на выводе INTn
Таблица 1.3. Альтернативные функции выводов портов микроконтроллера
Вывод порта
Функция
Описание
PD0
INT0
Вход внешнего прерывания 0
PD1
INT1
Вход внешнего прерывания 1
PD2
INT2
Вход внешнего прерывания 2
PD3
INT3
Вход внешнего прерывания 3
PE4
INT4
Вход внешнего прерывания 4
PE5
INT5
Вход внешнего прерывания 5
PE6
INT6
Вход внешнего прерывания 6
PE7
INT7
Вход внешнего прерывания 7
2. Шестнадцатибитные таймеры/счетчики
В модели ATmega128 имеется два 16-битных таймера/счетчика — Т1 и ТЗ. Как и 8битные таймеры/счетчики Т0 и Т2, они могут использоваться для формирования
временных интервалов, для подсчета числа внешних событий, формирования сигналов и
генерации сигналов с ШИМ. В дополнение к этому 16-битные таймеры/счетчики могут по
внешнему сигналу сохранять свое текущее состояние в отдельном регистре ввода/вывода.
16-битные таймеры/счетчики имеют по три блока сравнения.
В состав каждого таймера/счетчика входят следующие регистры ввода/вывода:
• 16-битный счетный регистр TCNTn;
• 16-битный регистр захвата ICRn;
• три 16-битных регистра сравнения OCRnA, OCRnB, OCRnC;
• три 8-битных регистра управления TCCRnA, ТССRnВ, TCCRnC.
Каждый из 16-битных регистров физически размещается в двух регистрах
ввода/вывода, названия которых получаются добавлением к названию регистра буквы «Н»
(старший байт) и «L» (младший байт). Счетный регистр таймера/счетчика T1 TCNT1,
например, размещается в регистрах TCNT1H:TCNT1L. Таймеры/счетчики Т1 и ТЗ могут
генерировать прерывание при наступлении следующих событий:
• переполнение счетного регистра;
• равенство счетного регистра и регистра сравнения (по одному прерыванию на
каждый блок сравнения);
• сохранение счетного регистра в регистре захвата.
Флаги всех прерываний 16-битных таймеров/счетчиков находятся в регистрах
флагов TIFR/ETIFR, а разрешение/запрещение этих прерываний осуществляется
установкой/сбросом соответствующих флагов регистров TIMSK/ETIMSK.
Счетный регистр таймера/счетчика TCNTn входит в состав основного блока
модуля — блока реверсивного счетчика. В зависимости от режима работы модуля
содержимое счетного регистра сбрасывается, инкрементируется или декрементируется
по каждому импульсу тактового сигнала таймера/счетчика clkTn. Регистр доступен в
любой момент времени как для чтения, так и для записи. После подачи напряжения
питания в регистре TCNTn находится нулевое значение. При некоторых изменениях
состояния таймера/счетчика, определяемых режимом его работы, устанавливается бит
ТОVn в соответствующем регистре флагов. Разрешение прерывания осуществляется
установкой в 1 бита ТOIЕn соответствующего регистра маски.
Регистры сравнения OCRnA/OCRnB/OCRnC входят в состав блоков сравнения. Во
время работы таймера/счетчика производится непрерывное (в каждом такте) сравнение
этих регистров с регистром TCNTn. В случае равенства содержимого регистра сравнения
и счетного регистра в следующем такте устанавливается флаг OCFnA/OCFnB/OCFnC в
соответствующем регистре флагов и генерируется прерывание (если оно разрешено).
Также при наступлении этого события может изменяться состояние
вывода
ОСnА/ОСnВ/ОСnС микроконтроллера. Чтобы таймер/счетчик мог управлять состоянием
какого-либо из этих выводов, он должен быть сконфигурирован как выходной
(соответствующий бит регистра DDRx должен быть установлен в 1).
Регистр захвата ICRn входит в состав блока захвата, назначение которого —
сохранение в определенный момент времени состояния таймера/счетчика в регистре
захвата. Это действие может производиться либо по активному фронту сигнала на
выводе IСРn микроконтроллера, либо (для таймера/счетчика Т1) по сигналу от
аналогового компаратора. Одновременно с записью в регистр захвата устанавливается
флаг ICFn соответствующего регистра флагов и генерируется запрос на прерывание.
Разрешение прерывания осуществляется установкой в 1 бита TICIEn регистра маски.
Для управления таймером/счетчиком используются три регистра управления:
TCCRnA, TCCRnB, TCCRnB. Формат этих регистров приведен на рис. 2.1…2.3, а
описание их битов — в Табл. 2.1…2.3.
а)
б)
Рис. 2.1. Формат регистров TCCR1A (a), TCCR3A (б)
Таблица 2.1. Биты регистров TCCRnA
Название
Описание
СОМnА1:СОМnА0
СОМnВ1:СОМnВ0
СОМnС1:СОМnС0
Режим работы блока сравнения. Эти биты определяют состояние
вывода ОСnх при наступлении события «Совпадение». Влияние
содержимого этих битов на состояние вывода зависит от режима
работы таймера/счетчика
WGMnl:WGMn0
Режим работы таймера/счетчика. Совместно с битами
WGMn3:WGMn2 регистра ТССRnВ определяют режим работы
таймера/счетчика Тn (см. Табл. 7.25)
FOCnA
Принудительное изменение состояния вывода ОСnх. При записи
в бит FOCnx лог. 1 состояние вывода ОСnх изменяется в
соответствии с установками битов СОМn1х:СОМn0x регистра
TCCR/jA. Прерывание при этом не генерируется и сброс
таймера (в режиме СТС) не производится. Эта функция доступна
только в тех режимах, которые не используются для генерации
сигнала с ШИМ. При чтении бита всегда возвращается 0
FOCnB
Примечание, n = 1,3; х = А, В или С.
а)
б)
Рис. 2.2. Формат регистров TCCR1B (a), TCCR3B (б).
Таблица 2.2. Биты регистров TCCRnB
Бит
Название
Описание
7
ICNCn
Управление схемой подавления помех блока захвата. Если бит
сброшен в 0, схема подавления помех выключена (захват
производится по первому активному фронту). Если бит
установлен в 1, схема подавления помех включена и захват
осуществляется только в случае четырех одинаковых выборок,
соответствующих активному фронту сигнала
6
ICESn
Выбор активного фронта сигнала захвата. Если бит \CESn
сброшен в 0, сохранение счетного регистра в регистре захвата
осуществляется по спадающему фронту сигнала. Если бит
установлен в 1, то сохранение счетного регистра в регистре
захвата осуществляется по нарастающему фронту сигнала.
Одновременно
с
сохранением
счетного
регистра
устанавливается также флаг прерывания ICF/i регистра флагов
5
-
Не используется, читается как 0
4,3 WGMn3:WGMn2
Режим работы таймера/счетчика. Совместно с битами WG
Мn1:WGМnО регистра TCCRnA определяют режим работы
таймера/счетчика In (Табл. 7.25)
2-0 CSn2...CSn0
Управление тактовым сигналом. Эти биты определяют
источник тактового сигнала микроконтроллера (см. подраздел
7.6.2)
а)
б)
Рис. 2.3. Формат регистров TCCR1C (а), TCCR3C (б)
Таблица 2.3. Биты регистров TCCRnС
Бит Название
7
FOCnA
6
FOCnB
5
FOCnC
Описание
Принудительное изменение состояния вывода ОСnх. При записи в
бит ОСnх1 лог. 1 состояние вывода ОСnх изменяется в соответствии
с установками битов СОМn1х СОМn0х регистра TCCRnA
Прерывание при этом не генерируется и сброс таймера (в режиме
СТС) не производится. Эта функция доступна только в тех режимах,
которые не используются для генерации сигнала с ШИМ При чтении
бита всегда возвращается 0
4..0 Не используются, читаются как 0
Примечание, п = 1, 3, х = А, В или С
2.1. Управление тактовым сигналом
Формирование тактового сигнала 16-битных таймеров/счетчиков clkTn (n = 1,3,)
осуществляется блоком предделителя. В качестве тактового сигнала clkTn
таймеров/счетчиков Т1 и ТЗ, может использоваться:
• системный тактовый сигнал (clkTn = clkI/0);
• масштабированный системный тактовый сигнал (clkTn = clkI/0/N);
• внешний сигнал, поступающий на вход Т1 (ТЗ) микроконтроллера ( clkTn =
clkEXT).
Выбор источника тактового сигнала, а также запуск и остановка
таймеров/счетчиков осуществляются с помощью битов CSn2...CSn0 регистра управления
таймером TCCRnB согласно Табл. 2.4.
Таблица 2.4. Выбор источника тактового сигнала 16-битных таймеров/счетчиков
CSn2
CSn1
CSn0
0
0
0
Таймер/счетчик остановлен
0
0
1
clkI/0
0
1
0
clkI/0/8
0
1
1
clkI/0/64
1
0
0
clkI/0/256
1
0
1
clkI/0/1024
1
1
0
Вывод Тn, счет осуществляется по спадающему фронту
импульсов
1
1
1
Вывод Тn, счет осуществляется по нарастающему фронту
импульсов
Источник тактового сигнала
Примечание, n = 1,3.
2.2. Режимы работы
Режим работы таймеров/счетчиков Т1 и ТЗ определяется состоянием битов
WGMn3:WGMn2 регистра TCCRnB совместно с битами WGMn1:WGMn0 регистра
ТССRnА. Зависимость режима работы таймеров/счетчиков от состояния этих битов
показана в Табл. 2.5.
Таблица 2.5. Режимы работы 16-битных таймеров/счетчиков Т1 и ТЗ
№ W W W W
Режим работы
Модуль Обновление
G G G G
таймера/счетчика
счета
регистров
Тn
M M M M
(TOP)
OCRnx
n3 n2 n1 n0
Момент
установки
флага
TOVn
Немедленно
$FFFF
Phase correct PWM, $00FF
8-битный
При TOP
$0000
0
Phase correct PWM, $01FF
9-битный
При TOP
$0000
1
1
Phase correct PWM, $03FF
10-битный
При TOP
$0000
1
0
0
CTC
(сброс
совпадении)
Немедленно
$FFFF
0
1
0
1
Fast PWM, 8-битный
$00FF
При TOP
При TOP
6
0
1
1
0
Fast PWM, 9-битный
$01FF
При TOP
При TOP
7
0
1
1
1
Fast
PWM,
битный
10- $03FF
При TOP
При TOP
8
1
0
0
0
Phase and Frequency ICRn
Correct PWM
$0000
$0000
9
1
0
0
1
Phase and Frequency OCRnA
Correct PWM
$0000
$0000
10
1
0
1
0
Phase correct PWM
ICRn
При TOP
$0000
11
1
0
1
1
Phase correct PWM
OCRnA
При TOP
$0000
0
0
0
0
0
Normal
1
0
0
0
1
2
0
0
1
3
0
0
4
0
5
$FFFF
при OCRnA
Немедленно
$FFFF
-
-
-
Fast PWM
ICRn
При TOP
При ТОР
Fast PWM
OCRnA
При TOP
При ТОР
12
1
1
0
0
CTC
(сброс
совпадении)
13
1
1
0
1
Зарезервировано
14
1
1
1
0
15 1
1
1
1
Примечание, n = 1,3.
при ICRn
Режим СТС (сброс при совпадении)
В этом режиме счетный регистр тоже функционирует как обычный
суммирующий счетчик, инкрементирование которого осуществляется по каждому
импульсу тактового сигнала clkTn. Однако максимально возможное значение счетного
регистра и, следовательно, разрешающая способность счетчика определяются либо
регистром сравнения блока A OCRnA (WGMn3:0 = 0100), либо регистром захвата ICRn
(WGMn3:0 = 1100). После достижения максимального значения счет продолжается со
значения $0000. Как и в режиме Normal, флаг прерывания TOVn устанавливается при
изменении значения счетного регистра с $FFFF на $0000. При достижении счетчиком
максимального значения устанавливается флаг:
• OCFnA, если модуль счета определяется регистром сравнения OCRnA
(WGMn3:0 = 0100);
• ICFn, если модуль счета определяется регистром захвата ICRn (WGMn3:0=1100).
Одновременно с установкой флага может изменяться состояние вывода ОСnх
микроконтроллера. Состояние вывода определяется содержимым битов СОМn:1:СОМn0
регистра TCCRnx, как указано в Табл. 2.6.
Таблица 2.6. Управление выводами OCnA/OCnB/ОСnС в режиме СТС
Описание
COMnxl COMnx0
0
0
Таймер/счетчик Тn отключен от вывода ОСnx
0
1
Состояние вывода меняется на противоположное
1
0
Вывод сбрасывается в 0
1
1
Вывод устанавливается в 1
Примечание, n = 1,3,4,5; х = А, В или С.
Как и в режиме Normal, состояние выводов ОСnА/ОСnВ/ОСnС при
необходимости может быть изменено принудительно, записью лог. 1 в бит
FOCnA/FOCnB/FOCnC регистра ТССRnС. Прерывание при этом не генерируется, и сброс
счетного регистра не производится.
2.3. Прерывания от таймеров/счетчиков
В ATmega128 для разрешения/запрещения прерываний от таймеров/счетчиков
используется два регистра ввода/вывода: TIMSK и ETIMSK. Точно также в
микроконтроллере присутствуют два регистра, содержащие флаги прерываний: TIFR и
ETIFR.
Форматы регистров, используемых для разрешения/запрещения прерываний от
таймеров/счетчиков, показаны на Рис. 2.4, а описание их битов приведено в Табл. 2.7.
Для разрешения какого-либо прерывания от таймера/счетчика необходимо
установить в 1 соответствующий бит регистра TIMSK(ETIMSK) и, разумеется, флаг I
регистра SREG.
а)
б)
Рис. 2.4. Формат регистров TIMSK (а) и ETIMSK (б)
Таблица 2.7. Биты регистров TIMSK, ETIMSK
Название бита
Описание
TOIEn
Флаг разрешения прерывания по переполнению таймера/счетчика
Tn
OCIEn
Флаг разрешения прерывания по событию «Совпадение»
таймера/счетчика Tn
OCIEnA
Флаг разрешения прерывания по событию «Совпадение A»
таймера/счетчика Tn
OCIEnB
Флаг разрешения прерывания по событию «Совпадение B»
таймера/счетчика Tn
OCIEnC
Флаг разрешения прерывания по событию «Совпадение C»
таймера/счетчика Tn
TICIEn
Флаг
разрешения
прерывания
по
событию
«Захват»
таймера/счетчика Tn
Форматы регистров, используемых для индикации наступления прерываний от
таймеров/счетчиков, показаны на Рис. 2.5, а описание их битов приведено в Табл. 2.8.
а)
б)
Рис. 2.5. Формат регистров TIFR (а) и ETIFR (б)
Таблица 2.8. Биты регистров TIFR и ETIFR
Название бита
Описание
TOVn
Флаг прерывания по переполнению таймера/счетчика Tn
OCFn
Флаг прерывания по событию «Совпадение» таймера/счетчика Tn
OCFnA
Флаг прерывания по событию «Совпадение A» таймера/счетчика
Tn
OCFnB
OCFnC
ICFn
Флаг прерывания по событию «Совпадение B» таймера/счетчика
Tn
Флаг прерывания по событию «Совпадение C» таймера/счетчика
Tn
Флаг прерывания по событию «Захват» таймера/счетчика Tn
При наступлении какого-либо события соответствующий флаг регистра
TIFR/ETIFR устанавливается в 1. При запуске подпрограммы обработки прерывания он
аппаратно сбрасывается в 0. Любой флаг может быть также сброшен программно,
записью в него лог. 0.
2.4. Предделители таймеров/счетчиков
Блоки предделителей предназначены для формирования тактовых сигналов
таймеров/счетчиков clkT0, clkT1, clkT2, clkT3.
Все таймеры/счетчики, не имеющие асинхронного режима работы, используют
один и тот же 10-битный предделитель. При этом управление тактовым сигналом
каждого таймера/счетчика осуществляется индивидуально.
2.4.1. Управление предделителями
Помимо управления тактовым сигналом таймера/счетчика, все микроконтроллеры
семейства позволяют осуществлять сброс предделителей, а отдельные модели позволяют
также осуществлять их остановку. Для этого используется регистр специальных функций
SFIOR. Формат этого регистра приведен на Рис. 2.6 (биты, не используемые для
управления предделителями таймеров/счетчиков, указаны на рисунке как X).
Рис. 2.6. Управление предделителями таймеров/счетчиков — регистр SFIOR
Для сброса предделителей таймеров/счетчиков используются биты PSRx регистра.
При записи в эти биты лог. 1 предделители соответствующих таймеров/счетчиков
переводятся в исходное состояние. Биты сбрасываются в 0 аппаратно после выполнения
операции сброса. Поскольку, как было сказано выше, один предделитель используется
несколькими таймерами/счетчиками, сброс предделителя повлияет на все
таймеры/счетчики, которые его используют.
Остановка всех предделителей микроконтроллера осуществляется записью лог. 1 в
бит TSM регистра SFIOR. Последующий запуск предделителей осуществляется записью в
бит TSM лог. 0. Указанная функция может использоваться, в частности, для
синхронизации таймеров/счетчиков. После установки бита TSM и битов PSRx
соответствующие
таймеры/счетчики
останавливаются
и
могут
быть
проинициализированы требуемыми значениями. После сброса бита TSM биты PSRx
аппаратно сбрасываются и все таймеры/счетчики начинают работать одновременно.
3. Программирование микроконтроллеров AVR на языке C с использованием
компилятора WinAVR
WinAVR – компилятор, который представляет собой набор инструментальных
средств, предназначенных для программирования RISC-микроконтроллеров семейства
AVR на языке C.
В комплект поставки WinAVR, помимо непосредственно компилятора, входят
программы ProgrammersNotepad и MFile.
3.1. Настойка ProgrammersNotepad
ProgrammersNotepad – это среда для написания программного кода и последующей
его компиляции. Внешние средства компиляции и синтаксического анализа активируются
через меню Tools (рис. 3.1).
Рис. 3.1. Внешний вид программы ProgrammersNotepad
Для того, чтобы добавить в это меню команду для создания файлов, используемых при
эмуляции в среде AVRStudio, необходимо выполнить команду Tools->Options и в
диалоговом окне выбрать категорию параметров Tools (рис. 3.2).
Рис. 3.2. Добавление команды в меню Tools
Для того, чтобы добавить новый элемент в список, необходимо нажать кнопку Add и в
диалоговом окне Edit Tool (рис. 3.3.) установить следующие параметры:
Рис. 3.3. Установка параметров для команды
Name – имя средства, которое будет отображено в меню Tools.
Command – исполняемая команда. В данном случае компиляция и сборка
программы осуществляются с помощью программы make.exe, расположенной в
папке WinAVR\Utils\bin. Параметры компиляции должны находиться в файле
makefile, расположенном в той же директории, в которой находится исходный код
программы.
Folder – папка, в которой будут располагаться выходные файлы. Параметр %d
означается, что выходные файлы будут помещаться в ту же директорию, в которой
находится исходный код.
Parameters – параметры, передаваемые при вызове make.exe. Возможны следующие
значения данного поля:
− all – на выходе генерируются файлы для загрузки в микроконтроллер;
− clean – все выходные файлы удаляются;
− coff – преобразование файлов из формата ELF в формат AVR COFF для
использования в среде AVRStudio 3.x;
− extcoff – преобразованиие файлов из формата ELF в расширенный формат AVR
COFF для использования в среде AVRStudio 4.x и выше;
− program – загрузка HEX-файла в микроконтроллер с помощью специальной
программы avrdude.exe, входящей в пакет WinAVR;
− filename.c – компиляция файла filename.c в ассемблерный код.
Save – параметр, указывающий какие файлы будут автоматически сохраняться при
вызове данного средства.
This tool will modify the current file – это флажок необходимо включить, если
вызываемое средство будет изменять текущий файл. Для программы make.exe
оставить сброшенным.
3.2. Создание исходного кода
Чтобы создать новый файл с исходным кодом на языке С, необходимо выполнить
команду File->New->C/C++. Файл нужно сохранить с расширением .c (расширение
обязательно нужно указывать!).
3.3. Компиляция программы
Перед компиляцией необходимо создать файл makefile. Он должен быть
расположен в той же директории, что и основной код программы.
Для упрощения работы с makefile в комплект WinAVR входит программа MFile и
шаблон makefile. При запуске программы автоматически открывается шаблон makefile.
Этот шаблон необходимо изменить для своей программы и затем сохранить в ту же
директорию, где расположен исходный код программы.
Обязательные поля, которые нужно установить для успешной компиляции
программы:
− имя файла с исходным кодом;
− тип микроконтроллера, для которого будет создаваться прошивка;
− частота тактирования микроконтроллера.
Для ввода имени файла с исходным кодом можно воспользоваться командой
Makefile-> Main file name и в диалоговом окне ввести имя файла без расширения.
Чтобы указать тип микроконтроллера, нужно выполнить команду Makefile->MCU
type и выбрать из списка нужный микроконтроллер.
Частота тактирования задается параметром F_CPU в makefile. Этот параметр надо
найти в тексте makefile и установить в нужное значение.
Описание остальных параметров makefile можно найти в документации на
WinAVR.
3.4. Особенности программирования на языке C для микроконтроллеров AVR
Ввод/вывод символов с помощью функций getchar() и putchar()
Простейшими функциями для ввода и вывода символов на языке С являются
функции getchar() и putchar(). Обе они объявлены в заголовочном файле stdio.h.
Функция getchar() возвращает символ, принятый от приемопередатчика
UART/USART, а функция putchar() выводит символ через UART/USART. В компиляторе
WinAVR getchar() и putchar() предназначены именно для реализации функций
приема/передачи через интерфейс UART/USART.
Директива #include
Синтаксис
#include <имя_файла>
или
#include “имя_файла”
Если имя файла заключено между знаками <>, то этот файл считается частью
стандартной библиотеки, поставляемой вместе с компилятором. Если же имя файла
заключено в двойные кавычки, то считается, что он расположен в папке с исходным
кодом программы.
Обработка прерываний
В среде WinAVR для обработки прерываний используется предустановленная
таблица векторов прерываний, содержащая адреса соответствующих подпрограмм
обработки прерываний с заранее определенными именами. Для каждой такой
подпрограммы в заголовочном файле avr/signal.h определены два макроса: INTERRUPT()
и SIGNAL().
Эти макросы регистрируют и помечают некоторую функцию как обработчик
прерывания. Их различие в том, что макрос INTERRUPT() определяет функцию
обработчика для случая, когда разрешены вложенные прерывания, а SIGNAL() – для
случая, когда вложенные прерывания запрещены. (В общем случае, в AVRмикроконтроллерах вложенные прерывания запрещены. Т.е. при вызове подпрограммы
обработки прерывания флаг I регистра SREG аппаратно сбрасывается и восстанавливает
вновь при выполнении команды RETI. Использование макроса INTERRUPT()
эквивалентно тому, что при написании кода на языке ассемблера подпрограмма обработки
прерывания будет начинаться с установки флага I.)
Например, обработчик прерывания по переполнению от первого таймера-счетчика
будет выглядеть следующим образом:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
INTERRUPT(SIG_OVERFLOW1)
{
.
.
.
}
или
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
SIGNAL(SIG_OVERFLOW1)
{
.
.
.
}
Идентификаторы прерываний для микроконтроллера ATmega128 приведены в
таблице 3.1.
Таблица 3.1. Таблица идентификаторов прерываний WinAVR для микроконтроллера
ATmega128
Источник
Идентификатор WinAVR
INT0
INT1
INT2
INT3
INT4
INT5
INT6
INT7
TIMER2COMP
SIG_INTERRUPT0
SIG_INTERRUPT1
SIG_INTERRUPT2
SIG_INTERRUPT3
SIG_INTERRUPT4
SIG_INTERRUPT5
SIG_INTERRUPT6
SIG_INTERRUPT7
SIG_OUTPUT_COMPARE2
TIMER2 0VF
SIG_OVERFLOW2
TIMER1 САРТ
TIMER1 СОМРА
SIG_INPUT_CAPTURE1
SIG_OUTPUT_COMPARE1A
TIMER1 СОМРВ
SIG_OUTPUT_COMPARE1B
TIMER1 OVF
SIG_OVERFLOW1
TIMER0COMP
SIG_OUTPUT_COMPARE0
TIMER0OVF
SIG_OVERFLOW0
SPI, STC
USARTO, RX
ADC
EE_RDY
ANA_COMP
TIMER1 СОМРС
SIG_SPI
SIG_USART0_RECV
SIG_UART0_RECV
SIG_USART0_DATA
SIG_UART0_DATA
SIG_USART0_TRANS
SIG_UART0_TRANS
SIG_ADC
SIG_EEPROM_READY
SIG_COMPARATOR
SIG_OUTPUT_COMPARE1C
TIMER3CAPT
TIMER3 СОМРА
SIG_INPUT_CAPTURE3
SIG_OUTPUT_COMPARE3A
TIMER3 СОМРВ
SIG_OUTPUT_COMPARE3B
TIMER3 СОМРС
SIG_OUTPUT_COMPARE3C
TIMER3 OVF
SIG_ OVERFLOW3
USART1,RX
SIG_USART1_RECV
SIG_UART1_RECV
SIG_USART1_DATA
SIG_UART1_DATA
USARTO, UDRE
USARTO, TX
USART1,UDRE
Описание
Вектор
Внешнее прерывание 0
Внешнее прерывание 1
Внешнее прерывание 2
Внешнее прерывание 3
Внешнее прерывание 4
Внешнее прерывание 5
Внешнее прерывание 6
Внешнее прерывание 7
Совпадение таймера/счетчика
Т2
Переполнение
таймера/счетчика Т2
Захват таймера/счетчика Т1
Совпадение
А
таймера/счетчика Т1
Совпадение
В
таймера/счетчика Т1
Переполнение
таймера/счетчика Т1
Совпадение таймера/счетчика
ТО
Переполнение
таймера/счетчика ТО
Передача по SPI завершена
USARTO, прием завершен
$0002
$0004
$0006
$0008
$000A
$000C
$000E
$0010
$0012
$0022
$0024
Регистр данных USARTO пуст
$0026
USARTO, передача завершена
$0028
Преобразование АЦП завершено
EEPROM готово
Аналоговый компаратор
Совпадение
С
таймера/счетчика Т1
Захват таймера/счетчика ТЗ
Совпадение
А
таймера/счетчика ТЗ
Совпадение
В
таймера/счетчика ТЗ
Совпадение
С
таймера/счетчика ТЗ
Переполнение
таймера/счетчика ТЗ
USART1, прием завершен
$002A
$002C
$002E
$0030
Регистр данных USART1 пуст
$0014
$0016
$0018
$001A
$001C
$001E
$0020
$0032
$0034
$0036
$0038
$003A
$003C
$003E
USART1,TX
TWI
SPM_RDY
SIG_USART1_TRANS
SIG_UART1_TRANS
SIG_2WIRE_SERIAL
SIG_SPM_READY
USART1, передача завершена
$0040
Прерывание от модуля TWI
Готовность SPM
$0042
$0044