Цель работы. Целью лабораторной работы является отладка прикладных программ для микроконтроллера AVR семейства Mega с помощью персонального компьютера и программных средств отладки.
1. Получив у преподавателя номер варианта (от N=1 до N=9), загрузить для отладки программу преобразования двоично-десятичного кода числа (байт) в двоичный (программа decbin_to_bin).
;****** Программа decbin_to_bin | |||
mov | r17,r16 | ; Исходное двоично-десятичное число | |
; хранится в r16 | |||
andi | r17,0xF0 | ; Выделение старшей тетрады (десятков) | |
swap | r17 | ; | |
ldi | r18,10 | ; Умножение десятков на десять | |
mul | r17,r18 | ; | |
mov | r17,r16 | ; Выделение младшей тетрады (единиц) | |
andi | r17,0x0F | ; | |
add | r17,r0 | ; Сложение результатов. Результат остаётся в r17 |
Перед выполнением программы необходимо в окне "Workspace" загрузить в регистр r16 число 10N+N в двоично-десятичном виде, которое подвергнется преобразованию.
При выполнении программы число копируется в регистр r17, там на него накладывается маска 0b11110000 при помощи команды логического умножения (andi), которая выделяет десятки десятичного кода. После этого результат перемещается в младшую тетраду и умножается на 10. Результат умножения сохраняется в регистровой паре r1:r0. Т.к. наше число не может быть больше 99, то оно целиком поместится в младший байт результата, т.е. в r0. После этого повторно загружаем исходное число в r17, ещё раз накладываем маску, только на этот раз для выделения младшей тетрады, и суммируем результат с содержимым регистра r0, в котором хранились десятки. Конечный результат будет представлен в регистре r17.
Проследите процесс выполнения программы в пошаговом и автоматическом режиме. Поясните содержимое строк окна "Disassembler".
Внести ошибки в программу (неверная мнемоника команды, неверный операнд и т.п.) и проследить сообщения ассемблера при этом в окне View Output.
Модифицировать программу в соответствии со своим вариантом индивидуального задания:
2. Загрузить для отладки программу определения максимального элемента массива 8-разрядных чисел SRAM (программа max_el_mass).
Перед выполнением программы необходимо заполнить область памяти данных случайными числами, начиная с адреса 0x60. Количество элементов определяется числом, загружаемым в начале программы в r18.
Для обращения к памяти с адресом более 8 разрядов программа использует специально для этого предназначенный Z-регистр. Он состоит из пары регистров r31:r30. В начале выполнения программа копирует первый элемент массива в r16, а адрес этого элемента в Х (регистровая пара r27:r26). После этого каждый элемент сравнивается со значением в r16, и в том случае, если элемент окажется больше содержимого r16, то он замещает собой предыдущее значение в r16, а также адрес нового наибольшего элемента копируется в пару Х. Каждый раз при сравнении, из количества элементов вычитается единица. Как только содержимое r18 станет равным 0, выполнение программы можно прекращать в связи с перебором всех элементов. В итоге получим наибольший элемент в r16, его адрес в Х.
;****** Программа max_el_mass | ||
ldi r30,low($100) | ;Загрузка в регистр Z начального адреса | |
ldi r31,high($100) | ;массива чисел | |
ldi r18,12 | ;Загрузка количества элементов массива | |
ld r16,z | ;Загрузка в регистр r16 первого элемента массива | |
mov r26,r30 | ;Загрузка в X адреса первого элемента | |
mov r27,r31 | ||
dec r18 | ||
m1: | inc r30 | ;Увеличение Z на единицу для загрузки |
; следующего элемента | ||
ld r17,z | ;Загрузка элемента для сравнения | |
cp r16,r17 | ;Сравнение максимального (или первого) элемента | |
;с только что загруженным | ||
brsh m2 | ||
mov r16,r17 | ;его перезапись в r16 в случае, если больше | |
mov r26,r30 | ;и сохранение адреса в X | |
mov r27,r31 | ||
m2: | dec r18 | ;Уменьшение счётчика количества элементов |
brbc 1,m1 | ;Если не все элементы перебраны, переход на m1 | |
m3: | jmp m3 | ;Зацикливание по завершении |
Модифицировать программу в соответствии со своим вариантом индивидуального задания:
3. Набрать и отладить прикладную программу fairy, позволяющую получить эффект бегущей 1 на линиях порта.
;****** Программа fairy | ||
.INCLUDE "C:\Program Files\Atmel\AVR | ||
Tools\AvrAssembler\Appnotes\m8def.inc" | ||
; Подключение файла определения адресов | ||
ldi | r16,0xFF | |
out | DDRB,r16 | |
sec | ||
clr | r16 | |
m1: | rol | r16 |
out | PORTB,r16 | |
rjmp | m1 |
Ввести код программы в отладчик AVRStudio и проверить ее работу в пошаговом режиме. Проследить изменения, происходящие в регистрах SREG, PORTВ и PINВ по мере выполнения программы. Для чего в регистр DDRВ заносится 0xFF? Чем отличается команда rol от команд lsl и asr?
Дополните программу подпрограммой задержки "Delay" таким образом, чтобы содержимое r17 определяло длительность паузы между сменой состояния на выводах порта.
Примечание: для вызова подпрограммы необходимо активировать стек, что происходит автоматически при указании его начала в паре регистров sph:spl .
Модифицировать программу в соответствии со своим вариантом индивидуального задания и произвести ее отладку:
4. Напишите программу, которая бы считывала число в двоично-десятичном коде с контактов порта В, преобразовывала его в двоичную форму и передавала в порт D.
Примечание: для установки числа на входе порта необходимо после нажатия кнопки "Start Debugging" при помощи мыши установить единичные уровни в нужных разрядах PINB.
5. Составить комментарии к программе Timer_interrupt.
;****** Программа Timer_interrupt | ||
; Подключение файла определения адресов регистров ввода-вывода | ||
.INCLUDE "C:\Program Files\Atmel\AVR | ||
Tools\AvrAssembler\Appnotes\m8def.inc" | ||
.org 0 | ||
jmp | $0030 | |
.org $0030 | ||
ldi | r16,0x80 | |
out | SREG,r16 | |
ldi | r16,high (RAMEND) | |
out | SPH,r16 | |
ldi | r16,low (RAMEND) | |
out | SPL,r16 | |
ldi | r16,0x04 | |
out | TIMSK,r16 | |
ldi | r16,0xFF | |
out | TCNT1H,r16 | |
ldi | r16,0xF0 | |
out | TCNT1L,r16 | |
ldi | r16,0x02 | |
out | TCCR1B,r16 | |
m1: | rjmp | m1 |
.org ovf1addr | ||
ldi | r16,0xFF | |
out | TCNT1H,r16 | |
ldi | r16,0xF0 | |
out | TCNT1L,r16 | |
reti |
Ввести код программы в отладчик AVRStudio и проверить ее работу в пошаговом режиме. Объяснить данные, вводимые в регистры. Как можно изменить частоту переполнения счётчика?
6. Загрузить для отладки программу генерации сигнала заданной частоты (программа Generator).
;****** Программа Generator | |||
; Генератор импульсов с программируемым периодом Т=2n(1+X), где | |||
; Х – число в регистре OCR1A, n – коэффициент деления предделителя | |||
.INCLUDE "C:\Program Files\Atmel\AVR | |||
Tools\AvrAssembler\Appnotes\m8def.inc" | |||
ldi | r16,0x02 | ; Линию РВ1 на вывод | |
out | DDRB,r16 | ; | |
ldi | r16,0b01000000 | ; Режим СТС таймера T1, состояние | |
; вывода РВ1 при сравнении меняется | |||
out | TCCR1A,r16 | ; на противоположное | |
ldi | r16,0b00001001 | ; Режим СТС таймера T1 на частоте | |
out | TCCR1B,r16 | ; тактирования (n=1) | |
ldi | r16,99 | ; Модуль счета Х=99 для | |
out | OCR1AL,r16 | ; периода Т=200 тактов | |
m1: | rjmp | m1 |
Изменить программу так, чтобы период генерируемых прямоугольных импульсов на выводе РВ1 составил N секунд при использовании кварцевого резонатора на 16 МГц (N - вариант задания).
7. Составить комментарии к программе PWM2.
;****** Программа PWM2 | ||
.INCLUDE "C:\Program Files\Atmel\AVR | ||
Tools\AvrAssembler\Appnotes\m8def.inc" | ||
ldi | r16,0x02 | |
out | DDRB,r16 | |
ldi | r16,0x7F | |
out | OCR1AL,r16 | |
ldi | r16,0b11000001 | |
out | TCCR1A,r16 | |
ldi | r16,0b00000010 | |
out | TCCR1B,r16 | |
m1: | rjmp | m1 |
Ввести код программы в отладчик AVR Studio и проверить ее работу в пошаговом режиме. Какой режим ШИМ выбран в данном случае? Какова относительная длительность импульсов на выводе OC1A? С какой частотой относительно частоты кварца поступают импульсы синхронизации на таймер/счётчик?
Отчет должен содержать листинги отлаживаемых программ (в том числе и по индивидуальным заданиям), комментарии по ходу выполнения пунктов работы и рисунки, вставляемые в текст формата WORD, отображающие окна регистров и памяти.