Главная страница
Навигация по странице:

  • Практическая работа №70. Элементарные приемы программирования (подпрограммы). Цель работы

  • Основные сведения.

  • Практическая часть.

  • Контрольные вопросы.

  • Практическая работа №71. Элементарные приемы программирования (обработка однобайтных данных). Цель работы

  • Методические указания для практических занятий по дисциплине мдк. 02. 01


    Скачать 7.37 Mb.
    НазваниеМетодические указания для практических занятий по дисциплине мдк. 02. 01
    Дата09.09.2022
    Размер7.37 Mb.
    Формат файлаpdf
    Имя файлаMetod_Mikroprocessornye-sistemy_PZ_09.02.01_2020.pdf
    ТипМетодические указания
    #669073
    страница38 из 43
    1   ...   35   36   37   38   39   40   41   42   43
    Контрольные вопросы.
    1. Наиболее распространённые алгоритмические структуры.
    2. Назначение и общая структура циклических программ.
    3. Команды, используемые для организации ветвлений и циклов.
    4. Назначение и выполнение команд безусловных переходов.
    5. Назначение и выполнение команд условных переходов.
    6. Использование кодов (флагов) условий в командах условных переходов.
    Практическая работа №70. Элементарные приемы программирования
    (подпрограммы).
    Цель работы: изучение принципов организации подпрограмм и передачи параметров; освоение команд, обеспечивающих взаимодействие вызывающей программы с подпрограммой.
    Основные сведения.
    В большой и сложной программе можно выделить последовательности команд, выполняющие некоторые законченные функции (процедуры). Если такие последовательности команд оформить в виде отдельных модулей – подпрограмм (routine, subroutine), то в программе эти команды могут быть заменены вызовами соответствующих подпрограмм. Такое модульное
    (структурное) программирование даёт следующие преимущества:

    313
    − ускоряется и упрощается отладка всей программы;
    − подпрограммы, реализующие универсальные функции, могут использоваться при разработке других программ;
    − в одной программе могут быть объединены модули, полученные после трансляции программ, написанных на разных языках программирования.
    Для взаимодействия вызывающей программы с подпрограммой необходимо выполнение следующих условий:
    − вызывающей программе должно быть известно положение подпрограммы в общей структуре программы;
    − должны быть определены способы вызова подпрограммы и возврата из неё;
    − должен быть выбран способ обмена данными между вызывающей программой и подпрограммой.
    Положение подпрограммы в общей структуре программы определяется по её имени. Имя подпрограммы на ассемблере, задаваемое символической меткой, является стартовым адресом исполняемой части подпрограммы. Вызов подпрограммы подразумевает передачу в неё управления ходом выполнения команд. Передача управления осуществляется путём загрузки в программный счётчик (РС) стартового адреса подпрограммы. При этом необходимо обеспечить сохранение адреса возврата из подпрограммы, т. е. адреса команды, следующей за командой вызова подпрограммы. Для хранения адресов возврата из подпрограмм используется стек (stack).
    Стек – специальным образом организованная последовательность ячеек памяти с дисциплиной обслуживания «последним пришёл – первым вышел» (LIFO: Last-In – First-Out). При занесении в стек новых данных предыдущие данные сохраняются, но становятся временно недоступными
    («опускаются»). Выгружаются из стека («поднимаются», «выталкиваются») данные в обратном порядке.
    Стек может быть реализован как аппаратно, так и программно. Аппаратный стек
    (Hardware Stack) выполняется непосредственно в составе процессора в виде набора специальных регистров и, как правило, имеет небольшую глубину. Программный стек (Software Stack) организуется в оперативной памяти; глубина определяется размером и степенью использования памяти. Адрес очередной свободной ячейки стека содержится в специальном регистре – указателе стека SP (Stack Pointer). При записи в стек число помещается в ячейку с адресом, содержащимся в указателе стека, после чего содержимое указателя стека уменьшается на единицу. При чтении из стека производится выборка содержимого ячейки по адресу, на единицу большему содержимого указателя стека. Таким образом, при записи стека и чтении из него содержимое указателя стека изменяется.
    Механизм использования стека для хранения адресов возврата из подпрограмм состоит в следующем. Когда в программе встречается команда вызова подпрограммы, в ячейку памяти, определяемую указателем стека, записывается адрес возврата; значение указателя стека декрементируется; в программный счётчик загружается стартовый адрес подпрограммы. Далее выполняются команды подпрограммы. Когда в подпрограмме встречается команда возврата в вызывающую программу, значение указателя стека инкрементируется; сохра- нённый в стеке адрес возврата загружается в программный счётчик. Использование стека для работы с подпрограммами позволяет одной подпрограмме вызывать другую, т. е. обеспечивает возможность вложения подпрограмм. Глубина вложения подпрограмм ограничивается размером стека.

    314
    В большинстве AVR-микроконтроллеров стек размещается в оперативной памяти.
    Указатель стека представляет собой пару 8-разрядных регистров SPH (старший байт указателя стека) и SPL (младший байт указателя стека), находящихся в адресном пространстве регистров ввода-вывода. В микроконтроллерах, размер оперативной памяти которых не превышает 256 байт, для хранения указателя стека используется только один регистр SPL (SP).
    Микроконтроллеры, не имеющие оперативной памяти, содержат трёхуровневый аппаратный стек. Организуемый в оперативной памяти стек «растёт» от старших адресов к младшим.
    Учитывая, что начальное значение указателя стека после сброса микроконтроллера равно нулю, в инициализирующей (начальной) части программы необходимо произвести его установку, если предполагается использование хотя бы одной подпрограммы. При организации стека во внутренней оперативной памяти это может быть сделано, например, следующим образом: где команда 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-файла из листинга трансляции может быть произведено следующим образом:
    Вызов подпрограммы на языке ассемблера AVR-микроконтроллеров осуществляется командами RCALL, ICALL, CALL и EICALL.
    Команда RCALL (Relative Call – относительный вызов) обеспечивает вызов подпрограммы, смещение начального адреса которой относительно текущего значения программного счётчика лежит в пределах ±2К слов (±4К байт), с помощью относительной адресации памяти программ.
    Команда ICALL (Indirect Call – косвенный вызов) производит косвенный вызов подпрограммы по адресу памяти программ, содержащемуся в регистре-указателе Z; максимальное смещение начального адреса подпрограммы составляет 64К слов (128К байт).
    Команда CALL (Call – вызов) обеспечивает вызов подпрограммы из памяти программ размером до 4М слов (8М байт) с использованием непосредственной адресации.

    315
    Команда EICALL (Extended Indirect Call – расширенный косвенный вызов) позволяет выполнять косвенный вызов подпрограмм из памяти программ размером до 4М слов (8М байт).
    При выполнении команд RCALL, ICALL, CALL и EICALL текущее значение программного счётчика заносится в стек (2 байта в микроконтроллерах с 16-разрядным про- граммным счётчиком или 3 байта в микроконтроллерах с 22-разрядным про- граммным счётчиком). Содержимое указателя стека (SPH:SPL) уменьшается соответственно на 2 или 3.
    Примеры использования команд вызова подпрограмм:
    Для возврата из подпрограмм используется команда RET. При выполнении команды RET адрес возврата загружается из стека в программный счётчик. При этом содержимое указателя стека увеличивается на 2 или 3 в зависимости от разрядности программного счётчика (см. выше).
    Стек может также использоваться для сохранения содержимого РОН на время выполнения подпрограмм.
    Для сохранения в стеке и извлечения из стека содержимого РОН служат команды PUSH и
    POP. Команда PUSH заносит содержимое регистра в стек по адресу, хранящемуся в указателе стека, при этом значение указателя стека уменьшается на единицу (SPH:SPL = SPH:SPL – 1).
    Команда POP выполняет обратные действия: значение указателя стека увеличивается на единицу
    (SPH:SPL = SPH:SPL + 1); содержимое ячейки памяти по адресу, хранящемуся в указателе стека, загружается в регистр.
    Программы с использованием подпрограмм обычно начинаются с команды относительного перехода к основной программе, в которой прежде всего про- изводится инициализация стека. Тексты подпрограмм обычно размещают перед текстом основной программы.
    При работе с подпрограммами важно обеспечить передачу параметров из вызывающей программы в подпрограмму и возврат результатов выполнения подпрограммы обратно в вызывающую программу. В ассемблере AVR-микроконтроллеров способы обмена данными между вызывающей программой и подпрограммой не формализованы. Для передачи параметров могут использоваться регистры общего назначения, ячейки оперативной памяти и стек. Передача параметров через регистры общего назначения пригодна только для небольшого числа параметров, т. к. число РОН ограничено и занятые под параметры регистры уже нельзя использовать в подпрограмме для участия в других вычислениях и хранения других данных.
    Однако это самый простой и прозрачный способ передачи параметров, обеспечивающий самый быстрый доступ к передаваемым параметрам.
    Использование оперативной памяти для передачи параметров требует жёсткой регламентации правил обращения к ним. Например, можно организовать в памяти массив
    (таблицу) для непосредственного хранения значений передаваемых параметров или их адресов; адрес начала массива занести в РОН. Имея начальный адрес массива, вызывающая программа и подпрограмма смогут получить доступ к требуемым параметрам. При передаче параметров через

    316
    стек перед вызовом подпрограммы передаваемые параметры заносятся в стек. Следует помнить, что после выполнения команды вызова подпрограммы в стек будет добавлен адрес возврата в вызывающую программу. Задавшись значением указателя стека в качестве базового адреса и используя косвенную адресацию памяти данных со смещением, в подпрограмме можно получить доступ к содержащимся в стеке параметрам. Например, если в основной программе перед вызовом подпрограммы занести в стек значение некоторого параметра: ldi R16, $33 ; R16 <- $33 push R16 ; сохранение содержимого регистра R16 в стеке то в подпрограмме можно получить к нему доступ: in R30, SPL ; младший байт указателя стека in R31, SPH ; старший байт указателя стека ldd R20, Z+3 ; загрузка числа $33 из стека в регистр R20 (команда IN служит для считывания содержимого регистра ввода-вывода в РОН).
    Аналогично можно использовать стек для хранения адреса массива передаваемых параметров, расположенного в оперативной памяти данных.
    Практическая часть.
    1. Составить программу, использующую для вызова подпрограммы команду RCALL. Для передачи параметров в под- программу использовать регистры общего назначения. Выполнить программу в пошаговом режиме, отслеживая изменение содержимого программного счётчика, указателя стека, а также занесение в стек адреса возврата из подпрограммы.
    2. Выполнить задание п. 1, используя стек для передачи параметров в подпрограмму.
    Проследить в симуляторе занесение передаваемых параметров в стек.
    3. Выполнить задание п. 2, применив для вызова подпрограммы команду ICALL.
    4. Оформить отчет. Отчёт должен содержать: титульный лист с указанием номера и названия работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием.
    Контрольные вопросы.
    1. Условия взаимодействия вызывающей программы и подпрограммы.
    2. Принципы организации и назначение стека.
    3. Механизм вызова подпрограмм.
    4. Команды работы с подпрограммами на ассемблере микроконтроллеров семейства AVR.
    5. Способы обмена данными между вызывающей программой и подпро- граммой.
    Практическая работа №71. Элементарные приемы программирования (обработка
    однобайтных данных).
    Цель работы: изучение изучение системы прерываний на примере прерывания по переполнению встроенного таймера-счётчика AVR-микроконтроллера.
    Основные сведения.
    При работе реальной микропроцессорной системы в ней или вне её могут произойти события, требующие немедленной реакции. Такая реакция обеспечивается процедурой прерывания (interrupt), которая состоит в том, что выполнение текущей программы приостанавливается, запоминается состояние на момент прерывания, выполняется другая программа, после чего восстанавливается сохранённое до прерывания состояние процессора и продолжается выполнение прерванной программы. Сигнал, вызвавший прерывание текущей программы, называется запросом на прерывание (interrupt request – IRQ); источник этого сигнала
    источником прерывания; последовательность действий, выполняемая по запросу на прерывание, – обслуживанием прерывания, а выполняемая по прерыванию программа – подпрограммой обработки прерывания (interrupt handler, interrupt routine).
    Различают два типа источников прерывания – аппаратные и программные. Источниками аппаратных прерываний служат внешние и внутренние периферийные устройства. Запросом на прерывание от внешнего источника является активный сигнал на соответствующем выводе процессора; источник прерывания определяется по выводу, на котором появляется такой сигнал.

    317
    К источникам программного прерывания относятся специальные команды прерываний (trap) – управляемые программные прерывания и особые условия (exception – исключение) – неуправляемые программные прерывания, являющиеся реакцией процессора на исключительную ситуацию, возникшую при выполнении некоторой команды (переполнение, деление на нуль и т. п.). Запросом на прерывание от программного источника является непосредственно команда прерывания или установка бита (битов), фиксирующих возникновение особого условия. Общее количество источников аппаратных и программных прерываний может быть различным – от единиц до нескольких десятков.
    Процедура обслуживания прерываний по запросам от нескольких источников в различных процессорах выполняется по-разному. Тем не менее, основные принципы реализации механизма прерываний являются общими. Управление процедурой прерываний осуществляется специальными устройствами в составе аппаратного обеспечения процессора (контроллерами, схемами управления и т. п.). Основными средствами управления прерываниями являются:
    − векторы прерываний;
    − приоритеты прерываний;
    − операция маскирования прерываний;
    − флаги прерываний.
    В микроконтроллерах указанные средства управления прерываниями реализуются следующим образом. Для управления прерываниями от N источников в адресном пространстве памяти программ выделяется специальная область из N ячеек памяти (или N блоков, состоящих из нескольких ячеек). В каждой из этих ячеек размещаются команды перехода к соответствующей подпрограмме обработки прерывания или (в случае блока из нескольких ячеек) непосредственно команды, которые необходимо выполнить по запросу на прерывание.
    Эти ячейки памяти (блоки) называются векторами прерываний (или просто векторами), адрес ячейки (пер- вой ячейки каждого блока) – адресом вектора прерывания. Таким образом, каждому источнику прерывания ставится в соответствие свой адрес вектора прерывания. Совокупность N векторов образует таблицу векторов прерываний, которая обычно располагается начиная с нулевого адреса памяти программ.
    Приоритеты прерываний (interrupt priority) определяют очерёдность обслуживания запросов на прерывания. Введение приоритетов необходимо, если возможно одновременное (в течение одного периода тактовой частоты) поступление запросов на прерывание от различных источников или поступление нового запроса на прерывание во время обслуживания прерывания по ранее поступившему запросу. Виды и структура приоритетов прерываний определяются архитектурой процессора. Наиболее простым способом задания приоритетов является последовательное присвоение значений приоритетов в таблице векторов прерываний от высшего к низшему. Высший приоритет всегда имеет аппаратный сброс; далее располагаются векторы прерываний от других источников.
    Для того, чтобы запретить обслуживание неиспользуемых прерываний, служит операция маскирования. В зависимости от возможности маскирования источники прерывания делятся на маскируемые (maskable), прерывания от которых могут разрешаться или запрещаться, и немаскируемые (nonmaskable), прерывания от которых не могут запрещаться. Маскирование может быть общим и индивидуальным. При общем (глобальном) маскировании все прерыва- ния, кроме немаскируемых, запрещены независимо от их индивидуального маскирования.
    Индивидуальное маскирование позволяет запрещать (разрешать) прерывание от каждого источника отдельно. Флаги прерываний представляют собой разряды специальных регистров, устанавливающиеся при поступлении запроса на прерывание от некоторого источника.
    Процедура обслуживания прерывания может быть упрощённо представлена состоящей из следующих этапов:
    − приёма запросов на прерывание;
    − арбитража прерываний;
    − выполнения подпрограммы обслуживания прерывания.
    При приёме запроса на прерывание от немаскируемого источника сразу осуществляется переход к следующему этапу его обслуживания – арбитражу. Запрос на прерывание от

    318
    маскируемого источника обрабатывается по более сложному алгоритму. При поступлении запроса устанавливается соответствующий флаг прерывания. Далее проверяется наличие общего маскирования прерываний. Если режим общего маскирования установлен, то запросы на пре- рывания от всех маскируемых источников игнорируются и продолжается выполнение текущей программы. Если режим общего маскирования не задан, то запрещение или разрешение данного прерывания определяется наличием (отсутствием) индивидуального маскирования. Если данное прерывание замаскировано, то запросы на прерывание от данного источника запрещены и продолжается выполнение текущей программы. В противном случае прерывания от данного источника разрешены и для него начинается следующий этап обслуживания – арбитраж.
    Арбитраж прерываний служит для определения прерывания с наивысшим приоритетом из очереди поступивших запросов на прерывание. После арбитража начинается выполнение выбранного запроса на прерывание. Выполнение прерывания состоит в переходе к подпрограмме обслуживания прерывания, её выполнении и возврату к выполнению текущей программы. Перед выполнением прерывания производится общее маскирование, т. е. запре- щение всех прерываний, кроме немаскируемых, а также очищается флаг обслуживаемого прерывания. Собственно выполнение прерывания начинается с обращения к вектору прерывания обслуживаемого источника. Обслуживаемое прерывание может быть прервано по запросам от источников, имеющих более высокий приоритет. Прерывания, для обслуживания которых прерывается выполнение подпрограммы обработки другого прерывания, называются вложенными. Процедура их обслуживания аналогична обслуживанию обычных прерываний; отличие состоит лишь в том, что прерывается выполнение не основной программы, а подпрограммы обработки прерывания от источника с более низким приоритетом.
    В микропроцессорных системах механизм прерываний используется для обмена информацией с различными устройствами ввода-вывода. Такой способ обмена данными называется обменом по прерываниям. Типичными примерами запросов на прерывание являются запросы по готовности результата аналого- цифрового преобразования, готовности устройства к приёму (передаче) информации, переполнению некоторого регистра и т. п.
    Использование механизма прерываний позволяет значительно повысить производительность системы при работе с медленно действующими устройствами, обслуживание которых в таком случае занимает процессорное время только при их готовности к обмену.
    В AVR-микроконтроллерах механизм прерываний реализуется следующим образом.
    Управление прерываниями осуществляется с помощью схемы прерываний. Область векторов прерываний размещается в начале памяти программ; каждый вектор состоит из одной ячейки.
    При необходимости область векторов прерываний может быть перемещена в другое место памяти программ. Прерывания с младшими адресами имеют бόльший уровень приоритета.
    Источниками всех прерываний являются аппаратные средства (внешние или внутренние); источники программных прерываний отсутствуют.
    Все источники прерываний являются маскируемыми. Общее маскирование осуществляется очисткой бита I глобального разрешения прерываний в регистре состояния
    SREG. Количество векторов прерываний в AVR-микроконтроллерах составляет от 3 до 35 в зависимости от типа. Например, в микроконтроллере ATmega8535 имеется 21 вектор прерывания: 3 от внешних источников и 18 от внутренней периферии. Работа с внешними прерываниями осуществляется с помощью регистра управления GICR (General Interrupt Control
    Register) и регистра флагов GIFR (General Interrupt Flag Register), расположенных в адресном пространстве регистров ввода-вывода. Установка разряда 7 (INT1) регистра управления GICR разрешает внешнее прерывание INT1, установка разряда 6 (INT0) – внешнее прерывание INT0, установка разряда 5 (INT2) – внешнее прерывание INT2. Разряд 7 (INTF1) регистра флагов GIFR устанавливается при поступлении за- проса на прерывание INT1, разряд 6 (INTF0) – запроса на прерывание INT0; разряд 5 (INTF2) – запроса на прерывание INT2. Очистка установленных фла- гов прерываний производится записью единиц в соответствующие разряды ре- гистра GIFR.
    Режим запуска внешних прерываний INT0 и INT1 задают разряды 0…3 (ISC00, ISC01, ISC10,
    ISC11) регистра управления MCUCR. Запись в разряды ISC00, ISC01 соответственно значений 0,

    319 0 задаёт режим запуска внешнего прерывания INT0 по низкому уровню; 0, 1 – по отрицательному фронту; 1, 1 – по положительному фронту; значения 1, 0 не используются.
    Аналогично с по- мощью разрядов ISC10, ISC11 задаётся режим запуска внешнего прерывания
    INT1. Режим запуска внешнего прерывания INT2 задаётся разрядом 6 (ISC2) регистра управления и состояния MCUCSR: 0 – по отрицательному фронту; – по положительному фронту.
    Для управления прерываниями от внутренних периферийных устройств в адресном пространстве регистров ввода-вывода также предусмотрены специальные регистры. Например, управление прерываниями по запросам от встроенных таймеров-счётчиков осуществляется с помощью регистра масок TIMSK (Timer/Counter Interrupt Mask Register) и регистра флагов TIFR
    (Timer/Counter Interrupt Flag Register). Кроме того, с каждым аппаратным устройством AVR- микроконтроллера ассоциированы управляющие регистры, расположенные в адресном пространстве регистров ввода-вывода.
    Например, управление встроенным
    8-разрядным таймером-счётчиком
    T/C0
    (Timer/Counter0) осуществляется с помощью регистра TCCR0 (Timer/Counter0 Control Register) и регистра и TCNT0 (Timer/Counter0). Разряды 0…2 (CS00, CS01, CS02) регистра TCCR0 задают режим работы таймера-счётчика T/C0: при записи в разряды CS00, CS01, CS02 соответственно значений 0, 0, 0 таймер-счётчик остановлен; 1, 0, 0 – содержимое регистра TCNT0 инкрементируется на каждом такте тактового генератора; 0, 1, 0 – на каждом 8-м такте; 1, 1, 0 – на каждом 64-м такте; 0, 0, 1 – на каждом 256-м такте; 1, 0, 1 – на каждом 1024-м такте; значения
    0, 1, 1 и 1, 1, 1 устанавливают режим подсчёта числа импульсов внешнего источника по отрицательному и положительному фронту соответственно. Таймер-счётчик T/C0 генерирует запрос на прерывание при переполнении регистра TCNT0. В регистре масок TIMSK прерыванию при переполнению таймера-счётчика T/C0 соответствует разряд 1 (TOIE0); в регистре флагов
    TIFR – разряд 1 (TOV0). Установка разряда TOIE0 разрешает прерывание по переполнению регистра TCNT0; флаг TOIF0 устанавливается при поступлении запроса на пре- рывание по переполнению регистра TCNT0.
    Пример программы с использованием прерываний приведён на рисунке ниже. Программы с использованием прерываний начинаются с определения области векторов прерываний. Адреса векторов прерываний указываются символическими именами и помощью директив .org. По адресам векторов прерываний размещают команды относительного перехода к подпрограммам обработки прерываний, которые обычно располагают непосредственно после области векторов прерываний. Подпрограммы обработки прерываний завершаются командами reti возврата в основную программу. Команда reti выполняет те же действия, что и команда ret, а также восстанавливает бит I общего (глобального) разрешения прерываний в регистре состояния
    SREG.
    В основной программе производится инициализация стека и прерываний. Инициализация прерываний осуществляется путём установки определённых разрядов в соответствующих регистрах ввода-вывода; при этом в командах используются символические обозначения как самих регистров, так и отдельных их разрядов. После инициализации прерываний производится общее разрешение прерываний путём установки бита I в регистре состояния SREG. Для этого предусмотрена специальная команда sei (Set Global Interrupt Flag). Процедура обслуживания прерываний в AVR-микроконтроллерах выполняется согласно приведённому выше алгоритму.
    Для организации вложенных прерываний необходимо в подпрограмме обработки прерывания восстанавливать бит I общего разрешения прерываний в регистре состояния SREG.
    1   ...   35   36   37   38   39   40   41   42   43


    написать администратору сайта