Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПСМПС (лаб)

.pdf
Скачиваний:
20
Добавлен:
10.06.2015
Размер:
1.42 Mб
Скачать

71

специальным образом в режиме программирования кристалла с помощью программатора.

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

FFFFh

FFFFh

Внешняя память данных

Внешняя

00FFh

Регистры специальных функций

Младшие 128

007Fh

 

 

 

 

 

ячеек ОЗУ

 

Внутренняя

0FFFh

(прямая адресация)

 

 

 

0000h

Память программ

0000h

Память данных

 

 

Рис. 5.2. Распределение адресов памяти команд и данных микроконтроллера MCS -51

Рассмотрим некоторые важнейшие регистры контроллера. Для обращения к запоминающим устройствам имеется два регистра: программный счетчик PC (program counter) и указатель данных DPTR (data pointer). Пер-

вый используется для чтения команд из ПЗУ, а второй – указатель данных – для чтения данных из ПЗУ и ОЗУ и записи в ОЗУ. Теоретически контроллер может использовать адресное пространство до 64 кБ, однако большинство МК имеют от 2 до 32 кБ ПЗУ. В семействе любых микроконтроллеров имеются модели, снабжаемые многократно перепрограммируемой постоянной памятью с электрическим (FLASH-memory) или ультрафиолетовым стиранием, однако запись в эту память производится только специальным устройством – программатором. Для производства массовых хорошо отлаженных

72

устройств на основе микроконтроллеров используются ПЗУ с возможностью однократного «прожига».

Внутреннее ОЗУ имеет емкость всего 128 байт. Но адресное пространство у него 8-разрядное, то есть 256 байт. Старшие адреса предназначены для обращения к регистрам специальных функций (special function registers), которые позволяют управлять ядром процессора и периферийными устройствами.

Начальные ячейки оперативной памяти (32 байта) используются под однобайтовые регистры общего назначения (general purpose registers), или так называемый регистровый пул: R0, R1, R3, R4, R5, R6 и R7. Их физические адреса зависят от содержимого 3 и 4 разрядов регистра состояния процессора (processor status word) PSW. Распределение адресов для этих групп ячеек, называемых банками 0, 1, 2 и 3, можно представить в виде таблицы

(табл. 5.1):

Таблица 5.1. Распределение адресов для банков регистрового пула

RS1

RS0

R0

R1

R2

R3

R4

R5

R6

R7

(PSW.4)

(PSW.3)

 

 

 

 

 

 

 

 

0

0

00h

01h

02h

03h

04h

05h

06h

07h

0

1

08h

09h

0Ah

0Bh

0Ch

0Dh

0Eh

0Fh

1

0

10h

11h

12h

13h

14h

15h

16h

17h

1

1

18h

19h

1Ah

1Bh

1Ch

1Dh

1Eh

1Fh

При старте контроллера по умолчанию доступен нулевой банк. Адреса от 20h до 7Fh программист может использовать по своему ус-

мотрению. Часть адресного пространства от 80h до FFh занята для обращения к различным устройствам микроконтроллера. Рассмотрим эти устройства, которые представлены в программной модели в виде функциональных регистров.

Большинство функциональных регистров являются 8-разрядными. Для выполнения арифметических и логических операций используется так называемый аккумулятор A (accumulator) или ACC (0E0h). Для умножения и деления используется дополнительный базовый регистр B (base) (0F0h). В зависимости от выполняемой команды в соответствии с результатом операции могут вырабатываться признаки, которые записываются в ранее упомянутый регистр PSW (D0h). Часть адресного пространства, в основном это функциональные регистры и порты в/в, доступна для побитовой адресации, или, как принято говорить, битового процессора. Побитно адресуемым является, в

73

том числе, и регистр PSW. Адреса и назначение отдельных битов этого регистра, которые называются флагами, представлены в виде таблицы (табл. 5.2):

Таблица 5.2. Наименование и функции флагов регистра PSW

Имя

Адрес

Функция

CY

0D7h

перенос из 7-го (старшего) разряда

AC

0D6h

перенос из третьего разряда

F0

0D5h

флаг для программного использования

RS1

0D4h

старший разряд номера банка

RS0

0D3h

младший разряд номера банка

OV

0D2h

переполнение результата

 

0D1h

флаг для программного использования

 

 

(безымянный)

P

0D0h

признак нечетного количества единиц

 

 

в коде результата

