Микроконтроллеры MCS51Программная модель. Организация памяти. Микроконтроллеры семейства МСS–51 построены по гарвардской архитектуре, в которой память программ и память данных разделе­ны, имеют собственные адресные пространства и способы доступа к ним.

Память программ. Максимальный объем памяти составляет 64К байт, из них 4К, 8К, 16К или 32К байт памяти (табл. 7.3.1) располагаются на кристалле, остальной объем — вне кристалла. При напряжении на выводе ЕА = VCC использу­ется как внутренняя, так и внешняя память, при ЕА = VCC = 0 — только внешняя па­мять. В табл. 7.3.1 приведены адреса обращения к памяти программ для указан­ных случаев.

Нижняя область памяти программ отводится для начала работы микроконт­роллера (стартовый адрес 0000h после сброса) и под обработку прерываний (ад­реса прерываний расположены с интервалом 8 байт: 0003h, 000Bh, 0013h и т. д.).

табл. 7.3.1

Память программ доступна только для чтения, причем при обращении:

●     к внешней памяти программ вырабатывается сигнал ¯PSEN и всегда формиру­ется 16–разрядный адрес. Младший байт адреса передается через порт P0 в первой половине машинного цикла и фиксируется по срезу строба ALE в регистре. Во второй половине цикла порт P0 используется для ввода в МК байта данных из внешней памяти. Старший байт адреса передается через порт P2 в течение всего времени обращения к памяти (рис. 7.1.11);

●     к внутренней памяти сигнал чтения не формируется и используются циклы обмена по внутренней шине микроконтроллера.

Память данных. Внутреннюю память данных можно условно разделить на три блока (табл. 7.3.2).

табл. 7.3.2

Внутренняя память всегда адресуется байтом, который обеспечивает адреса­цию только к 256 ячейкам памяти. Поэтому, как видно из табл. 7.3.2, для адреса­ции к верхним 8–битным ячейкам внутреннего ОЗУ и регистрам специальных фун­кций SFR, занимающим одно и то же адресное пространство, в командах исполь­зуются разные способы адресации: косвенный и прямой.

Особенности организации нижней области внутреннего ОЗУ отражены в табл. 7.3.3.

Младшие 32 байта внутреннего ОЗУ с адресами 00h...1Fh сгруппированы в че­тыре банка по восемь регистров (R0...R7). Следующие 16 байтов ОЗУ с адресами 20h...2Fh представляют собой область памяти объемом 8x16= 128 бит, которая допускает обращение к каждому отдельному биту.

Для выбора адреса регистра банка используется его имя R0...R7, для выбора банка — биты RS0, RS1 регистра слова состояния PSW. Адреса битов приведены в табл. 7.3.3. Адресация осуществляется прямым способом.

табл. 7.3.3

Список всех регистров специальных функций SFR с их адресами дан в табл. 7.2.2. Для наглядности в табл. 7.3.4 приведена карта адресов ре­гистров SFR рассматриваемых микросхем семейства MCS–51. Адрес SFR опреде­ляется совокупностью цифр столбца и строки в шестнадцатеричной системе счисления. Например, регистр CMOD имеет адрес D9h.

табл. 7.3.4

Для регистров SFR, адреса которых оканчиваются на 0h или 8h (они выделены полужирным шрифтом), помимо байтовой допускается побитовая адресация. При этом адрес бита, занимающего в регистре N–й разряд, определяется как XXh + 0Nh, где XXh — адрес регистра SFR, N = 0...7. Битовые адреса в этой облас­ти имеют значения от 80Н до FFH. Например, адреса битов аккумулятора АСС ле­жат в пределах E0h...E7h.

Внешняя память данных (объемом до 64 Кбайт) создается дополнительными микросхемами памяти, подключаемыми к МК. Для работы с внешней памятью данных используются специальные команды, поэтому адресные пространства внешней и внутренней памяти не пересекаются и, следовательно, оба вида памя­ти данных можно задействовать одновременно. Для обращения к ячейкам внеш­ней памяти данных используются (рис. 7.1.8):

●     команды с косвенной адресацией;

●     сигналы чтения ¯RD и записи ¯WR;

●     порт P0 для передачи младшего байта адреса и приема/передачи байта данных;

●     порт P2 для передачи старшего байта адреса.

Способы адресации. В системе команд используется:

●     прямая, косвенная, регистровая, косвенно–регистровая, непосредственная и индексная адресация (косвенная адресация по сумме базового и индексно­го регистров) операндов–источников;

