Методические указания к практическому заданию 1 страница

Практическое задание

Программа, в которой команды выполняются последовательно одна за другой, встречается редко. В подавляющем числе программ используется ветвление по тем или иным условиям. Ассемблер для микроконтроллеров имеет большое разнообразие переходов по условию. По условию возможен переход к какой-нибудь команде или пропуск следующей одной команды. Переход или пропуск команды осуществляется, если условие выполняется. Переход возможен, как вперед (максимум через 63 команды), так и назад (максимум через 64) команды.

Программа микроконтроллера выполняется последовательно команда за командой. После выполнения последней команды, программа начинает выполняться с самого начала автоматически. Для того, чтобы программа выполнялась с нужного места, необходимо использовать команду безусловного перехода.

Если провести аналогию с языками высокого уровня, где используется понятие «переменная», то в ассемблере для микроконтроллера переменной является любой регистр общего назначения, любой регистр I/O и любая ячейка памяти ОЗУ. Содержимое их может изменяться. В общем случае при программировании для регистров общего назначения и регистров I/O используются стандартные имена, но любому из этих элементов, в том числе ячейкам ОЗУ, можно присвоить индивидуальное имя. Константа является числом и не может изменяться, хотя и ей тоже можно присвоить индивидуальное имя.

INCLUDE – вставить другой файл

DEF – присвоить имя регистру

ORG - установить адрес начала программы или подпрограмм прерывания.

CSEG - сегмент кодов (Code segment).

Директива CSEG указывает на начало сегмента кодов (программы). Ассемблируемый файл может иметь несколько кодовых сегментов, которые будут объединены в один при ассемблировании. Директива не имеет параметров.

Синтаксис: .CSEG

Директива ORG устанавливает начальный адрес сегментов данных и кода (программы). По этому адресу обычно размещается команда безусловного перехода, указывающая на адрес начала программы или подпрограммы прерывания. Используется только совместно с директивами .CSEG, .DSEG, .ESEG.

Синтаксис: .ORG физический адрес

Например: .CSEG

.ORG $06

rjmp reset

 

Директива DEF позволяет присвоить символическое имя регистрам общего назначения и регистрам ввода/вывода (I/O). Один и тот же регистр может иметь несколько символических имен.

Синтаксис: .DEF имя = регистр

Например: .DEF temp = R16
.DEF time = R16

Директива INCLUDE указывает ассемблеру подключить этот файл к компилируемой программе. Ассемблер будет компилировать этот файл до конца или до директивы EXIT. Подключаемый файл может сам включать директивы INCLUDE.

Синтаксис: .INCLUDE "имя файла"
Например: .INCLUDE "8535def.inc "

 

Для первой программы предлагается упрощенная структура (шаблон) построения программы, в которой представлены обязательный минимальный набор команд и директив. Полный шаблон приведен в приложении.

 

;*******************************************

; название программы,

; краткое описание, необходимые пояснения

;*******************************************

.include “8535def.inc” ; файл описания AT90S8535.

;******сегмент кодов

.cseg

;****** вектор прерываний

.org $00 ; адрес начала программы в памяти программ.

rjmp nacalo ; прерывание по сбросу и включению питания.

 

.org $30 ; адрес начала основной программы в памяти программ.

;

 

;*******начало основной программы

nacalo:

… ; программирование портов I/O и других устройств

… ; микроконтроллера

programma:

… ; текст основной программы

 

rjmp programma: ; переход на начало текста основной программы.

; конец программы (никак не обозначается).

 

Переход может быть осуществлен:

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

 

Роботу цифрового устройства можно описать различными способами: словесно, таблицей истинности, аналитическим выражением. В каждом случае алгоритм реализации будет различным.

В первом случае можно разработать несколько разных алгоритмов. Эти алгоритмы будут наиболее «человечными» из перечисленных.

Во втором случае предполагается реализация таблицы истинности. Таблицу истинности можно рассматривать, как массив входных переменных и массив функций (выходного кода), где каждому элементу массива входных переменных однозначно соответствует элемент массива функций (выходного кода). Алгоритм реализации в этом случае будет одинаковым для всех цифровых устройств. Различие будет только в размерах массивов.

В третьем случае предполагается реализация аналитического выражения, которое и представляет собственно алгоритм. Здесь предполагается в основном использовать группу логических команд. Определенную трудность здесь представляет реализация динамических схем.

Рассмотрим два примера программной реализации цифровых устройств.

Пусть необходимо реализовать классический полный шифратор 4 в 2. Входы шифратора соответствуют выводам (портам) микроконтроллера: 0 – А0, 1 – А1, 2 – В3, 3 – В5. Выходы шифратора соответствуют выводам (портам) микроконтроллера: 1 – С0, 2 – С1.