Рассмотренный ранее указатель данных DPTR состоит из двух байтов: старшего DPH (83h) и младшего DPL (82h). Обращение к оперативной памяти может производиться также в стековом режиме посредством регистра указателя стека SP (stack pointer) (81h). Мнемонические имена регистров параллельных портов совпадают с обозначениями их выводов: P0 (80h), P1 (90h), P2 (A0h) и P3 (B0h). Последовательный порт производит передачу или прием через регистр буфера последовательного порта SBUF (serial buffer) (99h), а управление режимом его работы производится через биты регистра управления последовательным портом SCON (serial control) (98h). В микро-

контроллере имеется два таймера-счетчика (timer-counter) с номерами 0 и 1, которые могут использоваться как для счета тактовых импульсов (режим таймера), так и для счета импульсов на внешних входах (режим счетчика). Каждый из них имеет регистр для подсчета событий, каждый из которых, в свою очередь, состоит из старшей и младшей байтовых половин TH0 (8Ch), TL0 (8Ah) и TH1 (8Dh), TL1 (8Bh). Для управления режимами таймеров ис-

пользуется регистр управления таймером TCON (timer control) (88h). Для обеспечения работы контроллера с внешними объектами в реальном масштабе времени имеется система прерываний, для управления которой использу-

ется регистр разрешения прерываний IE (interrupt enable) (A8h) и регистр приоритетов прерываний IP (interrupt priority).

74

В момент инициализации микроконтроллера функциональные регистры получают определенные начальные значения, перечень которых представлен в следующей таблице (табл. 5.3).

Таблица 5.3. Состояние функциональных регистров при инициализации контроллера

Имя регистра (ов)

Начальное состояние

ACC, B, PSW, DPH, DPL

00h

SP

07h

P0, P1, P2, P3

FFh

SBUF

xxxxxxxxb

SCON, TH0, TL0, TH1, TL1, TCON

00h

IE

0x000000b

IP

xx000000b

2.3. Форматы и адресация данных микроконтроллеров MCS-51

Микроконтроллер типа MCS-51 работает с данными битового и байтового формата. При обработке данных допускается обращение не только к байтам всех ЗУ, но и к отдельным битам функциональных регистров или части адресного пространства ОЗУ. Программная модель всех процессоров, основанных на архитектуре CISC (микропроцессоры с полным набором команд), в том числе MCS-51, предполагает наличие в системе команд как одно- так и двуоперандных инструкций, выполняемых за один, два или более тактов процессора. При явном использовании двух операндов один называется источником, а другой приемником.

Адресация данных может быть непосредственной (immediate), регист-

ровой (register), косвенной (indirect), индексной (index) и стековой (stack). В

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

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

число 10101101b:

mov P1, #10101101b

В то же время команда

75

mov P1, 10101101b

записывает в P1 содержимое ячейки памяти с адресом 10101101b, то есть использует косвенную адресацию.

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

mov A, R7 mov R1, A

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

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

mov R1, mydata

Для обозначения косвенной адресации используется символ @, за которым следует имя регистра общего назначения или выражение с использованием этих регистров. При косвенной адресации содержимое регистра используется не в качестве данных, а в качестве адреса данных, то есть указателя на данные (pointer). Для косвенной адресации могут использоваться только два регистра общего назначения (R0 и R1) или регистр DPTR. Следующая инструкция позволяет записать значение 100 в ячейку памяти, адрес которой находитсяврегистреR0:

mov @R0, #100

Косвенная адресация обоих операндов не допускается. Нельзя также использовать регистровую адресацию одного операнда и одновременно косвенную адресацию другого операнда.

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

76

Индексная адресация используется только для чтения данных из памяти команд (ПЗУ). Этот способ адресации аналогичен косвенной адресации и записывается в виде @A + PC или @A + DPTR.

Стековая адресация также аналогична косвенной в том смысле, что адрес для обращения к ОЗУ берется из регистра, но в этом случае в качестве указателя используется содержимое регистра стека SP. Отличие состоит в том, что перед записью в ОЗУ содержимое указателя стека автоматически увеличивается на 1, а после чтения автоматически уменьшается на 1. Из-за автоматической коррекции содержимого указателя отпадает необходимость в записи одного из операндов команды. Главное преимущество стековой адресации состоит в том, что ОЗУ образует очередь, которая обслуживается по принципу LIFO.

2.4. Система команд микроконтроллеров MCS-51

