Однокристальные микропроцессоры на примере AVR ATMEGA16
Выбери формат для чтения
Загружаем конспект в формате ppt
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Микропроцессорные
системы
Однокристальные микропроцессоры
на примере AVR ATMEGA16
Вопросы
Способы адресации памяти программ :
Прямая
адресация ПП
Косвенная адресация ПП
Относительная косвенная адресация ПП
При
выполнении
команды
линейной
программы содержимое программного счётчика
увеличивается на 1 (или на 2), т.е. PC:=PC+1
или PC:=PC+2. Это зависит от выполняемой
команды.
При наличии в программе разветвлений,
условных
или
безусловных
переходов,
переходов к
подпрограммам, либо при
возникновении
прерываний
этот
порядок
нарушается.
Адрес
перехода
может
формироваться с использованием прямой или
косвенной адресации.
При прямой адресации программной памяти
адрес перехода записан в коде команды и
занимает одно слово. Этот способ адресации
используется, например, в команде абсолютного
перехода JMP и в команде абсолютного вызова
CALL.
На практике для удобства чтения программы
указываются не абсолютные адреса, а метки, поэтому в
коде команды metka означает физический адрес ячейки
памяти.
Синтаксис:
JMP metka
// команда абсолютного перехода на metka
JMP
PM
$0145
$0146
$0147
JMP
metka
metka
PC
...
metka
КОП
Команда JMP выполняется за 3 машинных такта.
При выполнении команды CALL адрес команды,
расположенной за командой вызова, сохраняется в
стеке типа «LIFO»
При написании программы необходимо
следить, чтобы программа не использовала в
процессе
своей
работы
область
ОЗУ,
выделенную для стека.
В программе следует указать адрес ячейки
ПД, определяющей начало стека (вершину
стека). Для этого в памяти РВВ в качестве
указателя стека используется пара регистров
ввода/вывода SPH:SPL, расположенных по
адресам $3E ($5E) и $3D ($5D) соответственно.
Так как после подачи напряжения питания
(или после сброса) в регистрах содержится
нулевое значение, в самом начале программы
указатель
стека
необходимо
проинициализировать, записав в него адрес
вершины стека, например ($023D):
LDI R16,0x02
OUT SPH,R16
LDI R16,0x3D
OUT SPL,R16
// загрузка в R16 числа 0x02
// пересылка числа 0x02 из R16 в регистр SPH
// загрузка в R16 числа 0x3D
// пересылка числа 0x3D из R16 в регистр SPL
CALL met
РВВ
DM
новое
значение
указателя
стека SP
$3B
$02
$3D
$02
стек
2
$023B
$023C
$023D
$6B
$05
вершина стека
1
$0569
$056A
$056B
CALL
met
...
SP
$3D
$3E
PM
met
met+1
PC
met
3
4
КОП
1) При вызове подпрограмм (например, командой CALL) адрес
команды, расположенной за командой вызова, сохраняется в стеке.
2) Значение указателя стека при этом уменьшается на 2, т. к. для
хранения адреса команд требуется 2 байта.
3) После этого в PC загружается число, являющееся операндом
команды.
4) Выполняется переход по новому адресу.
Команда CALL выполняется за 4 машинных такта.
При косвенной адресации программной
памяти адрес перехода находится в индексном
регистре Z (16-разрядном), поэтому обращение
может осуществляться к любому слову
программной памяти без ограничения.
Такой способ адресации используют команды
IJMP, ICALL. При выполнении команды IJMP
содержимое индексного регистра загружается в
PC, т.е. PC:=[Z].
ICALL
РОН
РВВ
DM
PM
стек
R17
$F1
$02
$22
$01
$0122
$0123
$0124
$6D
$05
1
вершина стека
3
PC
$02F1
4
ICALL
...
...
Z
R30
R31
SP
$3D
$3E
2
$056C
$056D
$02F1
КОП
1) в стек загружается следующий адрес фоновой программы, т.е.
PC:=[PC]+1.
2) содержимое указателя стека уменьшается на 2, т.е. SP:=[SP]-2.
3) в программный счётчик загружается содержимое индексного
регистра Z, т.е. PC:=[Z].
4) Выполняется переход по новому адресу.
LDI R30, $70 // загрузка индексного
LDI R31, $1F// регистра Z
…………......
IJMP // переход к ячейке с адресом $1F70
…………......
CLR R1
// очистка R1
MOV R30, R1
// задать смещение в PМ
ICALL // переход к подпрограмме
// по адресу $1F00
Относительная косвенная адресация памяти
программ используется во всех командах ветвления
(условного перехода).
Переход по заданному адресу осуществляется,
если условие выполняется, т.е. если оно истинно. В
противном
случае
выполняется
переход
к
следующему по порядку адресу программной памяти.
CP R17, R22
BREQ off
// сравнить [R17] и [R22]
// перейти на метку, если [R17] = [R22]; метка off // целое число со знаком в дополнительном коде
// сдвинуть влево содержимое R17 (логический сдвиг)
LSR R17
…………......
…………......
off:
SUBI R22, $A1 // R22:=[R22]-$A1, вычитание числа $A1
PM
Ai+1-63
-63
Ai
Ai+1
A i+1+32
+64
BREQ 32
Адрес
перехода
образуется
путём сложения содержимого
программного
счётчика
с
некоторым
смещением
q,
представленным в коде команды
в виде 7-разрядного кода. Туда
записывается целое число со
знаком.
Ai+1+64
Например, команда BREQ 32 – это условный переход
по «равно», т.е. когда равно содержимое двух регистров
и установился флаг Z в регистре статуса SREG.
В случае если «равно» PC:=[PC]+1+32,
иначе PC:=[PC]+1
В командах RJMP, RCALL под смещение
отведено 11 разрядов и 1 разряд под знак
смещения,
т.е.
максимальная
величина
перехода
составляет
-2027…+2048
слов
относительно адреса команды, следующей за
командой перехода.
При
составлении
программы
следует
учитывать максимальные пределы смещения.
RJMP off_m
// относительный безусловный переход
// к адресу, смещённому на off_m
PC
1+off_m
Am
Am+1
A m+1+Off_m
RJMP off_m
КОП
Am+1+Off_m
RCALL Period5
//относительный вызов подпрограммы,
//расположенной по адресу, смещённому на Period5
РВВ
новый
SP
$3D
$3E
SP=[SP]-2
$EF
$00
$F1
$00
2
старый
SP
$00EE
$00EF
$00F0
$00F1
$24
$0E
PM
1
$0E23 RCALL Period5
$0E24
КОП
3
PC
$0E24+Period5
...
SP
DM
стек
$0E24+Per
КОП
4
Мнемо- Опеника
ранды
RJMP
k
IJMP
JMP
RCALL
k
k
ICALL
CALL
k
Описание
Относительный безусловный
Операции
Флаги Такты
PC ← PC + k + 1
None
2
Косвенный безусловный переход
PC ← Z
None
2
Абсолютный переход
PC ← k
None
3
PC ← PC + k + 1
None
3
Косвенный вызов подпрограммы
PC ← Z
None
3
Абсолютный вызов подпрограммы
PC ← k
None
4
переход
Относительный вызов
подпрограммы
Непосредственная
адресация памяти
программ, команды JMP
и CALL
Относительная
адресация памяти
программ, команды
RJMP и RCALL