
- •6.050702 «Електромеханвка»,
- •Создание нового проекта
- •Организация памяти
- •Сведения о портах ввода/вывода
- •Команды языка Assembler, необходимые для выполнения заданий
- •Контрольные вопросы
- •Описание stk500
- •Порядок выполнения работы
- •Индивидуальные задания
- •Контрольные вопросы
- •Организация памяти мк AtMega16
- •Введение
- •Команды работы с памятью
- •Индивидуальные задания
- •Контрольные вопросы:
- •Система прерываний AtMega16. Таймер/счетчик
- •Введение
- •Индивидуальные задания
- •Индивидуальные задания
- •Контрольные вопросы
- •Управление скоростью «бега» огонька по светодиодной панели микроконтроллера AtMega16
- •Порядок выполнения работы
- •Варианты заданий для студентов
- •Контрольные вопросы
- •Основы работы в среде разработки CodeVisionAvr. Широтно-импульсная модуляция (шим) микроконтроллера AtMega16
- •Введение
- •Среда разработки CodeVisionAvr. Пример генерации начального кода программы
- •Пример программы с комментариями
- •Индивидуальные задания
- •Usart: универсальный синхронный и асинхронный последовательный приемопередатчик микроконтроллера AtMega16
- •1. Введение
- •Генерация внутренней синхронизации – генератор скорости связи
- •Работа с удвоением скорости связи (u2x)
- •Режим синхронной связи
- •Форматы посылки
- •1.1.5 Бит паритета
- •1.1.6. Инициализация усапп
- •1.1.9. Передача данных
- •1.1.10. Передача посылок с 5…8 битами данных
- •1.2. Конфигурирование Atmega16
- •1.2.1. Конфигурирование порта d
- •1.2.2. Описание регистров усапп
- •1.3. Генерация начального кода программы в среде разработки CodeVisionAvr
- •1.4. Работа с терминалом
- •1.5. Описание и листинг программы
- •Контрольные вопросы:
Индивидуальные задания
Вариант |
Текст задания |
1 |
Разработать программу, которая, используя прерывание от счетчика 0, увеличивает значение какого-либо регистра на 1 каждую секунду и выводит значение на панель светодиодов. Вектор прерывания: OC0addr |
2 |
Разработать программу, которая увеличивает значение какого-либо регистра по переполнению счетчика 1 и выводит результат на панель светодиодов. Вектор прерывания: OVF1addr |
3 |
Разработать программу, которая, используя прерывание от счетчика 1, увеличивает значение какого-либо регистра на 1 каждую секунду и выводит значение на панель светодиодов. Вектор прерывания: OC1Aaddr/ OC1Baddr |
4 |
Разработать программу, которая увеличивает значение какого-либо регистра по переполнению счетчика 0 и выводит результат на панель светодиодов. Вектор прерывания: OVF0addr |
5 |
Разработать программу, которая увеличивает значение какого-либо регистра по прерыванию INT0, которое инициируется спадающим фронтом сигнала, и выводит результат на панель светодиодов. Вектор прерывания: INT0addr |
6 |
Разработать программу, которая увеличивает значение какого-либо регистра по прерыванию INT1, которое инициируется спадающим фронтом сигнала, и выводит результат на панель светодиодов. Вектор прерывания: INT1addr |
7 |
Разработать программу, которая увеличивает значение какого-либо регистра по прерыванию INT0, которое инициируется нарастающим фронтом сигнала, и выводит результат на панель светодиодов. Вектор прерывания: INT0addr |
8 |
Разработать программу, которая увеличивает значение какого-либо регистра по прерыванию INT1, которое инициируется нарастающим фронтом сигнала, и выводит результат на панель светодиодов. Вектор прерывания: INT1addr |
9 |
Разработать программу, которая увеличивает значение какого-либо регистра по переполнению счетчика 2 и выводит результат на панель светодиодов. Вектор прерывания: OVF2addr |
10 |
Разработать программу, которая, используя прерывание от счетчика 2, увеличивает значение какого-либо регистра на 1 каждую секунду и выводит значение на панель светодиодов. Вектор прерывания: OC2addr |
11 |
Разработать программу, которая увеличивает значение какого-либо регистра по прерыванию INT2, которое инициируется спадающим фронтом сигнала, и выводит результат на панель светодиодов. Вектор прерывания: INT2addr |
12 |
Разработать программу, которая увеличивает значение какого-либо регистра по прерыванию INT2, которое инициируется нарастающим фронтом сигнала, и выводит результат на панель светодиодов. Вектор прерывания: INT2addr |
Микроконтроллер в стенде STK 500 работает на частоте 3.68 MHz.
Контрольные вопросы:
Алгоритм обслуживания прерываний.
Тип стека и особенности его организации.
Как разрешить (запретить) обработку маскируемых прерываний?
Какие регистры МК необходимо инициализировать для обслуживания прерываний?
Программные средства для передачи управления в подпрограмму обработки прерывания.
Система прерываний AtMega16.
Аналого-цифровой преобразователь
Освоение алгоритмов обслуживания прерываний микроконтроллера AtMega16, формирование навыков программирования АЦП.
Введение
ATMega16 содержит 10-битовый АЦП (рис. 1), вход которого может быть соединен с одним из восьми выводов Port A. АЦП AtMega16 нужно опорное напряжение для сравнения с входным (если измеряемое равно опорному, то получаем максимальный код в двоичном виде). Опорное напряжение подается на вывод ADRef, или может использоваться внутренний генератор с фиксированным напряжением 2,65 В.
Рис. 1. Структурная схема модуля АЦП
АЦП включается установкой бита ADEN в регистре ADCSR. После преобразования 10-битовый результат оказывается в 8-битовых регистрах ADCL и ADCH. По умолчанию младший бит результата находится справа (то есть в bit 0 регистра ADCL, так называемое правое ориентирование). Но порядок следования битов на левое ориентирование можно сменить, установив бит ADLAR в регистре ADMUX. Это удобно, если требуется получить 8-битовый результат. В таком случае требуется прочитать только регистр ADCH. В противном случае нужно сначала прочитать регистр ADCL, а потом ADCH чтобы быть уверенным в том, что чтение этих двух регистров относится к результату одного преобразования.
Одиночное преобразование может быть вызвано записью бита ADSC в регистр ADCSR. Этот бит остается установленным все время, занимаемое преобразованием. Когда преобразование закончено, бит автоматически устанавливается в 0. Можно также начинать преобразования по событиям из разных источников. Модуль АЦП также может работать в режиме «свободного полета». В таком случае АЦП постоянно производит преобразование и обновляет регистры ADCH и ADCL новыми значениями.
Для выполнения преобразования модулю АЦП необходима тактовая частота. Чем выше эта частота, тем быстрее будет происходить преобразование (оно обычно занимает 13 тактов, первое преобразование занимает 25 тактов). Но чем выше частота (и выше скорость преобразования), тем менее точным получается результат. Для получения максимально точного результата модуль АЦП должен тактироваться частотой в пределах от 50 до 200 КГц. Если необходим результат с точностью менее 10 бит, то можно использовать частоту больше 200 КГц. Модуль АЦП содержит делитель частоты, чтобы получать нужную тактовую частоту для преобразования из частоты процессора.
Рис.2 Регистр ADMUX
Регистр ADMUX (рис.2) задает входной контакт порта A для подключения АЦП, ориентирование результата и выбор опорного напряжения. Если установлен бит ADLAR, то результат левоориентирован. Опорное напряжение от внутреннего генератора задается выставленными в 1 битами REFS1 и REFS0. Если оба бита сброшены, то опорное напряжение берется от контакта AREF. В случае если REFS1=0, а REFS0=1, опорное напряжение берется от AVCC с внешним конденсатором, подключенным к AREF. Выбор контакта (рис.3) ввода выполняется следующим образом:
Рис.3. Выбор аналогового входа
Регистр контроля и статуса АЦП ADCSR представлен на рис.5:
Рис.5. Регистр контроля и статуса ADCSR
Бит ADEN=1 включает модуль АЦП.
Запись единицы в ADSC запускает цикл преобразования. В режиме «свободного полета» (бит ADATE=1) запись единицы запускает первое преобразование, последующие запускаются автоматически.
ADIF – флаг прерывания АЦП. Этот бит устанавливается в 1, когда АЦП завершено преобразование и в регистрах ADCL и ADCH находятся актуальные данные. Этот флаг устанавливается даже в том случае, если прерывания запрещены. Это необходимо для случая программного опроса АЦП. Если используются прерывания, то флаг сбрасывается автоматически. Если используется программный опрос, то флаг может быть сброшен записью лог.1 в этот бит.
ADIE – если в этом бите установлена единица, и прерывания разрешены глобально, то при окончании преобразования будет выполнен переход по вектору прерывания от АЦП.
Биты ADPS2, ADPS1, ADPS0 задают коэффициенты предделителя частоты.
Более подробная информация о программировании АЦП представлена в электронном учебнике на сайте dfe.karelia.ru. Не забывайте, чтобы прерывание от какого-либо модуля работало, должен быть инициализирован сам модуль.