Как известно, полный шифратор имеет n выходов и 2 n входов. Алгоритм работы шифратора следующий: на выходе устанавливается комбинация, выражающая в двоичном коде номер входа, на который подан активный уровень. Пусть в данном случае активный уровень 1. Нумерация входов начинается с нуля. Условное графическое обозначение такого шифратора показано на рисунке 6.1. На нем обозначены номера входов и соответствующие им номера портов микроконтроллера, а также весовые коэффициенты выходов.

 
 

 

 


 

Рисунок 3.1

 

Таблица 6.7. Таблица истинности шифратора

  Входные переменные Функции выхода
I3 I1 I0 A2 A1

 

Аналитическое выражение, полученное из таблицы истинности:

После минимизации:

или или

 

Словесное описание шифратора можно реализовать с помощью нескольких алгоритмов.

Самый прямолинейный и, естественно, не самый рациональный следующий. Входная комбинация сначала сравнивается с комбинацией № 0 (0001). Если они равны, то на выходе устанавливается 00 и программа завершает работу, если не равны, то на выходе ничего не устанавливается, а входная комбинация сравнивается с комбинацией № 1 (0010) и т. д. Чем больше возможное число комбинаций входных переменных, тем длиннее становится программа. Но при малом числе входных комбинаций такой способ построения алгоритма может оказаться и рациональным. Кроме того, этот принцип построения алгоритма одинаков для разных цифровых устройств.

Блок-схема алгоритма такой прямолинейной программы показана на рисунке 3.2.

Программирование портов I/O было подробно рассмотрено в предыдущей лабораторной работе и комментариев не требует.

 

 
 

 

 


да

 

Рисунок 3.2 Блок-схема алгоритма первого варианта программы

 

Для снятия неопределенности выходной комбинации и предотвращения возможных сбоев до первого ее определения программой, значение начальной выходной комбинации необходимо задать предварительно.

Опрос портов заключается в переносе информации из входного регистра PIN в один из регистров общего назначения. Это обусловлено тем, что проводить анализ и выполнять операции непосредственно в регистрах порта I/O нельзя (кроме операций над отдельными битами). Кроме того, если в процессе выполнения программы входная информация изменятся, то это может привести к сбою программы или неправильной ее работе.

Компоновка входной информации из отдельных битов в один байт нужна в случае подачи входной информации на линии различных портов. В практике этого в большинстве случаев удается избежать и использовать соседние линии одного порта ( например, для входов шифратора использовать линии А0, А1, А2, А3 ). В данном задании так сделано специально, чтобы рассмотреть наиболее общий возможный вариант.

Переход в конце программы сделан не к блоку программирования портов, а к блоку опроса портов для того, чтобы программирование портов I/O происходило только один раз при начальном пуске программы, а не повторялось при каждом новом цикле работы. Это ускоряет работу программы.

Текст программы, составленный по этой блок-схеме алгоритма:

 

;*******************************************

; классический шифратор 4 в 2. Прямолинейное решение с тестированием

; байтов

; вход В5, В3, А1, А0, выход С1, С0.

;*******************************************

.include “8535def.inc” ; файл описания AT90S8535.

.cseg

.org $00 ; адрес начала программы в памяти программ.

rjmp nacalo ; прерывание по сбросу и включению питания.

.org $30 ; адрес начала основной программы в памяти программ.

nacalo: ;начало основной программы

;******************** программирование портов I/O

LDI R16,$00

OUT PORTC,R16 ; начальная выходная комбинация

OUT DDRA,R16 ; программирование порта А на вход

OUT DDRB,R16 ; программирование порта В на вход

LDI R17,$FF

OUT DDRC, R17 ; программирование порта С на выход

PROGRAMMA:

;******************* опрос портов I/O

IN R16,PINA ; поместить входные данные из порта А в R16

IN R17,PINB ; поместить входные данные из порта В в R17

;******************* компоновка входной информации в один байт

BST R17,3 ; перемещение бита В3 в бит 2 регистра R16

BLD R16,2 ; через флаг Т регистра статуса

BST R17,5 ; перемещение бита В5 в бит 3 регистра R16

BLD R16,3 ; через флаг Т регистра статуса

ANDI R16,$0F ; обнуление четырех старших бит регистра R16

;***************** первое сравнение

CPI R16,$01 ; сравнить входную комбинацию с кодом 0001

BRNE SLED1 ; если нет равенства перейти на метку SLED1 для

; дальнейшего сравнения

;************* отправка комбинации 00 на выход

LDI R18,$00

OUT PORTC,R18 ; отправить комбинацию 00 на выход, если есть ра-

; венство

RJMP PROGRAMMA ; перейти на метку PROGRAMMA для нового оп-

;роса входа

;************** второе сравнение

SLED1:

