Порядок выполнения работы

Программа, в которой команды выполняются последовательно одна за другой, встречается редко. В подавляющем числе программ используется ветвление по тем или иным условиям. Ассемблер для микроконтроллеров имеет большое разнообразие переходов по условию. По условию возможен переход к какой-нибудь команде или пропуск следующей одной команды. Переход или пропуск команды осуществляется, если условие выполняется. Переход возможен, как вперед (максимум через 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 (если это не удалось при подготовке к работе) и продемонстрировать ее работу;

б) Со своего рабочего места ввести программу в компьютер, скомпилировать и записать в микроконтроллер;

в) Продемонстрировать работу программы на лабораторном стенде;

г) Подготовить распечатку программы с комментариями.