●     прямая, регистровая и косвенно–регистровая адресация операндов назначения. Сочетание указанных способов (адресации) обеспечивает 21 режим адресации.

В этой и в приведенных ниже таблицах системы команд использованы следу­ющие обозначения:

Прямая адресация. При этом способе адресации место расположения байта или бита данных определяется 8–битным адресом второго (и третьего) бай­та команды. Прямая адресация используется только для обращения к внутренней памяти данных (нижним 128 байтам ОЗУ) и регистрам специальных функций.

Регистровая адресация. Этот способ адресации обеспечивает доступ к данным, которые хранятся в одном из восьми регистров R0...R7 текущего банка рабочих регистров. Его также можно использовать для обращения к регистрам A, В, АВ (сдвоенному регистру), регистру–указателю DPTR и флагу переноса С. Адрес указанных регистров заложен в код операции, благодаря чему сокращает­ся число байт команды.

Косвенно–регистровая адресация. В этом случае адрес данных хра­нится в регистре–указателе, место расположения которого определено кодом операции. Данный способ адресации используется для обращения к внешнему ОЗУ и верхней половине внутреннего ОЗУ. Регистрами–указателями 8–битных ад­ресов могут служить регистры R0, R1 выбранного банка рабочих регистров или указатель стека SР, для 16–битной адресации используется только регистр указа­теля данных DPTR.

Непосредственная адресация. При этом способе адресации данные непосредственно указаны в команде и находятся во втором (или во втором и тре­тьем) байтах команды, т. е. не требуется адресация к памяти. Например, по ко­манде МОV A,#50 в аккумулятор A загружается число 50.

Индексная адресация. Этот способ представляет собой косвенно–реги­стровую адресацию, при котором адрес байта данных определяется как сумма содержимого базового (DPTR или РС) и индексного (А) регистров. Способ ис­пользуется только для доступа к программной памяти и только в режиме чтения; он упрощает просмотр таблиц, зашитых в памяти программ.

Структура команд. Длина команды составляет один (49 команд), два (45 ко­манд) или три (17 команд) байта. Первый байт команды всегда содержит код опе­рации (КО), A второй и третий байты — адреса операндов или непосредственные значения данных. В качестве операндов могут быть использованы отдельные биты, тетрады, байты и двухбайтные слова. Можно выделить 13 типов команд, ко­торые приведены в табл. 7.3.5:

табл. 7.3.5

●     A, PC, SP, DPTR, Rn (n = 0, ..., 7) — аккумулятор, счетчик команд, указатель стека, регистр указателя данных и регистр текущего банка;

●     Rm (m = 0, 1) — регистр текущего банка, используемый при косвенной адре­сации;

●     direct — 8–разрядный адрес прямо адресуемого операнда;

●     bit — адрес прямо адресуемого бита;

●     rel — относительный адрес перехода;

●     addr11, addr16 — 11– и 16–разрядный абсолютный адрес перехода;

●     #data8, #data16 — непосредственные данные (операнды) 8– и 16–разрядной длины;

●     A10, A9, ..., A0 — отдельные разряды 11–разрядного адреса;

●     (...) — содержимое ячейки памяти по адресу, указанному в скобках;

●     СБ, МБ — старший и младший байты 16–разрядного операнда.

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

Для описания команд используется язык макроассемблера ASM51. Синтаксис большинства команд состоит из мнемонического обозначения (аббревиатуры) выполняемой операции, за которым следуют операнды. С помощью операндов указываются различные способы адресации и типы данных. В частности аббреви­атура MOV имеет 18 различных команд, предназначенных для обработки трех ти­пов данных (битов, байтов, адресов) в различных адресных пространствах. Набор команд имеет 42 мнемонических обозначения 111 типов команд для конкрети­зации 33 функций МК. Из 111 команд 64 выполняются за один машинный цикл, 45 — за два цикла и лишь две команды (MUL — умножение и DIV — деление) вы­полняются за 4 цикла. При частоте тактового генератора 12 МГц длительность машинного цикла (12 тактов) составляет 1 мкс.

По функциональному признаку команды можно разбить на пять групп. Ниже приведено описание команд каждой группы, представленных в виде таблиц. Для компактности таблиц выделим группу команд (табл. 7.3.6), выполнение которых влияет (помечены знаком +) на состояние флагов регистра слова состояния PSW.

табл. 7.3.6