CPI R16,$02

BRNE SLED2

;************* отправка комбинации 01 на выход

LDI R18,$01

OUT PORTC,R18

RJMP PROGRAMMA

;*************** третье сравнение

SLED2:

CPI R16,$04

BRNE SLED3

;************* отправка комбинации 10 на выход

LDI R18,$02

OUT PORTC,R18

RJMP PROGRAMMA

;*************** четвертое сравнение

SLED3:

CPI R16,$08

BRNE PROGRAMMA ; если нет равенства, перейти на метку

;PROGRAMMA для нового опроса входа

;************* отправка комбинации 11 на выход

LDI R18,$03

OUT PORTC,R18

RJMP PROGRAMMA ; переход на начало цикла опроса входа

 

Более рациональный способ построения алгоритма основывается на особенностях, присущих программируемому цифровому устройству.

Особенность шифратора в том, что во входной комбинации единица присутствует всегда только в одном разряде, а выходная комбинация - это числа в двоичном коде. Поэтому можно тестировать отдельные биты входной комбинации, а не всю входную комбинацию. Это исключает операции компоновки входной информации. В остальном алгоритм работы остается прежним

 

 

 
 

 


 

 

Рисунок 3.3 Блок-схема алгоритма второго варианта программы

 

Блок-схема алгоритма такой программы показана на рисунке 6.3.

Текст программы, составленный по этой блок-схеме алгоритма:

 

;*******************************************

; классический шифратор 4 в 2. Прямолинейное решение с тестированием

; отдельных битов. Вход В5, В3, А1, А0, выход С1, С0.

;*******************************************

.include “8535def.inc” ; файл описания AT90S8535.

.cseg

.org $00 ; адрес начала программы в памяти программ.

rjmp nacalo ; прерывание по сбросу и включению питания.

.org $30 ; адрес начала основной программы в памяти программ.

 

nacalo: ;начало основной программы

;******************** программирование портов I/O

LDI R16,$00

OUT PORTC,R16 ; начальная выходная комбинация

OUT DDRA,R16 ; программирование порта А на вход

OUT DDRB,R16 ; программирование порта В на вход

LDI R17,$FF

OUT DDRC, R17 ; программирование порта С на выход

 

PROGRAMMA:

;***************** опрос портов I/O

IN R16,PINA ; поместить входные данные из порта А в R16

IN R17,PINB ; поместить входные данные из порта В в R17

;***************** первое тестирование

SBRC R16,0 ; тестирование бита А0 на нулевое значение

RJMP SLED0 ; если значение 1, то перейти на метку SLED0

; если 0, то выполнить следующую команду

;***************** второе тестирование

SBRC R16,1 ; тестирование бита А1 на нулевое значение

RJMP SLED1

;***************** третье тестирование

SBRC R17,3 ; тестирование бита В3 на нулевое значение

RJMP SLED2

;***************** четвертое тестирование

SBRC R17,5 ; тестирование бита В5 на нулевое значение

RJMP SLED3

RJMP PROGRAMMA

;************* отправка комбинации 00 на выход

SLED0:

LDI R18,$00

OUT PORTC,R18 ; отправить комбинацию 00 на выход

RJMP PROGRAMMA ; перейти на метку PROGRAMMA для нового оп-

;роса входа

;************* отправка комбинации 01 на выход

SLED1:

LDI R18,$01

OUT PORTC,R18

RJMP PROGRAMMA

;************* отправка комбинации 10 на выход

SLED2:

LDI R18,$02

OUT PORTC,R18

RJMP PROGRAMMA

;************* отправка комбинации 11 на выход

SLED3:

LDI R18,$03

OUT PORTC,R18

RJMP PROGRAMMA

Из анализа приведенных программ видно, что одна и та же последовательность команд выполняется четыре раза. Если удастся применить цикл, то программа будет короче. Ассемблер микроконтроллера AVR не позволяет использовать бит в качестве переменной и перебор битов в цикле напрямую организовать нельзя. Но если использовать команды сдвига и тестировать только один фиксированный бит, то цикл организовать возможно.

Блок-схема алгоритма программы с циклом показана на рисунке 6.4.

Первые три блока алгоритма программы с циклом аналогичны блокам программы прямолинейного решения с тестированием байтов (первая программа).

В блоке задания числа циклов и первой выходной комбинации выбирается регистр для счетчика циклов и задается число циклов, в данном случае 4.

Цикл организован следующим образом. Производится опрос нулевого бита регистра общего назначения R16. Если его значение 0, то осуществляется сдвиг регистра R16 на один разряд вправо (в сторону младших разрядов). Если его значение 1, то на выход подается подготовленная перед началом цикла комбинация или комбинация, подготовленная в предыдущем цикле, и только после этого осуществляется сдвиг регистра R16 на один разряд вправо (в сторону младших разрядов). После этого осуществляется подготовка следующей выходной комбинации вне зависимости от результатов сравнения. Затем осуществляется процедура определения окончания цикла. Если были проверены все четыре возможные комбинации, то происходит выход из цикла и переход к новому опросу портов I/O.

