Кочегаров И.И. Микроконтроллеры AVR. Лабораторный практикум (2012) (1264221), страница 15
Текст из файла (страница 15)
Адресация константы в памяти программЗадать данные в память программ позволяет директива .db (define bytes). Для того чтобы на заданные ячейки памяти можно былоссылаться, директиве должна предшествовать метка. Параметры директивы – последовательность выражений, разделенных запятыми;каждое выражение должно быть числом в диапазоне –128…255 или врезультате вычисления давать результат в этом же диапазоне, в противном случае число усекается до байта. Директива .db размещается в программном сегменте и может использоваться совместно с директивой .org.
Задавать положение данных в памяти программ следует таким образом, чтобы была исключена возможность непреднамеренного перехода к выполнению их как команд микроконтроллера.Пример использования адресации константы в памяти программ:LDI R31, high(var<<1)LDI R30, low(var<<1)LPM R16, Z;....org $0025var: .db $50, 137; старший байт регистра Z; младший байт регистра Z; загрузка числа $50 в R16; по адресу $0025; константы $50 и 13788В приведенном примере использован оператор <<, выполняющий сдвиг операнда влево на указанное число разрядов.При адресации константы в памяти программ с постинкрементом адрес байта константы содержится в регистре Z и формируется так же, как и при адресации константы (рис.
29). Адресованныйрегистром Z байт загружается в указанный регистр; после выполнения команды содержимое регистра Z инкрементируется. Адресацияконстанты в памяти программ с постинкрементом используется в командах LPM и ELPM. Например:LDI R31, high(var<<1) ; старший байт регистра ZLDI R30, low(var<<1) ; младший байт регистра ZLPM R16, Z+; загрузка числа $50 в R16, инкремент ZLPM R17, Z; загрузка числа 137 в R17;...var: .db $50, 137; константы $50 и 137Практическая часть Составить программу сложения двух целых 8-разрядных чисел:1) с использованием прямой регистровой адресации РОН. Результат сложения в этом и последующих пунктах задания сохранитьв РОН.
Значения операндов взять из задания лабораторной работы№ 1 (числа А и В);2) с использованием непосредственной адресации оперативнойпамяти данных. Для этого зарезервировать в ОЗУ байты под слагаемые с помощью директив .byte. Занести слагаемые в зарезервированные ячейки ОЗУ командой STS с непосредственной адресацией.Сложить операнды, предварительно загрузив их в РОН командойLDS с непосредственной адресацией;3) с использованием косвенной адресации оперативной памятиданных. Адреса слагаемых в ОЗУ загрузить в регистры X и Y с помощью команды LDI и функций low и high. Занести слагаемые взарезервированные ячейки ОЗУ командой ST с косвенной адресацией. Сложить операнды, предварительно загрузив их в РОН командойLD с косвенной адресацией;4) с использованием косвенной адресации оперативной памятиданных со смещением.
Для этого зарезервировать в ОЗУ байты подслагаемые в одной директиве .byte. Адрес начала блока данных за89грузить в регистр Z с помощью команды LDI и функций low иhigh. Занести слагаемые в зарезервированные ячейки ОЗУ командойSTD с косвенной адресацией со смещением. Сложить операнды,предварительно загрузив их в РОН командой LDD с косвенной адресацией со смещением;5) с использованием косвенной адресации оперативной памятиданных с предекрементом. Для этого зарезервировать в ОЗУ байтыпод слагаемые в одной директиве .byte. В регистр Z загрузить адрес ячейки ОЗУ, следующей за блоком зарезервированных байтов.Занести слагаемые в зарезервированные ячейки ОЗУ командой ST скосвенной адресацией с предекрементом. Сложить операнды, предварительно загрузив их в РОН командой ld c косвенной адресациейячеек ОЗУ с предекрементом;6) с использованием косвенной адресации оперативной памятиданных с постинкрементом.
Для этого зарезервировать в ОЗУ байтыпод слагаемые в одной директиве .byte. В регистр Z загрузить адрес начала блока зарезервированных байтов. Занести слагаемые в зарезервированные ячейки ОЗУ командой ST с косвенной адресацией спостинкрементом. Сложить операнды, предварительно загрузив их вРОН командой LD с косвенной адресацией с постинкрементом;7) с использованием адресации константы в памяти программ.Для этого задать слагаемые в памяти программ в одной директиве.db.
Сложить операнды, предварительно загрузив их в РОН с помощью команды LPM. Для пересылки слагаемых между РОН использовать команду MOV;8) с использованием адресации константы в памяти программс постинкрементом. Для загрузки слагаемых в РОН использоватькоманду LPM с постинкрементом.В диалоговом окне AVR Simulator Options в разделе Device Selection установить тактовую частоту моделирования работы микроконтроллера, равную 8,0 МГц (поле Frequency).Выполнить трансляцию и отладку созданных программ.По данным, выводимым после трансляции на закладке Build окнаOutput, проанализировать использование памяти программ (Program memory usage) под код программы (Code) и константы (Constants), оценить объем неиспользованной (Unused) и общей занятой(Total) памяти.
Занести эти сведения в отчет (табл. 4).90Вариант программыОбъем памяти программ, занятой под кодпрограммы, словОбъем памяти программ, занятой под константы,словОбъем неиспользованной памяти программ, словОбщий объем занятой памяти программ, словЧисло тактов выполнения программыВремя выполнения программы, мкс1234Таблица 45 6 7 8П р и м е ч а н и е. Все программы рекомендуется включить в один проект.
При этом программа, подлежащая трансляции, задается командой Set as entry file контекстного меню дерева иерархии проекта. Подлежащая трансляции(все прочие испрограмма помечается в дереве иерархии проекта символомходные файлы проекта имеют символ ).При отладке программ использовать средства наблюдения засодержимым регистров и ячеек памяти. По полю Cycle Counter объекта Processor закладки I/O окна Workspace определить число тактов выполнения программы, по полю Stop Watch – время выполнения программы (до выполнения команды, организующей бесконечный цикл).
Зафиксировать эти сведения в отчете (табл. 4). По результатам выполнения программ сделать выводы.Содержание отчета Отчет должен содержать титульный лист с указанием номера иназвания лабораторной работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ и сведения, указанные в задании; схемы образования адреса для использованных способов адресации.Контрольные вопросы 1.
Опишите виды адресации РОН и регистров ввода-выводаAVR-микроконтроллеров.2. Какие существуют способы адресации памяти данныхAVR-микроконтроллеров?3. Какие способы адресации памяти программ AVR-микроконтроллеров вы знаете?4. Каковы особенности выполнения арифметических и логических операций в AVR-микроконтроллерах?5. Каково назначение и использование регистров X, Y и Z?91Лабораторная работа № 3 Арифметические и логические команды Цель работы: изучение команд сложения, вычитания, операций «и, или, не» с регистрами и константами, а также установки,сброса и сдвига разрядов, команд установки и сброса флагов, и команд сравнения РОН.Теоретическая часть Арифметические команды:add Rd,Rr сложение двух РОН без учета переносаadc Rd,Rr сложение двух РОН с учетом переносаadiw Rd,k сложение регистровой пары с константойsub Rd,Rr вычитание двух РОН без учета переносаsbc Rd,Rr вычитание двух РОН с учетом переносаsbiw Rd,k вычитание константы из регистровой парыsubi Rd,k вычитание константы из регистраsbci Rd,k вычитание константы из регистра с учетом переносаinc Rd увеличение содержимого регистра на единицуdec Rd уменьшение содержимого регистра на единицуclr Rd очистка регистра (операция «исключающее или» регистра ссамим собой)ser Rd установка регистраand Rd,Rr логическое «и»andi Rd,k логическое «и» с константойor Rd,Rr логическое «или»ori Rd,k логическое «или» с константойeor Rd,Rr логическое исключающее «или»com Rd побитная инверсияneg Rd дополнительный код (инверсия знака)Команды операций с битами:CBR Rd, К Сброс разряда(ов) РОНSBR Rd, К Установка разряда(ов) РОНCBI А, b Сброс разряда РВВSBI A, b Установка разряда РВВ92LSL Rd Логический сдвиг влево (с установкой переноса)LSR Rd Логический сдвиг вправо (с установкой переноса)ROL Логический сдвиг влево через переносROR Логический сдвиг вправо через переносASR Арифметический сдвиг вправоBCLR S Сброс флагаBSET S Установка флагаBLD Rd, b Загрузка разряда РОН из флага ТBST Rr, b Загрузка разряда РОН из флага ТCLC Сброс флага переносаSEC Установка флага переносаCLN Сброс флага отрицательного числаSEN Установка флага отрицательного числаCLZ Сброс флага нуляSEZ Установка флага нуляCLI Общий запрет прерыванийSEI Общее разрешение прерыванийCLS Сброс флага знакаSES Установка флага знакаCLV Сброс флага переполнения дополнительного кодаSEV Установка флага переполнениядополнительного кодаCLT Сброс пользовательского флага ТSET Установка пользовательского флага ТRd – РОН, А – порт, K – константа (от 1 до 255), b – номер разрядапорта (от 0 до 7),S-произвольный флаг в регистре состояний SREGПрактическая часть Запустить AVR Studio в режиме эмуляции и выполнить в пошаговом режиме программу 1, при этом наблюдая за состоянием регистров.93Программа 1:.include "m16def.inc";подключение библиотеки.list;включение листинга.def temp0=r16;определение рабочих регистров.def temp1=r17.def temp2=r18.def temp3=r19.def temp4=r20.def temp5=r21.def temp6=r22;-------------------------------------------metka:ldi temp0,0x00;записываем ноль в регистр temp0ldi temp0,0xFF;записываем 0xff в регистр temp0ldi temp1,0x00;записываем ноль в регистр temp1ldi temp1,0xAA;записываем 0xAA в регистр temp1ldi temp2,0x00;записываем ноль в регистр temp2ldi temp2,0xCC;записываем 0xCC в регистр temp2ldi temp3,0x00;записываем ноль в регистр temp3mov temp3,temp2;пересылка данных из temp2 d temp3add temp1,temp2;складываем temp1 и temp2 без учета переносаsbc temp0,temp1; вычитаем temp1 из temp0 с учетом переносаsubi temp4,0x11 ;вычитание константы из регистра temp4inc temp5; увеличение содержимого регистра на единицуinc temp5; увеличение содержимого регистра на единицуinc temp5; увеличение содержимого регистра на единицуdec temp5; уменьшение содержимого регистра на единицуdec temp5; уменьшение содержимого регистра на единицуdec temp5; уменьшение содержимого регистра на единицуclr temp5 ;очистка регистра (операция "исключающее или" регистра с самим собой)or temp0,temp1; логическое "или"com temp6; побитная инверсияneg temp6; дополнительный код(инверсия знака)rjmp metka;переход к метке94Внести следующие изменения в программу:1.
Написать программы сложения и вычитания двух 8-разрядных чисел с записью результата в ячейку памяти.2. Написать программы сложения двух 16-разрядных чисел.3. В соответствии с вариантом сложить содержимое Rd1 и Rd2,вычесть из результата константу K и проверить состояние бита отрицательности, после чего записать результат в ячейку памяти R.Вариант123456789101112131415R0060006100620063006400650066006700680069006A006B006C006D006EK0xFF0xEE0xDD0xCC0xBB0xAA0x990x880x770x660x550x440x330x220x11Rd10x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0FRd20x100x200x300x400x500x600x700x800x900xA00xB00xC00xD00xE00xF0Запустить AVR Studio в режиме эмуляции и выполнить программу в пошаговом режиме, при этом наблюдая за состоянием регистров и флагов.Программа 2:.include "m16def.inc";подключение библиотеки.list;включение листинга.def Rd=r16;определение рабочих регистров.def Rr=r17.def temp2=r18.def temp3=r19.def temp4=r20.def temp5=r2195.def temp6=r22;-------------------------------------------sbr Rd,0x1 ;установка Rd в единицуcbr Rd,0x1;cброс нулевого разряда регистра Rdsbi porta,0 ;установка нулевого разряда РВВ порта А в единицуcbi porta,0 ;сброс нулевого разряда РВВ порта Аsbr Rr,0xf0 ;установка четырех младших разрядов RrВнести следующие изменения в программу:1.