Команды пересылки данных. Команды пересылки можно разбить на отдель­ные подгруппы.

Команды пересылки и обмена данными между ячейками внутрен­ней памяти (табл. 7.3.7). Команды 1–16, имеющие мнемонику MOV dest, src, предназначены для пересылки байта или двух байтов (команда 16) данных из ис­точника src в приемник dest, при этом:

●     для указания источника (src) используется четыре способа адресации: регист­ровый (команды 2–4, 6, 8), прямой (команды 1, 7, 9, 11), косвенный (команды 5, 10) и непосредственный (команды 12–16);

●     для указания приемника (dest) используется три способа: регистровый (команды 1, 3...5, 9, 12, 14, 16), прямой (команды 2, 7, 8, 10, 13), косвенный (команды 6, 11, 15).

табл. 7.3.7

Команды 17–20 обеспечивают обмен информацией между двумя ячейками внутренней памяти данных (или двустороннюю пересылку). При выполнении ко­манд ХСН происходит обмен байтами, A команды XCHD — младшими тетрадами байтовых операндов. Одной из ячеек всегда является аккумулятор A. В качестве другой ячейки при обмене байтами используется один из регистров Rn текущего банка, A также прямо или косвенно адресуемая ячейка внутренней памяти; при обмене тетрадами — только косвенно адресуемая ячейка внутренней памяти.

Так как во всех МК стек размещается во внутреннем ОЗУ, в эту же подгруппу включены команды (20, 21) обращения к стеку PUSH src, POP dest. Эти команды ис­пользуют только прямой способ адресации, записывая байт в стек или восстанав­ливая его из стека. Следует иметь в виду, что в тех МК, у которых в ОЗУ отсут­ствуют верхние 128 байт, увеличение стека за пределы 128 байт ведет к потере данных.

Команды пересылки данных между внутренней и внешней па­мятью данных (табл. 7.3.8). Эти команды используют только косвенную адре­сацию, при этом однобайтный адрес может располагаться в Р0 или R1 текущего банка регистров, A двухбайтный адрес — в регистре–указателе данных DРТR. При любом доступе к внешней памяти роль приемника или источника операндов во внутренней памяти играет аккумулятор А.

табл. 7.3.8

Команды пересылки данных из памяти программ (табл. 7.3.9). Эти команды предназначены для чтения таблиц из программной памяти. Команда MOVC A,@А + DPTR используется для обращения к таблице с числом входов от 0 до 255. Номер требуемого входа в таблицу загружается в аккумулятор, A регистр DPTR устанавливается на точку начала таблицы. Отличительной особенностью другой команды является то, что в качестве указателя базы используется про­граммный счетчик PC и обращение к таблице производится из подпрограммы. Вначале номер требуемой точки входа загружается в аккумулятор, затем вызыва­ется подпрограмма с командой MOVC  A,@А + PC. Таблица может иметь 255 вхо­дов с номерами от 1 до 255, так как 0 используется для адреса команды RET вы­хода из подпрограммы.

табл. 7.3.9

Команды арифметической обработки данных. Все арифметические коман­ды выполняются над беззнаковыми целыми числами.

Операции над двумя операндами (табл. 7.3.10). В операциях сложе­ния ADD, сложения с учетом переноса ADDC и вычитания с учетом заема SUBB:

табл. 7.3.10

●     источником одного 8–битного операнда и приемником результата служит ак­кумулятор;

●     источником другого операнда — либо один из рабочих регистров Rn (n = 0–7) текущего банки, либо прямо direct или косвенно @Rm (m = 0, 1) адресуемая ячейка памяти ОЗУ, либо непосредственные данные #data.

Операции умножения MUL и деления DIV выполняются над содержимым реги­стров A и В. При умножении старшие 8 разрядов результата записываются в ре­гистр В, младшие 8 разрядов — в регистр A. Если произведение больше 255, устанавливается флаг переполнения OV; флаг переноса С всегда сбрасывается. Команда DIV выполняет деление 8–битного операнда аккумулятора A на 8–битный операнд регистра В. При делении частное (старшие разряды) записывается в ре­гистр в A, остаток (младшие разряды) — в B. Флаги переноса C и переполнения OV сбрасываются. При попытке деления на 0 устанавливается флаг переполнения OV. Операция деления чаще используется для сдвигов и преобразования оснований чисел. При делении двоичного числа на 2N происходит его сдвиг на N бит влево. Лишние биты переносятся в регистр В.