Команды могут занимать от одного до трех байтов. Размер команды определяется кодом операции, записанным в первом байте. Дополнительные байты могут содержать адреса и/или данные. При помощи байта кода операции можно закодировать 256 кодов операций, но в MCS-51 используется только 255. Выполнение команд происходит в порядке их следования в памяти. При завершении чтения очередной команды программный счетчик содержит адрес следующей команды. Команды, в результате выполнения которых может быть изменен естественный порядок выполнения, называются управляющими. Передача управления может быть условной или безусловной. Некоторые из условных управляющих команд используют информацию, содержащуюся в слове состояния программы, а другие сами производят сравнение байтов или проверку содержимого битов ОЗУ.

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

2.4.1. Команды пересылки

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

77

Команда MOV (move) копирует содержимое источника в приемник и имеет следующий формат:

mov A, #<src> mov A, Rn mov A, @Ri mov A, <src> mov R<n>, A

mov R<n>, #<src> mov R<n>, <src> mov @R<i>, A

mov @R<i>, #<src> mov @R<i>, <src> mov <dst>, A

mov <dst>, #<src> mov <dst>, R<n> mov <dst>, @R<i> mov <dst>, <src>

Здесь А – аккумулятор, R<n> – содержимое одного из регистров общего назначения, используемое в качестве значения, #<src> – непосредственное значение, @R<i> – содержимое регистров R0 или R1, используемое в качестве адреса, <dst> – адрес ячейки памяти, определенной в сегменте данных.

Для посылки нуля в накопитель проще и эффективнее использовать команду очистки CLR (clear):

clr A ; очистка аккумулятора

Чтение и запись данных байтового формата при обращении к внешнему ОЗУ осуществляется при помощи команд MOVX (move external)

movx A, @R<i> movx A, @DPTR movx @R<i>, A movx @DPTR, A

Чтение данных из ПЗУ осуществляется при помощи команды MOVC:

movс A, @A + DPTR

78

movс A, @A + PC

Эти команды удобны для чтения данных из таблиц ПЗУ.

Для работы со стеком в системе команд имеются две инструкции – PUSH и POP, которые записывают и читают из стека соответственно:

push <src> pop <dst>

Команда XCH (exchange) осуществляет обмен содержимого источника и приемника:

xch A, R<n> xch A, @R<i> xch A, <src>

Для обмена младших половин байтов имеется команда XCHD:

xchd A, @R<i>

Одна из команд пересылки данных МОV записывает два байта в регистр указателя данных:

mov DPTR, #<src>

Других команд для явной пересылки двухбайтовых данных нет.

Несколько команд пересылки информации работают в битовом формате. При этом в команде MOV источником или приемником должен быть бит переноса С:

mov С, <flag> mov <flag>,С

Здесь <flag> – бит регистра, допускающего побитовую адресацию.

Например:

mov C, P1.7

79

Для работы с битами используются специальные команды очистки и установки битов CLR и SETB (set bit):

clr C

clr <flag> setb C setb <flag>

Все команды пересылки не влияют на содержимое слова состояния процессора.

2.4.2.Арифметико-логические команды

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

Команда сложения ADD (addition) работает с данными байтового формата, притом в качестве приемника всегда используется только аккумулятор:

add A, #<src> add A, R<n> add A, @R<i> add A, <src>

Для работы с числами, которые не могут быть представлены одним байтом, используется команда сложения ADDC (addition with carrier), учитывающая перенос, полученный при сложении предыдущей пары байтов.

Имеется также команда инкремента операнда INC (increment):

inc A inc R<n> inc @R<i> inc <src>

80

Команда вычисления разности SUBB (subtraction with borrow) существует только в варианте вычитания c заемом (от результата вычитается содержимое бита переноса)

subb A, #<src> subb A, R<n> subb A, @R<i> subb A, <src>

Команды умножения и деления используют всегда в качестве операндов только содержимое аккумулятора и регистра В. Для команды умножения порядок операндов не имеет значения:

mul AB

Результат операции имеет двухбайтовый формат. Младший байт произведения записывается в накопитель, а старший – в регистр В.

Для команды деления делимое должно быть записано в аккумулятор, а делитель – в регистр В:

div AB

После выполнения команды в аккумуляторе находится частное, а в регистре В – остаток.

2.4.3.Команды передачи управления

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

Наиболее простыми командами из этой группы являются инструкции безусловных переходов, которые могут осуществлять передачу управления в пределах 256 байт, 2 кбайт и 64 кбайт адресов. В соответствии с этим различают команды короткого (относительного), абсолютного и длинного безусловных переходов SJMP, AJMP и LJMP (jump), которые в качестве операнда получают адрес перехода:

sjmp <rel> ajmp <addr11> ljmp <addr16>