Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа №2 (4 часа)
«Режим CTC работы таймеров-счетчиков. Обслуживание внешних и внутренних прерываний. Программирование на языке C с использованием компилятора WinAVR»
Цель работы
Порядок выполнения работы
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. Самостоятельно реализовать на индикаторной матрице контроллера включение светодиодов по заданному алгоритму:
Для выполнения задания использовать режим работы таймера «Сброс при совпадении».
Теоретические сведения
1. Прерывания в ATMega128
1.1. Общие сведения
Прерывание прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событием микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд PC и загружает в него адрес соответствующего вектора прерывания. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы обработки прерывания должна быть команда RETI, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд.
1.2. Таблица векторов прерываний
Микроконтроллеры AVR семейства Mega имеют многоуровневую систему приоритетных прерываний. Младшие адреса памяти программ, начиная с адреса $0002, отведены под таблицу векторов прерывания. Каждому прерыванию соответствует адрес в этой таблице, который загружается в счетчик команд при возникновении прерывания. Положение вектора в таблице также определяет и приоритет соответствующего прерывания: чем меньше адрес, тем выше приоритет прерывания. Размер вектора прерывания составляет 2 байта. Соответственно, для перехода к подпрограммам обработки прерываний используются команды JMP.
Положение таблицы векторов прерываний может быть изменено. Таблица может располагаться не только в начале памяти программ, но также и в начале области загрузчика, причем перемещение таблицы может быть осуществлено непосредственно в ходе выполнения программы. Для управления размещением таблицы прерываний используется регистр управления микроконтроллера MCUCR, расположенный по адресу $35 ($55).
Распределение адресов таблицы векторов прерываний для микроконтроллера ATmega128 приведено в Табл. 1.1. При размещении векторов прерываний в области загрузчика к значениям, указанным в таблице, следует прибавить значение начального адреса области загрузчика.
Таблица 1.1. Таблица векторов прерываний ATmega128
Источник |
Описание |
M103C=1 |
M103C=0 |
||
№ |
Адрес |
№ |
Адрес |
||
INT0 |
Внешнее прерывание 0 |
1 |
$0002 |
1 |
$0002 |
INT1 |
Внешнее прерывание 1 |
2 |
$0004 |
2 |
$0004 |
INT2 |
Внешнее прерывание 2 |
3 |
$0006 |
3 |
$0006 |
INT3 |
Внешнее прерывание 3 |
4 |
$0008 |
4 |
$0008 |
INT4 |
Внешнее прерывание 4 |
5 |
$000A |
5 |
$000A |
INT5 |
Внешнее прерывание 5 |
6 |
$000C |
6 |
$000C |
INT6 |
Внешнее прерывание 6 |
7 |
$000E |
7 |
$000E |
INT7 |
Внешнее прерывание 7 |
8 |
$0010 |
8 |
$0010 |
TIMER2COMP |
Совпадение таймера/счетчика Т2 |
9 |
$0012 |
9 |
$0012 |
TIMER2 0VF |
Переполнение таймера/счетчика Т2 |
10 |
$0014 |
10 |
$0014 |
TIMER1 САРТ |
Захват таймера/счетчика Т1 |
11 |
$0016 |
11 |
$0016 |
TIMER1 СОМРА |
Совпадение А таймера/счетчика Т1 |
12 |
$0018 |
12 |
$0018 |
TIMER1 СОМРВ |
Совпадение В таймера/счетчика Т1 |
13 |
$001A |
13 |
$001A |
TIMER1 OVF |
Переполнение таймера/счетчика Т1 |
14 |
$001C |
14 |
$001C |
TIMER0COMP |
Совпадение таймера/счетчика ТО |
15 |
$001E |
15 |
$001E |
TIMER0OVF |
Переполнение таймера/счетчика ТО |
16 |
$0020 |
16 |
$0020 |
SPI, STC |
Передача по SPI завершена |
17 |
$0022 |
17 |
$0022 |
USARTO, RX |
USARTO, прием завершен |
18 |
$0024 |
18 |
$0024 |
USARTO, UDRE |
Регистр данных USARTO пуст |
19 |
$0026 |
19 |
$0026 |
USARTO, TX |
USARTO, передача завершена |
20 |
$0028 |
20 |
$0028 |
ADC |
Преобразование АЦП завершено |
21 |
$002A |
21 |
$002A |
EE_RDY |
EEPROM готово |
22 |
$002C |
22 |
$002C |
ANA_COMP |
Аналоговый компаратор |
23 |
$002E |
23 |
$002E |
TIMER1 СОМРС |
Совпадение С таймера/счетчика Т1 |
24 |
$0030 |
- |
- |
TIMER3CAPT |
Захват таймера/счетчика ТЗ |
25 |
$0032 |
- |
- |
TIMER3 СОМРА |
Совпадение А таймера/счетчика ТЗ |
26 |
$0034 |
- |
- |
TIMER3 СОМРВ |
Совпадение В таймера/счетчика ТЗ |
27 |
$0036 |
- |
- |
TIMER3 СОМРС |
Совпадение С таймера/счетчика ТЗ |
28 |
$0038 |
- |
- |
TIMER3 OVF |
Переполнение таймера/счетчика ТЗ |
29 |
$003A |
- |
- |
USART1,RX |
USART1, прием завершен |
30 |
$003C |
- |
- |
USART1,UDRE |
Регистр данных USART1 пуст |
31 |
$003E |
- |
- |
USART1,TX |
USART1, передача завершена |
32 |
$0040 |
- |
- |
TWI |
Прерывание от модуля TWI |
33 |
$0042 |
- |
- |
SPM_RDY |
Готовность SPM |
34 |
$0044 |
- |
- |
Если прерывания в работе микроконтроллера не предусматриваются, то на месте таблицы векторов прерываний может быть размещена часть основной программы.
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х при наступлении события «Совпадение». Влияние содержимого этих битов на состояние вывода зависит от режима работы таймера/счетчика |
СОМnВ1:СОМnВ0 |
|
СОМnС1:СОМnС0 |
|
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 |
Принудительное изменение состояния вывода ОСnх. При записи в бит ОСnх1 лог. 1 состояние вывода ОСnх изменяется в соответствии с установками битов СОМn1х СОМn0х регистра TCCRnA Прерывание при этом не генерируется и сброс таймера (в режиме СТС) не производится. Эта функция доступна только в тех режимах, которые не используются для генерации сигнала с ШИМ При чтении бита всегда возвращается 0 |
6 |
FOCnB |
|
5 |
FOCnC |
|
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 и ТЗ
№ |
WGMn3 |
WGMn2 |
WGMn1 |
WGMn0 |
Режим работы таймера/счетчика Тn |
Модуль счета (TOP) |
Обновление регистров OCRnx |
Момент установки флага TOVn |
0 |
0 |
0 |
0 |
0 |
Normal |
$FFFF |
Немедленно |
$FFFF |
1 |
0 |
0 |
0 |
1 |
Phase correct PWM, 8-битный |
$00FF |
При TOP |
$0000 |
2 |
0 |
0 |
1 |
0 |
Phase correct PWM, 9-битный |
$01FF |
При TOP |
$0000 |
3 |
0 |
0 |
1 |
1 |
Phase correct PWM, 10-битный |
$03FF |
При TOP |
$0000 |
4 |
0 |
1 |
0 |
0 |
CTC (сброс при совпадении) |
OCRnA |
Немедленно |
$FFFF |
5 |
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 Correct PWM |
ICRn |
$0000 |
$0000 |
9 |
1 |
0 |
0 |
1 |
Phase and Frequency Correct PWM |
OCRnA |
$0000 |
$0000 |
10 |
1 |
0 |
1 |
0 |
Phase correct PWM |
ICRn |
При TOP |
$0000 |
11 |
1 |
0 |
1 |
1 |
Phase correct PWM |
OCRnA |
При TOP |
$0000 |
12 |
1 |
1 |
0 |
0 |
CTC (сброс при совпадении) |
ICRn |
Немедленно |
$FFFF |
13 |
1 |
1 |
0 |
1 |
Зарезервировано |
- |
- |
- |
14 |
1 |
1 |
1 |
0 |
Fast PWM |
ICRn |
При TOP |
При ТОР |
15 |
1 |
1 |
1 |
1 |
Fast PWM |
OCRnA |
При TOP |
При ТОР |
Примечание, n = 1,3.
Режим СТС (сброс при совпадении)
В этом режиме счетный регистр тоже функционирует как обычный суммирующий счетчик, инкрементирование которого осуществляется по каждому импульсу тактового сигнала 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 |
Флаг прерывания по событию «Совпадение B» таймера/счетчика Tn |
OCFnC |
Флаг прерывания по событию «Совпадение C» таймера/счетчика Tn |
ICFn |
Флаг прерывания по событию «Захват» таймера/счетчика 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. Установка параметров для команды
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 |
SIG_INTERRUPT0 |
Внешнее прерывание 0 |
$0002 |
INT1 |
SIG_INTERRUPT1 |
Внешнее прерывание 1 |
$0004 |
INT2 |
SIG_INTERRUPT2 |
Внешнее прерывание 2 |
$0006 |
INT3 |
SIG_INTERRUPT3 |
Внешнее прерывание 3 |
$0008 |
INT4 |
SIG_INTERRUPT4 |
Внешнее прерывание 4 |
$000A |
INT5 |
SIG_INTERRUPT5 |
Внешнее прерывание 5 |
$000C |
INT6 |
SIG_INTERRUPT6 |
Внешнее прерывание 6 |
$000E |
INT7 |
SIG_INTERRUPT7 |
Внешнее прерывание 7 |
$0010 |
TIMER2COMP |
SIG_OUTPUT_COMPARE2 |
Совпадение таймера/счетчика Т2 |
$0012 |
TIMER2 0VF |
SIG_OVERFLOW2 |
Переполнение таймера/счетчика Т2 |
$0014 |
TIMER1 САРТ |
SIG_INPUT_CAPTURE1 |
Захват таймера/счетчика Т1 |
$0016 |
TIMER1 СОМРА |
SIG_OUTPUT_COMPARE1A |
Совпадение А таймера/счетчика Т1 |
$0018 |
TIMER1 СОМРВ |
SIG_OUTPUT_COMPARE1B |
Совпадение В таймера/счетчика Т1 |
$001A |
TIMER1 OVF |
SIG_OVERFLOW1 |
Переполнение таймера/счетчика Т1 |
$001C |
TIMER0COMP |
SIG_OUTPUT_COMPARE0 |
Совпадение таймера/счетчика ТО |
$001E |
TIMER0OVF |
SIG_OVERFLOW0 |
Переполнение таймера/счетчика ТО |
$0020 |
SPI, STC |
SIG_SPI |
Передача по SPI завершена |
$0022 |
USARTO, RX |
SIG_USART0_RECV SIG_UART0_RECV |
USARTO, прием завершен |
$0024 |
USARTO, UDRE |
SIG_USART0_DATA SIG_UART0_DATA |
Регистр данных USARTO пуст |
$0026 |
USARTO, TX |
SIG_USART0_TRANS SIG_UART0_TRANS |
USARTO, передача завершена |
$0028 |
ADC |
SIG_ADC |
Преобразование АЦП завершено |
$002A |
EE_RDY |
SIG_EEPROM_READY |
EEPROM готово |
$002C |
ANA_COMP |
SIG_COMPARATOR |
Аналоговый компаратор |
$002E |
TIMER1 СОМРС |
SIG_OUTPUT_COMPARE1C |
Совпадение С таймера/счетчика Т1 |
$0030 |
TIMER3CAPT |
SIG_INPUT_CAPTURE3 |
Захват таймера/счетчика ТЗ |
$0032 |
TIMER3 СОМРА |
SIG_OUTPUT_COMPARE3A |
Совпадение А таймера/счетчика ТЗ |
$0034 |
TIMER3 СОМРВ |
SIG_OUTPUT_COMPARE3B |
Совпадение В таймера/счетчика ТЗ |
$0036 |
TIMER3 СОМРС |
SIG_OUTPUT_COMPARE3C |
Совпадение С таймера/счетчика ТЗ |
$0038 |
TIMER3 OVF |
SIG_ OVERFLOW3 |
Переполнение таймера/счетчика ТЗ |
$003A |
USART1,RX |
SIG_USART1_RECV SIG_UART1_RECV |
USART1, прием завершен |
$003C |
USART1,UDRE |
SIG_USART1_DATA SIG_UART1_DATA |
Регистр данных USART1 пуст |
$003E |
USART1,TX |
SIG_USART1_TRANS SIG_UART1_TRANS |
USART1, передача завершена |
$0040 |
TWI |
SIG_2WIRE_SERIAL |
Прерывание от модуля TWI |
$0042 |
SPM_RDY |
SIG_SPM_READY |
Готовность SPM |
$0044 |