Операции над однобайтными операндами (табл. 7.3.11). Команда DA используется для выполнения двоично–десятичных операций.

Команды INC, DEC позволяют соответственно увеличить или уменьшить на единицу содержимое ячейки памяти. Они применимы к содержимому аккумулято­ра A, одного из рабочих регистров Rn или ячейки памяти, адресуемой как пря­мым, так и косвенным способом. Операция увеличения на единицу применима также к содержимому 16–разрядного регистра–указателя DPTR.

табл. 7.3.11

Команды логических операций. Двуместные операции (табл. 7.3.12). Команды AML, ORL, XRL позволяют выполнить три двуместные логические операции над 8–битными операндами: ANL — логическое умножение (AND), ORL — ло­гическое сложение (OR), XRL — исключающее ИЛИ (XOR). Операции выполняются над отдельными битами операндов. Источником одного из операндов и одновре­менно приемником результата служит либо аккумулятор (А), либо прямо адресу­емая ячейка памяти (direct). Для источника другого операнда используется реги­стровый, прямой, косвенный или непосредственный способ адресации.

табл. 7.3.12

Одноместные операции (табл. 7.3.13). В состав группы входит также ряд одноместных операций над содержимым аккумулятора A: операции очистки (CLR), логического дополнения или инверсии (CPL), циклического и расширенного циклического сдвигов на 1 бит вправо (RL, RLC) и влево (RR, RRC), обмена тетрад или циклического сдвига байта на 4 разряда (SWAP), A также пустая операция (NOP), в результате которой состояние всех регистров МК (за исключением про­граммного счетчика) остается неизменным.

табл. 7.3.13

Команды передачи управления. Команды безусловного перехода (табл. 7.3.14). Команды 1–3 отличаются лишь форматом адреса назначения. Ко­манда LJMP (LLong) выполняет «длинный» безусловный переход по указанному адресу addr16, загружая счетчик PC вторым и третьим байтами команды. Команда обеспечивает переход в любую точку 64К байтного адресного пространства. Ко­манда AJMP (А — Absolute) обеспечивает «абсолютный» переход по адресу внутри 2К байтной страницы, начальный адрес которой задается пятью старшими разря­дами программного счетчика PC (вначале содержимое PC увеличивается на 2). Команда SJMP (SShort) позволяет осуществить «короткий» безусловный переход по адресу, который вычисляется сложением смещения rel со знаком во втором байте команды с содержимым счетчика PC, предварительно увеличенного на 2. Адрес перехода находится в пределах –128...+127 байт относительно адре­са команды. Для перехода в любую другую точку 64–килобайтного адресного про­странства может быть использована также команда 4 с косвенной @A+DPTR адре­сацией. В этом случае содержимое A интерпретируется как целое без знака.

табл. 7.3.14

Пустая операция (NOP), в результате которой состояние всех регистров мик­ропроцессора (за исключением программного счетчика) остается неизменным.

Команды условного перехода (табл. 7.3.15). С помощью команд JZ и JNZ осуществляется переход, если содержимое аккумулятора соответственно равно или не равно нулю. Адрес перехода вычисляется путем сложения относительного знакового смещения rel с содержимым счетчика команд PC после прибавления к нему числа 2 (длины команды в байтах). Содержимое аккумулятора остается не­изменным. Команды на флаги не влияют.

табл. 7.3.15

Команды CJNE (3–6) служат для реализации условного перехода по результату сравнения двух 8–разрядных операндов, расположение которых указано в коман­дах. Если их значения не равны, осуществляется переход. Адрес перехода вычис­ляется сложением смещения rel с содержимым счетчика PC, предварительно уве­личенным на 3. В противном случае выполняется следующая команда. В графе Алгоритм показано влияние значений сравниваемых 8–разрядных операндов на флаг переноса С.

Команды DJNZ (7, 8) предназначены для организации программных циклов. Регистр Rn или прямо (direct) адресуемая ячейка представляют собой счетчик по­вторений цикла, A смещение rel (во втором и третьем байтах команд) — относи­тельный адрес перехода к началу цикла. При выполнении команд содержимое счетчика уменьшается на единицу и проверяется на нуль. Если содержимое счет­чика не равно нулю, осуществляется переход на начало цикла. В противном слу­чае выполняется следующая команда. Адрес перехода вычисляется сложением смещения с содержимым счетчика, предварительно увеличенным на длину ко­манды (на 2 или 3). На флаги команды не влияют.

