- •Программирование мк семейства at в среде avr Studio методические указания
- •Цель работы – ознакомиться с интерфейсом интегрированной среды разработки avr Studio, изучить устройство и систему команд микроконтроллеров Atmel серии aTmega. Теоретические сведения
- •1. Структура мк семейства aTmega 162
- •2. Интегрированная среда разработки avr Studio
- •Предварительное задание
- •Рабочее задание
- •Контрольные вопросы
- •Приложение Система команд микроконтроллера aTmega
- •1 Группа команд логических операций
- •2 Группа команд арифметических операций
- •3 Группа команд операций с битами
- •4 Группа команд пересылки данных
- •5 Группа команд передачи управления
- •6 Группа команд управления системой
- •Библиографический список
- •Содержание
- •394026 Воронеж, Московский просп., 14
Предварительное задание
Изучите приведенные выше сведения об интегрированной среде разработки AVR Studio. В случае надобности используйте материалы /3/.
Проанализируйте приведенный ниже пример 1, называя вслух каждую из директив и команд согласно приложению.
/*********************************************************/
/* УПРАВЛЕНИЕ СВЕТОДИОДОМ */
/*********************************************************/
/*Служебная инициализация*/
.include "m162def.inc" //подключение внешних библиотек
.macro outi //определение макроса, необходимого
ldi R16,@1 // для упрощения записи команд
out @0,R16
.endmacro
.cseg // настроить размещение в памяти программ:
.org 0x0000 // в нулевую ячейку - команду перехода на _rst
rjmp _rst // при пуске или для перезапуска
.org 0x003A // установить программный счётчик равным 0x003A,
// чтобы не попасть на область векторов прер.
// данной модели МК (до $44 для m128)
_rst:
outi SPL,low(RAMEND) //инициализация стека,
outi SPH,High(RAMEND) //определение его вершины
//по данным библиотеки
rjmp _start //переход в начало программы
/*Основная программа*/
_start:
ldi r16,0x01 //установка параметров порта B
out ddrb,r16 //(линия 0 работает как выход)
_m0: //установка линии 0 порта В
sbi portb,0 //в лог.1
cbi portb,0 //сброс В.0 в лог.0
rjmp _m0 //переход на метку _m0
На примере строки outi SPL, low(RAMEND) отобразите графически свертывание последовательности команд в макрокоманду outi по схеме:
outi <куда>,<что> // определение макрокоманды,
↓ ↓
@0 @1 // соответствующей паре команд,
ldi R16,@1
out @0,R16 //
опишите назначение этой последовательности.
Составьте структурную схему для примера 1, отобразив только логические связи модулей, начинающихся с каждой из меток (_х, где х – любой набор символов). Оформите схему алгоритма по аналогии с алгоритмами из вашего отчета по /2/.
Повторите сведения о таймерах МК и их регистрах, изложенные в /2/. В случае надобности используйте материалы /5-9/, файлы учебного курса и лекции.
Приведенная в первом примере программа позволяет, например, управлять светодиодом, подключенным через токозадающий резистор к изучаемому разряду порта. Однако результат работы программы будет виден только в режиме пошаговой отладки. В режиме реального времени светодиод будет переключаться с частотой, близкой к тактовой частоте микроконтроллера 1МГц (период повторения определяется длиной петли _m0), поэтому будет казаться, что светодиод горит постоянно. Следовательно, необходимо разместить в коде программы некоторую задержку, которую корректнее всего реализовать с помощью таймера/счетчика. Его использование было рассмотрено в /2/. Проанализируйте пример 2, приведенный ниже. В данном примере применен 16-разрядный таймер/счетчик Т/С1. При инициализации программы в счетный регистр TCNT1 этого таймера заносится значение (65535 – n), где n – количество тактов, которое нужно «досчитать» до переполнения Т/С1. Как только счетный регистр таймера достигает своего максимального значения, происходит переполнение таймера и возникает соответствующее прерывание. В подпрограмме обработки данного прерывания значение нулевой линии порта В меняется на противоположное, а также происходит запись в счетный регистр TCNT1 первоначального значения. Таким образом достигается необходимая задержка времени. Исходный код программы (пример 2) приведен ниже.
/*********************************************************/
/* УПРАВЛЕНИЕ СВЕТОДИОДОМ v2 */
/*********************************************************/
/*Служебная инициализация*/
.include "m162def.inc" //подключение внешних библиотек
.cseg //размещение программ в памяти
.org 0x0000
rjmp _rst //по адресу 0 – переход на _rst
.org ovf1addr //безусловный переход при переполнении Т/С1:
rjmp _timer1ov //в ячейке ovf1addr (адрес задан в биб-ке)
// указан переход на метку _timer1ov
.org 0x0048
_rst:
.macro outi //определение макроса, необходимого
ldi R16,@1 //для обозначения границ стека
out @0,R16
.endmacro
outi SPL,low(RAMEND) //инициализация стека,
outi SPH,High(RAMEND) //определение его вершины
rjmp _start //переход в начало программы
/*Обработчик прерывания по таймеру*/
_timer1ov:
cli //временный запрет всех прерываний
ldi r16, high(65535-3906) //загрузка в счетный
out tcnt1h,r16 // регистр Т/C1 начального
ldi r16, low(65535-3906) // значения, соответствую-
out tcnt1l,r16 //щего периоду переполнения Т/С1 1/256 с
sbic portb,0 //пропуск следующей инструкции,
//если portb.0=0
rjmp _m0 //безусловный переход на метку _m0
sbis portb,0 //пропуск следующей инструкции,
//если portb.0=1
sbi portb,0 //установка portb.0
rjmp _end0 //безусловный переход на метку
// _end0
_m0: cbi portb,0 //сброс portb.0
_end0:
sei //разрешение всех прерываний
reti //выход из процедуры обработки
//прерывания
/*Основная программа*/
_start:
ldi r16,0x01 //установка параметров порта B
out ddrb,r16 //(мл. бит работает как выход)
ldi r16, 1<<toie1 //разреш. прер. по перепол. Т/С11
out timsk,r16 //(установка маски прерываний)
sei //разрешение всех прерываний
ldi r16,high(65535-3906) //загрузка в 16-ти битный
out tcnt1h,r16 //регистр Т/C1 начального
ldi r16,low(65535-3906) //значения, соотв. периоду
out tcnt1l,r16 //переполнения Т/С1 1/256 с
ldi r16,0x01 //запуск Т/С1 и установка
out tccr1b,r16 //предделителя частоты
_w0: rjmp _w0 //ожидание переполнения Т/С1
Составьте структурную схему этой программы, отобразив только логические связи модулей, начинающихся с каждой из меток. Оформите схему алгоритма по аналогии с алгоритмами из вашего отчета по лабораторной работе № 15 /2/ (бегущая единица по разрядам порта B).
Изучите рабочее задание и подготовьтесь к его выполнению.