Порядок выполнения работы
Программа, в которой команды выполняются последовательно одна за другой, встречается редко. В подавляющем числе программ используется ветвление по тем или иным условиям. Ассемблер для микроконтроллеров имеет большое разнообразие переходов по условию. По условию возможен переход к какой-нибудь команде или пропуск следующей одной команды. Переход или пропуск команды осуществляется, если условие выполняется. Переход возможен, как вперед (максимум через 63 команды), так и назад (максимум через 64) команды.
Программа микроконтроллера выполняется последовательно команда за командой. После выполнения последней команды, программа начинает выполняться с самого начала автоматически. Для того чтобы программа выполнялась с нужного места, необходимо использовать команду безусловного перехода.
Переход может быть осуществлен:
а) по результату сравнения двух регистров общего назначения или регистра общего назначения с константой. Возможные варианты сравнения: Rd = Rr (Rd = K), Rd ¹ Rr (Rd ¹ K), Rd < Rr (Rd < K), Rd ≥ Rr (Rd ≥ K);
б) по значению одного из битов (установлен или сброшен) в регистре статуса (SREG).
Пропуск команды может быть осуществлен:
а) при равенстве двух регистров общего назначения (Rd = Rr);
б) по значению одного из битов (установлен или сброшен) в регистрах общего назначения (РОН)
в) по значению одного из битов (установлен или сброшен) в 32 младших регистрах I/O.
Во многих программах возникает необходимость повторять одно и тоже действие несколько раз. Для этого в языках высокого уровня предусмотрены специальные команды цикла. В ассемблере для микроконтроллеров такой специальной команды нет, и поэтому цикл приходится организовывать самостоятельно. Вариантов организации цикла много. Ниже предлагается один из них.
Количество повторений цикла известно.
…
LDI R16,К ; установка счетчика циклов.
CIKL: ; метка начала цикла.
… ; начало тела цикла.
… ; конец тела цикла.
DEC R16 ; уменьшение счетчика циклов на 1.
CPI R16,0 ; проверка числа выполненных циклов.
BRNE CIKL ; переход на метку CIKL, если заданное число циклов не
… ; выполнено, т.е результат сравнения не 0. Если резуль-
; тат сравнения 0,то выход из цикла и выполнение сле-
; дующей команды.
Значение К может лежать в диапазоне 1…255. Если необходимое число повторений больше 255, то можно организовать повторение самого цикла. В этом случае цикл может иметь вид:
…
LDI R17,К ; установка внешнего счетчика циклов.
LDI R16,К ; установка внутреннего счетчика циклов.
CIKL2: ; метка начала внешнего цикла.
CIKL1: ; метка начала внутреннего цикла.
… ; начало тела цикла.
… ; конец тела цикла.
DEC R16 ; уменьшение счетчика внутренних циклов на 1.
CPI R16,0 ; проверка числа выполненных внутренних циклов.
BRNE CIKL1 ; переход на мет CIKL1, если заданное число внутрен-
; них циклов не выполнено.
DEC R17 ; уменьшение счетчика внешних циклов на 1.
CPI R17,0 ; проверка числа выполненных внешних циклов.
BRNE CIKL2 ; переход на мет CIKL, если заданное число внешних
… ; циклов не выполнено, т.е результат сравнения не 0.
; Если результат сравнения 0,то выход из цикла и
; выполнение следующей команды.
При необходимости изменения числа повторения цикла в процессе выполнения программы, например, задания числа повторения с внешних устройств через порт А, вместо команды LDI R17,К используется команда IN R17,PINA.
Если число повторений цикла заранее не известно, и он выполняется до момента соблюдения некоторого условия можно предложить следующий вариант выполнения такого цикла (например, при равенстве двух регистров):
…
CIKL: ; начало цикла.
CP R1,R2 ; проверка соблюдения условия выхода из цикла.
BREQ WYX ; переход на метку WYX, выход из цикла при соблюдении
; условия.
… ; начало тела цикла.
… ; конец тела цикла.
RJMP CIKL ; переход на начало цикла.
WYX: ; метка перехода из цикла при соблюдении условия.
…
В таком варианте проверка соблюдения условия выхода из цикла осуществляется до выполнения цикла, и если условие соблюдается сразу, то цикл не будет выполнен вообще.
Ниже приведен вариант цикла, в котором соблюдение условия выхода из цикла проверяется после выполнения цикла. В этом случае при любых условиях цикл будет выполнен хотя бы один раз.
…
CIKL: ; начало цикла.
… ; начало тела цикла.
… ; конец тела цикла.
CP R1,R2 ; проверка соблюдения условия выхода из цикла.
BREQ WYX ; переход на метку WYX, выход из цикла при соблюдении
; условия.
RJMP CIKL ; переход на начало цикла.
WYX: ; метка перехода из цикла при соблюдении условия.
…
Пример организации цикла при тестировании бита (в данном случае второго в регистре общего назначения R1):
…
CIKL: ; начало цикла.
SBRC R1,2 ; проверка соблюдения условия выхода из цикла (тест бита).
RJMP WYX ; переход на метку WYX, выход из цикла при соблюдении
; условия (бит равен 1).
… ; начало тела цикла.
… ; конец тела цикла.
RJMP CIKL ; переход на начало цикла.
WYX: ; метка перехода из цикла при соблюдении условия.
…
Пока значение второго бита регистра общего назначения R1 остается равным 0, будет пропускаться команда RJMP WYX и выполняться цикл. Как только значение этого бита станет равным 1, будет выполнена команда RJMP WYX, и осуществится выход из цикла на метку WYX.
В некоторых случаях требуется выполнение каких-то действий не в процессе непрерывного цикла, а однократно при изменении входного сигнала с 0 на 1 или с 1 на 0 (например, при динамической синхронизации). При построении таких программ наиболее рационально использовать внешнее прерывание. Но если по каким-либо причинам это невозможно, можно предложить следующий алгоритм. Само действие оформлено в виде подпрограммы, а основная (фоновая) программа выполняет опрос входного сигнала. Если входной сигнал 0, то опрос повторяется вновь до тех пор, пока на входе не появится 1. После этого однократно выполняется подпрограмма и снова начинается опрос входного сигнала, только теперь опрос повторяется до тех пор, пока на входе не появится 0. После появления 0 осуществляется переход на начало основной программы и цикл начинается снова. Таким образом, подпрограмма выполняется при появлении перепада с 0 на 1.
Пример текста такой программы:
; начало основной (фоновой) программы
OPROS0:
SBIS PIND,2 ; тестирование бита 2 порта D и пропуск следую-
; щей команды, если он равен 1
RJIMP OPROS0 ; переход на начало опроса, если бит 2 порта D
; равен 0
RCALL PROGROMMA ; переход к выполнению подпрограммы
OPROS1:
SBIC PIND,2 ; тестирование бита 2 порта D и пропуск следую-
; щей команды, если он равен 0
RJIMP OPROS1 ; переход на начало опроса, если бит 2 порта D
; равен 1
RJIMP OPROS0 ; переход на начало основной (фоновой) программы,
; если бит 2 порта D равен 0
PROGROMMA:
… ; начало подпрограммы
…
RET ; конец подпрограммы
Если необходимо выполнение подпрограммы при появлении перепада с 1 на 0, то изменяется только порядок опроса.
6.3.1 Выполняется при подготовке к работе.
а) Рассмотреть принципы построения и структуру текста программы для микроконтроллеров AVR;
б) Изучить систему команд для микроконтроллеров AVR;
в) Изучить теоретические сведения;
г) Подготовить алгоритм программы в виде блок-схемы;
д) Подготовить исходный текст программы;
е) Отладить программу в среде AvrStudio;
ж) Подготовить текстовый файл программы на электронном носителе.
6.3.2 Выполняется на лабораторном занятии.
а) Отладить программу в среде AvrStudio (если это не удалось при подготовке к работе) и продемонстрировать ее работу;
б) Со своего рабочего места ввести программу в компьютер, скомпилировать и записать в микроконтроллер;
в) Продемонстрировать работу программы на лабораторном стенде;
г) Подготовить распечатку программы с комментариями.