Команды вызова подпрограмм и возврата из программ (табл. 7.3.16). Команды LCALL «длинный вызов» и ACALL «абсолютный вызов» осуществляют безусловный вызов подпрограммы, размещенной по указанному адресу. Отличие этих команд от рассмотренных выше команд безусловного перехода состоит в том, что они сохраняют в стеке адрес возврата (содержимое счетчика) в основ­ную программу.

Команда возврата из подпрограммы RET восстанавливает из стека значение содержимого счетчика команд, A команда RETI помимо этого разрешает преры­вания обслуживающего уровня.

табл. 7.3.16

В командах передачи управления широко используется относительная адреса­ция, которая поддерживает перемещаемые программные модули. В качестве отно­сительного адреса выступает 8–разрядное смещение rel со знаком, обеспечиваю­щее ветвление от текущего положения счетчика PC в обе стороны на ±127 байт. Для перехода в любую другую точку 64К–байтного адресного пространства может быть использован либо прямой адрес addr16, либо косвенный @A+DPTR адрес. В последнем случае содержимое A интерпретируется как целое без знака. Вари­ант короткой прямой адресации addr11 внутри 2К–байтной текущей страницы вве­ден для совместимости с архитектурой МК48.

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

Когда МК51 опознает запрос на прерывание, он генерирует одну из команд типа LCALL addr16, что автоматически обеспечивает запоминание адреса возврата в стеке. Однако в отличии от МК48 в МК51 нет автоматически сохраняемой ин­формации о состоянии. При этом логика прерываний перестает срабатывать на запросы того уровня, который был принят к обслуживанию. Для понижения уров­ня прерывания служит команда возврата из прерывания RETI, которая кроме опе­рации, эквивалентной RET, включает операцию разрешения прерывания данного уровня.

К типовым условным операциям МК51 относятся также операции JZ, JNZ. Од­нако появилась новая операция «Сравнить и перейти» CJNE. По данной команде операнд сначала сравнивается по правилам вычитания целых чисел с константой и в соответствии с результатом сравнения выставляется флаг CY Затем в случае несовпадения с константой выполняется ветвление. Сравнивая аккумулятор, ре­гистр или ячейку памяти с последовательностью констант, получаем удобный способ проверки на совпадения, например с целью выявления особых случаев. По сути дела команда CJNE является элементом оператора языков высокого уров­ня типа CASE.

Дальнейшее развитие получила команда DJNZ. Теперь программист в качестве счетчика может использовать не только один из рабочих регистров Rn, но и лю­бую ячейку памяти DSEG.

Команды битовых операций. Группа состоит из 12 команд, позволяющих вы­полнять операции над одним или двумя битами (сброс, установку, инверсию бита, A также логические И и ИЛИ), и 5 команд, предназначенных для реализации условных переходов (табл. 7.3.17).

табл. 7.3.17

Команды обеспечивают прямую адресацию 128 битов, расположенных в шест­надцати ячейках внутреннего ОЗУ с адресами 20h...2Fh (табл. 7.3.3), и 128 битов, расположенных в регистрах специального назначения, адреса которых кратны восьми (выделены в табл. 7.3.4 полужирным шрифтом). При выполнении опера­ций над двумя одноразрядными операндами в качестве логического аккумулято­ра используется триггер регистра PSW, хранящий флаг переноса C (табл. 7.1.2).

Команды MOV (1,2) осуществляют пересылку бита из одной прямо адресу­емой битовой ячейки внутреннего ОЗУ в триггер C или в обратном направлении. Команды CRL (3, 4), SETB (5, 6) соответственно сбрасывают в нуль или устанавли­вают в единицу флаг переноса C или указанный бит.

С помощью команд CPL, ANL, ORL (7–12) выполняются логические операции инверсии, сложения и умножения.

 

В группу входят также команды (13–17) для реализации операций условных переходов с относительным 8–разрядным смещением rel. Переходы могут быть реализованы как при установленном бите или флаге переноса (команды 13, 16), так и при сброшенном (команды 14, 17). Команда JBC помимо перехода по вычис­ляемому адресу при выполнении условия (бит) = 1 производит сброс этого бита в нулевое состояние. При выполнении команд условных переходов адрес перехо­да вычисляется после прибавления к содержимому счетчика чисел 3 или 2 (отра­жающих число байт в команде).


Рекомендуйте эту статью другим!