
- •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 |
Дан массив А из 8 однобайтовых чисел, содержащий число 0хА1. Необходимо найти сумму всех чисел массива А, находящихся до этого числа. Результат вывести на панель светодиодов. |
2 |
Дан массив А из 8 однобайтовых чисел. Определить, содержит ли массив код 0хАС и, если содержит, то вывести на панель светодиодов количество таких чисел в массиве. |
3 |
Дан массив А из 10 однобайтовых чисел. Переписать его в массив В, упорядочив числа по возрастанию. |
4 |
Дан массив А из 10 однобайтовых чисел. Переписать в массив В только числа, содержащие четное количество единиц. |
5 |
Зашифровать содержащиеся в массиве А коды 10 цифр по следующему правилу: а) циклический сдвиг влево на 5 разрядов и побитовая инверсия; б) прибавить константу 2 и циклический сдвиг вправо на 3 разряда. |
6 |
Дан массив А из 5 однобайтовых чисел. Определить, содержит ли он число 0х1F. Если да, то выполнить операцию «логическое И» над всеми числами массива А. |
7 |
Дан массив А из 10 однобайтовых чисел. Переписать в массив В все числа, большие 0х20, и записать в регистр R16 количество таких чисел. |
8 |
Дан массив А из 10 однобайтовых чисел. Переписать в массив В все числа, лежащие в диапазоне 0х0F – 0хF0 (или др.). Вывести на индикатор количество таких чисел. |
9 |
Дан массив А из 8 двухбайтовых кодов. Определить, содержит ли он код 0хАFВС. Если содержит, то в вывести на панель светодиодов количество таких чисел в массиве. |
10 |
Дан массив А из 10 однобайтовых чисел. Переписать его в массив В, упорядочив числа по убыванию. |
11 |
Дан массив А из 10 однобайтовых чисел. Переписать в массив В только числа, содержащие нечетное количество нулей. |
12 |
Дан массив А из 10 однобайтовых чисел. Переписать в массив В все числа, лежащие в диапазоне 0х00 – 0хF0. Вывести на панель светодиодов сумму таких чисел. |
Контрольные вопросы:
Организация памяти AVR AtMega16.
Какая команда используется для чтения памяти программ?
Как задать таблицу данных в программной памяти?
Как загрузить в регистр Z адрес начала таблицы данных?
Типы косвенной адресации данных. Где хранятся адреса операндов?
Система прерываний AtMega16. Таймер/счетчик
Освоение алгоритмов обслуживания прерываний микроконтроллера AtMega16, формирование навыков программирования счетчиков.
Введение
Прерывания в микроконтроллерах AVR служат для обработки внешних и внутренних событий. Самое первое, что происходит в случае сброса или включения микроконтроллера, – обработка прерывания RESET. Это прерывание нельзя запретить в отличие от остальных командой CLI (очистки флага I в регистре SREG). При сбросе все I/O регистры устанавливаются в их начальные значения и программа начинает выполнение с адреса $000. По этому адресу должна быть расположена инструкция RJMP (относительный переход) на процедуру обработки сброса. Эта процедура фактически может являться главным блоком программы. Если программа не использует прерывания и вектора прерываний не задействованы, то по адресу $000 может располагаться любая команда основной программы. Приведем эти варианты в таблице 1.
Таблица 1
Если прерывания не задействованы |
Если прерывания задействованы |
.CSEG .ORG 0 LDI r16,0xAA ;код программы
|
.CSEG ;начало сегмента программы .ORG 0 ;адрес $000 кода RJMP reset;обработка reset .ORG 2 ;адрес $002(вектор EXT0INT) RJMP ext0irq; Обработка ;внешнего прерывания 0 ext0irq: … ;команды обработки прерывания reti
reset: LDI r16, 0xAA ; код программы |
Помимо общего запрета (командой CLI) и разрешения (командой SEI) прерываний, необходимо разрешать каждое прерывание по отдельности.
ВАЖНО: Во время вызова обработчиков прерываний и процедур адрес возврата программного счетчика (откуда дальше продолжать программу) сохраняется в стеке. Стек в микроконтроллерах организован программно, поэтому все программы, использующие прерывания и процедуры, должны инициализировать стек при начале работы!
Делается это следующим образом:
ldi temp, low(RAMEND) ; Берем младший байт адреса RAMEND
out SPL, temp ;Записываем в младший байт указателя стека
ldi temp, high(RAMEND) ; Старший байт адреса
out SPH, temp ;в старший байт указателя стека
Микроконтроллер может обрабатывать следующие прерывания (см. табл.2).
Таблица 2
Источники и вектора прерываний микроконтроллера AtMega16
Адрес вектора |
Метка, определенная в M16def.inc (через .EQU) |
Описание прерывания
|
$000 |
|
Reset |
$002 |
INT0addr |
Внешнее прерывание 0 (вывод 16 = PortD 2) |
$004 |
INT1addr |
Внешнее прерывание 1 (вывод 17 = PortD 3) |
$006 |
OC2addr |
Совпадение с константой таймера/счётчика 2 |
$008 |
OVF2addr |
Переполнение таймера/счётчика 2 |
$00A |
ICP1addr |
Захват таймера/счётчика 1 |
$00C |
OC1Aaddr |
Совпадение с константой A таймера/счётчика 1 |
$00E |
OC1Baddr |
Совпадение с константой B таймера/счётчика 1 |
$010 |
OVF1addr |
Переполнение таймера/счётчика 1 |
$012 |
OVF0addr |
Переполнение таймера/счётчика 0 |
$014 |
SPIaddr |
Прерывание от SPI |
$016 |
URXCaddr |
Прерывание от UART: приём данных окончен |
$018 |
UDREaddr |
Прерывание от UART: регистр данных пуст |
$01A |
UTXCaddr |
Прерывание от UART: передача данных завершена |
$01C |
ADCCaddr |
Прерывание от ADC: преобразование закончено |
$01E |
ERDYaddr |
Прерывание от EEPROM: готовность |
$020 |
ACIaddr |
Прерывание от аналогового компаратора |
$022 |
TWIaddr |
Прерывание от двухпроводного посл.интерфейса |
$024 |
INT2addr |
Внешнее прерывание 2 (вывод 3 = PortB 2) |
$026 |
OC0addr |
Совпадение с константой таймера/счетчика 0 |
$028 |
SPMRaddr |
Прерывание от программной памяти: загрузка окончена |
Для настройки микроконтроллера на использование прерываний необходимо произвести инициализацию регистров соответствующими значениями (описания регистров – в электронном учебники на сайте dfe.karelia.ru).
-
Вид прерывания
Регистры
External Interrupt
MCUCR, MCUCSR, GICR
Timer/Counter Interrupts
TIMSK
Также не забывайте: чтобы прерывание от какого-либо модуля работало, должен работать сам модуль.