Кочегаров И.И. Микроконтроллеры AVR. Лабораторный практикум (2012) (1264221), страница 17
Текст из файла (страница 17)
В последнем варианте программы исключить команду INCза счет использования косвенной адресации памяти данных с постинкрементом.4. Изменить порядок подсчета числа проходов цикла, задав изменение параметра цикла (счетчика) не с предела, а с нуля.1015. Составить программу пересылки массива из памяти программ в память данных. Массив в памяти программ задать директивой .db; значения элементов массива взять из табл. 6 (массив I) в соответствии с заданным вариантом.6. Составить программу суммирования элементов массива. Значения элементов массива задать аналогично п.
5.7. Составить программу поэлементного сложения двух массивов. Значения элементов массивов взять из табл. 6 (массив I и массив II) в соответствии с заданным вариантом.8. Составить программу слияния двух массивов, где в результате попарного сравнения двух элементов из разных массивов образуется новый массив из наибольших элементов. Значения элементовмассивов взять аналогично п. 7.Содержание отчета Отчет должен содержать титульный лист с указанием номера иназвания лабораторной работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием.Контрольные вопросы 1. Назовите наиболее распространенные алгоритмическиеструктуры.2.
Каковы назначение и общая структура циклических программ?3. Какие существуют команды, используемые для организацииветвлений и циклов?4. Опишите назначение и выполнение команд безусловных переходов.5. Назначение и выполнение команд условных переходов.6. Опишите механизм использования кодов (флагов) условий вкомандах условных переходов.102Лабораторная работа № 5 Организация подпрограмм Цель работы: изучение принципов организации подпрограмми передачи параметров; освоение команд, обеспечивающих взаимодействие вызывающей программы с подпрограммой.Теоретическая часть В большой и сложной программе можно выделить последовательности команд, выполняющие некоторые законченные функции(процедуры). Если такие последовательности команд оформить в виде отдельных модулей – подпрограмм (routine, subroutine), то в программе эти команды могут быть заменены вызовами соответствующих подпрограмм.
Такое модульное (структурное) программирование дает следующие преимущества: ускоряется и упрощается отладка всей программы; подпрограммы, реализующие универсальные функции, могутиспользоваться при разработке других программ; в одной программе могут быть объединены модули, полученные после трансляции программ, написанных на разных языках программирования.Для взаимодействия вызывающей программы с подпрограммойнеобходимо выполнение следующих условий: вызывающей программе должно быть известно положениеподпрограммы в общей структуре программы; должны быть определены способы вызова подпрограммы ивозврата из нее; должен быть выбран способ обмена данными между вызывающей программой и подпрограммой.Положение подпрограммы в общей структуре программы определяется по ее имени.
Имя подпрограммы на ассемблере, задаваемоесимволической меткой, является стартовым адресом исполняемойчасти подпрограммы.Вызов подпрограммы подразумевает передачу в нее управленияходом выполнения команд. Передача управления осуществляется путем загрузки в программный счетчик (РС) стартового адреса подпрограммы. При этом необходимо обеспечить сохранение адреса возврата из подпрограммы, т.е. адреса команды, следующей за командой103вызова подпрограммы. Для хранения адресов возврата из подпрограмм используется стек (stack).Стек – специальным образом организованная последовательность ячеек памяти с дисциплиной обслуживания «последним пришел – первым вышел» (LIFO: Last-In – First-Out).
При занесении встек новых данных предыдущие данные сохраняются, но становятсявременно недоступными («опускаются»). Выгружаются из стека(«поднимаются», «выталкиваются») данные в обратном порядке.Стек может быть реализован как аппаратно, так и программно. Аппаратный стек (Hardware Stack) выполняется непосредственно в составе процессора в виде набора специальных регистров и, как правило,имеет небольшую глубину. Программный стек (Software Stack) организуется в оперативной памяти; глубина определяется размером истепенью использования памяти.Адрес очередной свободной ячейки стека содержится в специальном регистре – указателе стека SP (Stack Pointer). При записи встек число помещается в ячейку с адресом, содержащимся в указателе стека, после чего содержимое указателя стека уменьшается наединицу (рис.
31,а). При чтении из стека производится выборка содержимого ячейки по адресу, на единицу большему содержимогоуказателя стека (рис. 31,б). Таким образом, при записи стека и чтениииз него содержимое указателя стека изменяется.Механизм использования стека для хранения адресов возвратаиз подпрограмм состоит в следующем. Когда в программе встречается команда вызова подпрограммы, в ячейку памяти, определяемуюуказателем стека, записывается адрес возврата; значение указателястека декрементируется; в программный счетчик загружается стартовый адрес подпрограммы.ИсходноесостояниеПосле записичисла С......***...AddrПосле чтения...*** Addr–1С AddrSPSPИсходноесостояние......*** Addr–1SPС AddrSP...*** Addr...а)б)Рис.
31. Операции записи в стек (а) и чтения из стека (б):*** – очередная свободная ячейка стека; Addr – адрес104Далее выполняются команды подпрограммы. Когда в подпрограмме встречается команда возврата в вызывающую программу,значение указателя стека инкрементируется; сохраненный в стеке адрес возврата загружается в программный счетчик (рис. 32). Использование стека для работы с подпрограммами позволяет одной подпрограмме вызывать другую, т.е.
обеспечивает возможность вложения подпрограмм. Глубина вложения подпрограмм ограничиваетсяразмером стека.Основная программа...Загрузка в стек адресавозврата; загрузка впрограммный счётчикстартового адресаподпрограммыВызов п/п SUBRСледующая команда...Извлечение из стекаадреса возврата; загрузкаадреса возврата впрограммный счётчикПодпрограммаSUBR: ......ВозвратРис. 32. Механизм вызова подпрограммы и возвратав вызывающую программуВ большинстве AVR-микроконтроллеров стек размещаетсяв оперативной памяти.
Указатель стека представляет собой пару8-разрядных регистров SPH (старший байт указателя стека) и SPL(младший байт указателя стека), находящихся в адресном пространстве регистров ввода-вывода. В микроконтроллерах, размер оперативной памяти которых не превышает 256 байт, для хранения указателя стека используется только один регистр SPL (SP). Микроконтроллеры, не имеющие оперативной памяти, содержат трехуровневый аппаратный стек.Организуемый в оперативной памяти стек «растет» от старшихадресов к младшим.
Учитывая, что начальное значение указателястека после сброса микроконтроллера равно нулю, в инициализирующей (начальной) части программы необходимо произвести егоустановку, если предполагается использование хотя бы одной подпрограммы. При организации стека во внутренней оперативной памяти это может быть сделано, например, следующим образом:105LDI R16, low(RAMEND); младшая часть адресаRAMENDOUT SPL, R16; инициализация SPLLDI R16, high(RAMEND); старшая часть адресаRAMENDOUT SPH, R16; инициализация SPHКоманда OUT осуществляет запись содержимого регистра общего назначения в регистр ввода-вывода; RAMEND – символическоеимя адреса последней ячейки внутренней оперативной памяти. Длятого чтобы использовать в программе символические имена адресовпериферийных устройств AVR-микроконтроллера, необходимо припомощи директивы .include подключить файл определения адресов периферийных устройств (inc-файл).
Например, для микроконтроллера ATmega8535 следует подключить файл m8535def.inc:.include "m8535def.inc"К подключаемому inc-файлу должен быть указан путь в полеInclude Path окна AVR Assembler, вызов которого осуществляетсякомандой AVR Assembler Setup меню Project. При использовании директивы .include нет необходимости включать в программу директиву .device, так как она содержится в соответствующем inc-файле.Избежать появления в листинге трансляции текста inc-файлапозволяет директива .nolist отключения листинга. Директива.nolist используется совместно с директивой .list включениялистинга (по умолчанию режим генерации листинга включен).Исключение inc-файла из листинга трансляции может быть произведено следующим образом:.nolist.include "m8535def.inc".list; отключить генерацию листинга; подключить inc-файл; включить генерацию листингаВызов подпрограммы на языке ассемблера AVR-микроконтроллеров осуществляется командами RCALL, ICALL, CALL и EICALL.
Команда RCALL (Relative Call – относительный вызов) обеспечивает вызов подпрограммы, смещение начального адреса которойотносительно текущего значения программного счетчика лежит в106пределах 2 К слов (4 Кбайт), с помощью относительной адресациипамяти программ. Команда ICALL (Indirect Call – косвенный вызов)производит косвенный вызов подпрограммы по адресу памяти программ, содержащемуся в регистре-указателе Z; максимальное смещение начального адреса подпрограммы составляет 64 К слов(128 Кбайт). Команда CALL (Call – вызов) обеспечивает вызов подпрограммы из памяти программ размером до 4 М слов (8 Мбайт)с использованием непосредственной адресации.