В данном алгоритме предполагается, что на вход будут подаваться только корректные комбинации. В случае подачи некорректной комбинации (например 0110) программа может выдать неправильный результат. Студентам предлагается самостоятельно разобраться, какой это будет результат и что надо сделать, чтобы программа работала правильно.

 

 

 
 

 

 


Рисунок 3.4 Блок-схема алгоритма третьего варианта программы

 

Текст программы, составленный по этой блок-схеме алгоритма:

 

;*******************************************

; классический шифратор 4 в 2. Решение с помощью организацией цикла

; вход В5, В3, А1, А0, выход С1, С0.

;*******************************************

.include “8535def.inc” ; файл описания AT90S8535.

.cseg

.org $00 ; адрес начала программы в памяти программ.

rjmp nacalo ; прерывание по сбросу и включению питания.

.org $30 ; адрес начала основной программы в памяти программ.

 

nacalo: ;начало основной программы

;******************** программирование портов I/O

LDI R16,0

OUT PORTC,R16 ; установка начальной выходной комбинации

OUT DDRA,R16 ; программирование порта А на вход

OUT DDRB,R16 ; программирование порта В на вход

LDI R17,$FF

OUT DDRC, R17 ; программирование порта С на выход

PROGRAMMA:

;******************* опрос портов I/O

IN R16,PINA ; поместить входные данные из порта А в R16

IN R17,PINB ; поместить входные данные из порта В в R17

;******************* компоновка входной информации в один байт

BST R17,3 ; перемещение бита В3 в бит 2 регистра R16

BLD R16,2 ; через флаг Т регистра статуса

BST R17,5 ; перемещение бита В5 в бит 3 регистра R16

BLD R16,3 ; через флаг Т регистра статуса

;******************* задание начальной комбинации счетчика циклов

LDI R19,0 ; первая выходная комбинация

LDI R18, 4 ; установка счетчика циклов

;****************** цикл

CIKL:

SBRC R16,0 ; тестирование бита 0 регистра R16 и пропуск следую-

; щей команды, если он равен 0

OUT PORTC,R19 ; вывод выходной комбинации

LSR R16 ; сдвиг вправо для подготовки теста следующего бита

INC R19 ; формирование следующей выходной комбинации

DEC R18 ; уменьшение счетчика циклов на 1.

CPI R18,0 ; проверка числа выполненных циклов.

BRNE CIKL ; переход на начало цикла, если заданное число циклов

; не выполнено

RJMP PROGRAMMA ; переход для нового опроса входа

 
 

 


Рисунок 3.5 Блок-схема алгоритма четвертого варианта программы

 

Программная реализация цифрового устройства, заданного таблицей истинности возможна различными методами. Рассмотренный прямолинейный метод построения программы работы шифратора по сути и основан на реализации таблицы истинности. Более рационально программа реализации таблицы истинности в общем случае может быть построена, если использовать способ косвенной адресации.

Блок-схема алгоритма программы с использованием массива и косвенной адресации показана на рисунке 3.5.

Программирование портов I/O осуществляется аналогично предыдущем программам.

Массив входных переменных и массив выходных кодов формируется в ОЗУ в соответствии с таблицей 6.7. Физический адрес начала ОЗУ $60, поэтому начальный адрес массивов должен быть старше. Начальный адрес массива входных переменных принят 100 ($64), начальный адрес массива выходных кодов принят 104 ($68).

Опрос портов I/O и компоновка входной информации из отдельных битов в один байт в регистре R16 аналогична предыдущим программ.

В блоке задания начальных адресов массивов в ОЗУ в регистр косвенной адресации Х (R27,R26) заносится адрес первого элемента массива входных переменных.

Цикл организован следующим образом. Первый элемент массива входных переменных пересылается в регистр R17 и сравнивается с текущей входной комбинацией, которая находится в регистре R16. Если эти значения равны, то в порт I/O отправляется из массива выходной код, адрес которого вычисляется в регистре косвенной адресации Х. Адрес элемента массива входных переменных и адрес соответствующего ему элемента массива выходных кодов смещены относительно друг друга на 4 адреса. Поэтому вычисление производится путем прибавления числа 4 к содержимому регистра Х (R26). Если значения регистров R16 и R17 не равны, то в регистре X устанавливаются следующий по порядку адрес элемента массива входных переменных и цикл сравнения повторяется.

Текст программы, составленный по этой блок-схеме алгоритма:

 

;*******************************************