Лабораторная работа №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
© Copyright 2022 DropDoc