микроконтроллЕра MC68HC908GP32
Структура и функционирование
Общая структура микроконтроллера MC68HC908GP32
Микроконтроллер MC68HC908GP32 содержит 8-разрядный процессор CPU08, Flash-память емкостью 32 Кбайт, ОЗУ данных емкостью 512 байт и большой набор служебных и периферийных модулей (рис. 1). Процессор CPU08 выполняет обработку 8-разрядных операндов и реализует набор из 90 команд. Он содержит пять программно-доступных регистров: 8-разрядный аккумулятор A и регистр признаков CCR, 16-разрядный индексный регистр H:X, указатель стека SP и программный счетчик PC.
В состав служебных модулей входят:
– генератор тактовых импульсов CGM08;
– модуль системной интеграции SIM08;
– модуль контроля напряжения питания LVI08;
– модуль прерывания в контрольной точке BREAK08;
– модуль управления внешним прерыванием IRQ08;
– сторожевой таймер COP08;
– базовый таймер TBM08.
Модуль генератора импульсов CGM08 генерирует импульсные сигналы, на базе которых модуль системной интеграции SIM08 формирует тактовые импульсы. Выходные сигналы модуля CGM08 определяют частоту тактовых импульсов для работы процессора и периферийных модулей.
Модуль системной интеграции SIM08 выполняет ряд функций, обеспечивающих совместную работу различных модулей микроконтроллера. Он работает совместно с другими служебными модулями: CGM08, LVI08, IRQ08, BREAK08, COP08, выполняя формирование тактовых импульсов, запуск микроконтроллера, организацию обслуживания прерываний.
Рис. 1. Структура микроконтроллера MC68HC908GP32
Модуль прерывания в контрольной точке BREAK08 обеспечивает останов выполнения программы в заданной контрольной точке и используется в процессе отладки программного обеспечения.
Модуль управления внешним прерыванием IRQ08 принимает внешний запрос прерывания, поступающий на вход IRQ#, и обеспечивает различные варианты его обслуживания.
Сторожевой таймер COP08 осуществляет контроль выполнения текущей программы.
Модуль LVI08 вырабатывает сигнал перезапуска микроконтроллера при снижении его напряжения питания ниже порогового уровня.
Модуль базового таймера TBM08 обеспечивает периодическое формирование запросов прерывания.
Периферийные модули обеспечивают обмен данными и совместную работу микроконтроллера с другими устройствами, входящими в состав системы управления. Микроконтроллер MC68HC908GP32 содержит следующие периферийные модули:
– пять параллельных портов A, B, C, D, E для ввода–вывода данных;
– асинхронный последовательный порт SCI08;
– синхронный последовательный порт SPI08;
– модуль контроля клавиатуры KBI08;
– 8-разрядный аналого-цифровой преобразователь ADC08;
– два таймерных модуля TIM08.
Двунаправленные порты A, B, C, D, E обеспечивают параллельный обмен данными с внешними устройствами. Порты A, B имеют по 8 линий ввода–вывода, порт E – 2 линии, а порты C, D – от 5 до 8 линий в зависимости от числа выводов корпуса, в котором смонтирован микроконтроллер.
Выводы параллельных портов A, B, D, E совмещены с выводами других периферийных модулей – KBI08, ADC08, TIM08-1, TIM08-2, SPI08, SCI08 (рис. 1). При работе вышеуказанных модулей соответствующие выводы параллельных портов служат для передачи сигналов, необходимых для функционирования модуля, и не могут использоваться для параллельного ввода–вывода данных.
Последовательные порты SCI08, SPI08 реализуют соответственно последовательный асинхронный и синхронный обмен данными между микроконтроллером и внешними устройствами.
Таймерный модуль TIM08 выполняет широкий набор функций, включая фиксацию времени поступления входных сигналов, выдачу выходных сигналов в заданный момент времени, формирование последовательности импульсов заданной частоты и длительности.
Модуль аналого-цифрового преобразования ADC08 производит преобразование значения потенциала, поступающего на один из 8 аналоговых входов, в 8-разрядное двоичное число.
Модуль контроля клавиатуры KBI08 обеспечивает формирование запроса прерывания при поступлении сигнала на определенные входы параллельных портов, обычно используемые для подключения клавиатуры.
Организация и адресация памяти
Микроконтроллеры семейства 68HC08/908 адресуют 64 Кбайт внутренней памяти (адреса $0000-FFFF). Распределение адресного пространства задается картой памяти, вид которой определяется объемом внутренней памяти и набором периферийных устройств, входящих в состав данной модели микроконтроллера. На рис. 2 приведена карта памяти для микроконтроллеров MC68HC908GP32. В адресном пространстве имеется ряд неиспользуемых позиций, которые соответствуют ячейкам памяти, отсутствующим в данной модели микроконтроллеров. При обращении к этим адресам производится перезапуск микроконтроллера.
$0000 $003F | Регистры периферийных и служебных модулей (64 байт) |
$0040 $023F | ОЗУ данных (512 байт) |
$0080 $7FFF | Не используется (32192 байт) |
$8000 $FDFF | Flash-память (32 256 байт) |
$FE00 | Регистр SBSR (модуль BREAK08) |
$FE01 | Регистр SRSR (указывает причину запуска) |
$FE02 | Резервировано |
$FE03 | Регистр SBFCR (модуль BREAK08) |
$FE04 | Регистр INT1 (запросы прерывания) |
$FE05 | Регистр INT2 (запросы прерывания) |
$FE06 | Регистр INT3 (запросы прерывания) |
$FE07 | Резервировано |
$FE08 | Регистр FLCR (управление Flash-памятью) |
$FE09 | Регистр BRKh (модуль BREAK08) |
$FE0A | Регистр BRKl (модуль BREAK08) |
$FE0B | Регистр BRKSCR(модуль BREAK08) |
$FE0C | Регистр LVISR (модуль LVI08) |
$FE0D $FE1F | Не используются (19 байт) |
$FE20 $FE52 | ПЗУ – монитор отладки (307 байт) |
$FE53 $FF7D | Не используются (43 байт) |
$FF7E | Регистр FLBPR (управление Flash-памятью |
$FF7F $FFDB | Не используются (93 байт) |
$FFDC $FFFF | Вектора запуска и прерываний (36 байт) |
Рис. 2. Карта памяти для микроконтроллера MC68HC908GP32.
Младшие 64 позиции адресного пространства (адреса $000–$003F) занимают регистры служебных и периферийных модулей (табл. 1). Отметим, что 16-разрядные регистры таймерных модулей TCNТ, TMOD, TCHx занимают по две позиции адресного пространства: младший байт с суффиксом l, старший байт с суффиксом h.
В адресном пространстве ОЗУ располагаются ячейки стека, которые адресуются с помощью указателя стека SP. При установке микроконтроллера в начальное состояние (запуске) содержимое SP принимает значение $00FF, адресуя ячейку ОЗУ с данным адресом.
В процессе выполнения программы можно установить любое значение указателя стека с помощью команды TXS, которая загружает в SP содержимое индексного регистра H:X, уменьшенное на 1. После записи байта в стек содержимое SP уменьшается на 1, адресуя следующую незаполненную ячейку стека. Таким образом, стек заполняется в направлении уменьшения адресов. Адрес вершины стека (последней заполненной ячейки стека) можно загрузить в регистр H:X с помощью команды TSX.
Микроконтроллер MC68HC908GP32 имеет внутреннюю Flash-память, содержимое которой может стираться и записываться при работе в режиме отладки или в процессе выполнения прикладной программы. Допускается до 10000 циклов стирания программирования, время хранения информации составляет более 10 лет. Необходимое для программирования повышенное напряжение обеспечивается внутренним преобразователем, поэтому не требуется подключение внешнего источника. Специальный механизм защиты позволяет предотвратить случайное стирание содержимого Flash-памяти. Наличие байтов секретности позволяет предотвратить несанкционированное считывание информации.
На кристалле микроконтроллера содержится 512 байт статической оперативной памяти, ячейки которой имеют адреса в диапазоне $0040–$023F. Обычно ОЗУ используется для хранения переменных и реализации стека.
Часть адресного пространства занята ячейками служебного ПЗУ, в котором содержится программа-монитор, которая реализует необходимые процедуры при работе микроконтроллера в режиме отладки, обеспечивая возможность контроля его внутреннего состояния. Это масочно-программируемое ПЗУ, содержимое которого записывается в процессе изготовления микроконтроллера.
В старших позициях адресного пространства располагаются вектора начального запуска и прерываний.
Таблица 1
Адреса регистров периферийных модулей
Генерация тактовых импульсов и запуск
микроконтроллера
Тактовые импульсы с частотой Ft формируются модулем системной интеграции SIM08 на базе импульсных сигналов, которые генерируются модулем CGM08. В микроконтроллерах MC68HC908GP32 этот модуль обеспечивает умножение частоты в сотни раз, что позволяет подключать в качестве частотно-задающего элемента дешевые и стабильные кварцевые кристаллы с резонансной частотой Fq = 32,768 кГц, широко применяемые в часовой промышленности («часовые» кварцы). Для получения тактовых сигналов заданной частоты Ft необходимо выполнить программирование модуля CGM08. Однако в лабораторном стенде ЛС–1 этого не требуется, т.к. микроконтроллер работает в режиме отладки с фиксированной тактовой частотой Ft = 2,4576 МГц.
Запуск микроконтроллера выполняется с помощью модуля системной интеграции SIM08. Он автоматически производится в следующих случаях:
1. Включение напряжения питания Vп.
2. Поступление внешнего сигнала сброса RST# = 0.
3. Поступление сигнала сброса от сторожевого таймера COP08.
4. Выборка неправильного кода команды.
5. Обращение к ячейке памяти, которая отсутствует в адресном пространстве данной модели микроконтроллера.
6. Поступление от модуля LVI08 сигнала о недопустимом снижении напряжения Vп.
В процессе запуска микроконтроллера выполняются следующие действия:
– запускается ГТИ, который формирует тактовые импульсы с частотой Ft = Fq, задаваемой кварцевым резонатором;
– в программный счетчик PC поступают два байта (старший байт PCh, младший байт PCl) из ячеек памяти с адресами $FFFE-FF (рис.2), которые задают адрес первой команды, выполняемой микроконтроллером после запуска;
– в указатель стека SP заносится число $FF, адресующее начальную ячейку стека;
– в регистре признаков CCR устанавливается значение маски прерываний I = 1, которое запрещает обслуживание любых аппаратных прерываний;
– устанавливается необходимое начальное состояние регистров периферийных модулей.
Режимы функционирования
Микроконтроллеры MC68HC908GP32 могут функционировать в одном из следующих режимов:
– рабочий режим,
– режим ожидания,
– режим останова,
– режим отладки.
Режим ожидания (Wait mode) реализуется после поступления команды WAIT.
При этом прекращается работа процессора, но все остальные модули микропроцессора продолжают функционировать. Потребление мощности в этом режиме снижается в несколько раз (табл. 2). Возврат из режима ожидания в рабочий режим происходит при поступлении сигнала сброса или запроса прерывания (внешнего IRQ# или от периферийных модулей). При поступлении сигнала сброса производится процедура запуска микроконтроллера, описанная выше. Если возврат выполняется по сигналу сброса, то в программный счетчик PC загружается вектор начального запуска, если по запросу прерывания, то в PC загружается соответствующий вектор прерывания (табл. 8).
Режим останова (Stop mode) реализуется после поступления команды STOP. В этом случае прекращается работа процессора и большинства других модулей микроконтроллера. Продолжают работать модули BREAK08, IRQ08, KBI08. Функционирование модуля контроля напряжения питания LVI08 и базового таймера TBM08 в режиме останова можно разрешить при записи соответствующего содержимого в регистры конфигурации микроконтроллера. Потребляемый ток в режиме останова снижается до единиц микроампер, если запрещена работа всех модулей микроконтроллера (табл. 2).
Таблица 2
Значения тока питания микроконтроллера MC68HC908GP32
в различных режимах функционирования
Модель микроконтроллера | Ток питания | Условия функционирования | ||
Рабочий режим | Режим ожидания | Режим останова | ||
МС68НС908GР32 | 15 мА | 4 мА | 3/300 мкА | Uп=5,0 В, Ft=4 МГц |
4,5 мА | 1,7 мА | 2/200 мкА | Uп=3,0 В, Ft=4 МГц |
Выход из режима останова происходит при поступлении внешних сигналов сброса RST# и прерывания IRQ#, а также по запросам внутренних модулей LVI08, BREAK08, KBI08, TBM08, если разрешена работа соответствующего модуля в режиме останова. При этом в PC загружается вектор запуска или соответствующего прерывания (табл. 8). При поступлении команд WAIT и STOP в регистре признаков CCR устанавливается значение маски прерывания I = 0, чтобы разрешить последующий выход из режима ожидания или останова по запросам прерывания.
Режим отладки. Реализация этого режима является специфической особенностью микроконтроллеров семейства 68HC08/908. Микроконтроллер подключается к персональному компьютеру и работает под управлением внешних команд. Эти команды позволяют контролировать и модифицировать текущее состояние микроконтроллера, выполнять чтение и запись содержимого любой ячейки адресуемой памяти, производить стирание и запись содержимого внутренней Flash-памяти. Данный режим обеспечивает выполнение основных операций, реализуемых в процессе отладки программ.
Функционирование микроконтроллера в этом режиме обеспечивается с помощью специальной программы-монитора, которая записывается в его масочно-программируемое ПЗУ в процессе изготовления. Ввод микроконтроллера в режим отладки осуществляется при подаче на его выводы определенной комбинации потенциалов. На вход IRQ# подается повышенный потенциал Vh = Vp + 2,5 В. Вывод PTA0 порта A служит для последовательного обмена данными между микроконтроллером и персональным компьютером.
В режиме отладки обеспечивается возможность записи содержимого Flash-памяти. Таким образом, можно выполнить программирование микроконтроллера, работающего непосредственно в составе системы управления (ISP – In-System Programming).
При этом запись или модификация рабочей программы производится с помощью персонального компьютера без использования специальных программаторов и не требует удаления микроконтроллера из реализованной системы управления.
Программно-логическая модель
центрального процессора
Центральный процессор СРU08 выполняет действия над 8-разрядными операндами. Программно-логическая модель СРU8 содержит шесть регистров (рис. 3):
– 8-разрядный аккумулятор А;
– два 8-разрядных индексных регистра X и Н, которые могут быть объединены в 16-разрядный регистр Н:Х;
– указатель стека SP;
– счетчик адреса РС;
– регистр признаков ССR.
Рис. 3. Программно-логическая модель центрального процессора НС08
Аккумулятор А представляет собой 8-разрядный регистр, в котором хранятся операнды, результаты арифметических и логических операций.
Индексный регистр Х:Н состоит из двух регистров Н и X, позволяющих осуществлять индексный доступ к внутренней памяти объемом 64 Кб. Регистр Н содержит старший, а регистр X – младший байт адреса. Кроме того, в индексном регистре временно хранятся данные, тем самым осуществляется дополнительная разгрузка аккумулятора. Система команд СРU8 позволяет загружать данные в индексные регистры и выполняет операции над ними как в двухбайтовом, так и в однобайтовом формате. В последнем случае обращение производится только к младшему байту регистра X. После сброса МК старший байт индексного регистра Н принудительно устанавливается в 0, что обеспечивает выполнение программ, ранее написанных для МК семейства НС05. Сброс не изменяет состояние младшего байта индексного регистра X.
Указатель стека SP – 16-разрядный регистр хранит адрес вершины области стека. Стек – это зарезервированная область оперативной памяти, используемая для сохранения адресов возврата из подпрограмм и программ обработки прерываний (ISR), а также для передачи данных в подпрограммы. Для вызова подпрограммы используются две ячейки памяти стека, для прерывания – пять ячеек. При записи данных в стек значение указателя стека уменьшается, при извлечении их из стека – увеличивается. Указатель стека может также использоваться как индексный регистр с 8-разрядным или 16-разрядным смещением. Чтобы обеспечить совместимость МК семейства НС08 с МК семейства НС05, после сброса в указатель стека записывается значение $00FF, назначая область стека в нулевую страницу ОЗУ МК. Это же значение может быть также установлено программно командой RSP (сброс указателя стека). Следует отметить, что резервирование нулевой страницы памяти для области стека во многих приложениях на МК семейства НС08 нецелесообразно. Нулевую страницу памяти ($0000–$00FF) в этих МК следует использовать для хранения промежуточных данных. Фрагмент кода прикладной программы и время обращения к данным в этом случае будут минимальными. Указатель стека SP можно установить в любое значение из диапазона от $0000 до $FFFF. Для этого сразу после начального запуска МК следует использовать следующие команды:
ORG $B000 | ;Начальный адрес прикладной программы $B000, может быть любым по желанию пользователя |
sei | ;Запретить прерывания |
ldhx $0200 ¼ ¼ ¼ | ;Загрузить регистровую пару Н:X значением вершины стека $0200 |
txs | ;Переслать код из Н:Х в SР |
ORG $FFFC | ;Установить адрес вектора прерывания |
DW $C817 | ;Вектор прерывания равен $С817 |
ORG $FFFE | ;Установить адрес вектора сброса |
DW $B000 | ;Вектор сброса равен $B000 |
Расположение данного фрагмента программы в памяти иллюстрирует рис. 4.
Рис. 4. Иллюстрация примера организации программной связки
Программа начальной загрузки начинается с адреса $В000. Программа запрещает все прерывания (SEI – установка глобальной маски прерывания в регистре признаков ССR) и загружает указатель стека адресом $200. Для стека зарезервировано 17 байт, что задается в командном файле компоновщика. После исполнения приведенного программного фрагмента область памяти стека будет занимать адресное пространство от $1F0 до $200. Поскольку счетчик программы и указатель стека 16-разрядные, контроллеры семейства НС08 могут адресовать 64 Кб адресного пространства.
Счетчик адреса или программный счетчик РС– 16-разрядный регистр содержит адрес текущей команды либо адрес операнда, используемого в текущей команде. После выполнения команды содержимое РС автоматически увеличивается до следующего адреса памяти. После сброса МК программный счетчик автоматически загружается вектором начального запуска, который записан в ячейках памяти ПЗУ с адресами $FFFЕ (старший байт) и $FFFF (младший байт). Вектор начального запуска является адресом начала прикладной программы управления (рис. 2).
Регистр признаков ССК– 8-разрядный регистр содержит информацию о состоянии ЦП, соответствующем последней выполненной команде. Каждый бит информации в этом регистре называется флагом. Регистр признаков в СРU8 содержит шесть флагов: переноса С, нулевого результата Z, отрицательного результата N, переполнения V, дополнительного переноса Н, глобальной маски прерывания I. Особенностью флагов нулевого результата Z и отрицательного результата N является установка их после операций пересылки.
С – флаг переноса (Саrrу F1аg) устанавливается в 1, если в результате операции сложения произошло переполнение аккумулятора или в результате операции вычитания произошел заем. Часть логических операций могут устанавливать либо сбрасывать флаг переноса С. Процессорное ядро СРU8 имеет две специальные команды: СLС – очистить флаг переноса, SЕС – установить флаг переноса. Перевод МК в состояние сброса не влияет на состояние флага переноса.
Z – флаг нулевого результата (Zего F1аg) устанавливается в 1, если результат арифметической, логической операции или операции пересылки данных равен 0. Сброс МК не влияет на значение бита нулевого результата.
N – флаг отрицательного результата (Negative Flag) устанавливается по значению разряда D7 результата операции пересылки данных, арифметической или логической операции. Сброс МК не влияет на значение флага отрицательного результата. В микропроцессорной технике принят следующий стандарт: когда разряд D7 является разрядом знака числа
N = D7 = 0 – число положительное,
N = D7 = 1 – число отрицательное.
Н – флаг дополнительного переноса (Наlt-Саrrу F1аg) устанавливается в 1 при возникновении переноса между разрядами DЗ и D4 аккумулятора при выполнении операций сложения АDD и сложения с переносом АDDС. Этот признак необходим, если при обработке численных значений используют двоично-десятичный код (ВСD – binary coded decimal). Команда десятичной коррекции DAA использует флаги Н и С для определения подходящего поправочного коэффициента. Сброс МК не влияет на значение бита дополнительного переноса.
V – флаг переполнения устанавливается в 1, если при выполнении арифметической операции получается результат, выходящий за пределы диапазона чисел, которые представлены в дополнительном коде со знаком. Внутренний перенос из разряда D6 в разряд D7 называется переполнением. Результат при этом становится отрицательным. Это событие должно быть распознано и, если необходимо, исправлено. Переполнение может происходить в следующих ситуациях:
– при добавлении большого положительного числа;
– при добавлении абсолютной величины большого отрицательного числа;
– при вычитании большого отрицательного числа из большого (по абсолютному значению) отрицательного числа;
– при вычитании большого (по абсолютному значению) отрицательного числа из большого положительного числа.
Теория систем счисления устанавливает следующее правило формирования флага переполнения: при сложении переполнение происходит только в том случае, если слагаемые имеют одинаковые знаки, а знак суммы отличается от знака слагаемых:
,𝑉=𝐴7&𝑀7&,𝑅7..,𝐴7.&,𝑀7.&𝑅7.
Этот признак используется командами ветвления BGT, BGE, BLE, BLT. Бит переполнения V может быть также установлен командами сдвигов АSL, АSR, LSL, LSR, ROL, ROR. Однако в этом случае результат операции не несет смысловой нагрузки. Сброс МК не влияет на значение флага переполнения.
I – глобальная маска прерывания, ее установка в 1 запрещает все прерывания, кроме программного по команде SWI. Если запрос на прерывание появится, когда флаг I = 0, то центральный процессор сохранит в стеке содержимое счетчика адреса РС, аккумулятора А, младшего байта индексного регистра X и регистра признаков ССR, установит бит I в 1 и перейдет на выполнение подпрограммы прерывания. Если запрос на прерывание появится, когда флаг I = 1, то запрос на прерывание будет запомнен. Микроконтроллер начнет обрабатывать запрос на прерывание сразу, как только бит I будет очищен. Инструкция RTI (возврат из прерывания) сбрасывает бит I в 0 автоматически. В СРU08 имеется две команды управляющие флагом I: CLI – очистить флаг маски, SEI – установить флаг маски. В состоянии сброса флаг I устанавливается в 1, что запрещает аппаратные прерывания. Разрешение аппаратных прерываний (установка I в 0) может быть выполнено только программной командой CLI.
Способы адресации в микроконтроллерах НС08
Изучив программно-логическую модель центрального процессора НС08, отметим следующие его особенности:
– регистры центрального процессора не имеют собственных двоичных адресов в адресном пространстве МК. Следовательно, команды обращения к регистрам должны быть отличны по мнемонике от команд обращения к ячейкам памяти. Например, команда CLRA устанавливает в 0 все биты регистра аккумулятора, команда CLRX – регистра X, команда CLR mm обнуляет ячейку памяти с адресом mm;
– ПЗУ и ОЗУ данных в МК семейства НС08 имеют объединенное адресное пространство. Следовательно, одни и те же команды могут быть использованы для выборки данных из ячеек, принадлежащих к разным типам памяти, и последующего выполнения операций над ними. Например, команда LDA $0023 загружает в аккумулятор центрального процессора данные из ячейки ОЗУ с адресом $23, а команда LDA $81FF – код, хранящийся в ячейке ПЗУ с адресом $81FF.
Центральный процессор НС908 является типичным представителем микропроцессоров с СISC-архитектурой (СISC – Complicated Instruction Set Computer). Одна из отличительных особенностей таких процессоров состоит в том, что длина кода команды в байтах неодинакова для разных команд. Команды процессора НС08 могут иметь однобайтовый, двухбайтовый и трехбайтовый (редко четырехбайтовый) формат. В первом байте команды помещается код операции, определяющий действие, которое будет совершено над одним или двумя операндами. Во втором и третьем байтах команды помещаются сами операнды или их адреса, или задаются данные для вычисления этих адресов. Правило, по которому центральный процессор определяет адрес одного или двух операндов, принято называть способом адресации. Чем больше способов адресации в системе команд центрального процессора, тем более гибко он может обращаться к данным. Последнее увеличивает производительность центрального процессора при исполнении конкретной задачи управления. Кроме того, разнообразие способов адресации позволяет создавать эффективные компиляторы с языков высокого уровня.
Для выборки операндов из памяти МК семейства НС08 используют следующие способы адресации:
– неявная (INH – Inherent);
– непосредственная (IMM – Immediate);
– прямая (DIR – Direct);
– прямая расширенная (ЕХТ – Extended);
– индексная (IX – Indexed);
– индексная со смещением 1 байт (IX1 – Indexed, 8 bit offset);
– индексная со смещением 2 байта (IX2 – Indexed, 16 bit offset);
– индексная с последующим инкрементированием указателя адреса (IX1+ – Indexed with post incrementer);
– индексная со смещением 1 байт с последующим инкрементированием указателя адреса (IХ+ – Indexed, 8 bit offset with post incrementer);
– индексная по указателю стека со смещением 1 байт (SР1 – Stack pointer, 8 bit offset);
– индексная по указателю стека со смещением 2 байта (SР2 — Stack pointer, 16 bit offset);
– относительная (REL – Relative).
Неявная адресация (Inherent).Команды с неявной адресацией содержат адрес операнда в коде команды. Например, INCA – команда увеличения на 1 содержимого аккумулятора А, ASLX – команда сдвига влево регистра X, SEC – команда установки бита переноса С. Все команды с неявной адресацией имеют длину 1 байт и состоят только из кода операции. Эти команды обращаются обычно к регистрам центрального процессора (А, X, Н:Х) или к отдельным битам регистра признаков (бит переноса С, бит маски прерывания I) и регистров управления режимами работы центрального процессора (команды SТОР, WAIT).
Непосредственная адресация (Immediate). Операнд в командах с непосредственной адресацией следует сразу после кода операции и выражается 8-разрядным или 16-разрядным числом, которое не является адресом. Этот режим адресации используется, чтобы, например, загрузить некоторое значение в 8-разрядный или 16-разрядный регистр центрального процессора. Указанные в коде команды данные не могут быть изменены в ходе выполнения программы, так как они расположены непосредственно в памяти программ, т.е. в ПЗУ. Условное обозначение операнда в мнемонике команды – #орr.
Пример:
add #орr | ;записать команду ADD с непосредственной адресацией в общем виде |
lda #орr | ;записать команду LDA с непосредственной адресацией в общем виде |
lda #$F0 | ;загрузить в А код $F0 |
add #3 | ;сложить содержимое аккумулятора А с числом 3, результат записать в А |
ora #$0А | ;выполнить операцию поразрядного ИЛИ над содержимым А и шестнадцатеричным числом $0А, результат записать в А |
ldhx #$2080 | ;загрузить в 16-разрядный регистр Н:Х число $2080 |
Прямая адресация (Direct).Команды с прямой адресацией имеют длину 2 байта. После кода операции команды следует 8-разрядный адрес операнда и, следовательно, могут быть адресованы 256 ячеек памяти. Поскольку старший байт адреса всегда интерпретируется как $00, этот способ адресации обеспечивает возможность обращаться к адресам, расположенным в интервале от $0000 до $00FF. Этот диапазон называют нулевой страницей памяти. В МК семейства НС08 нулевая страница памяти отведена под регистры управления периферийными модулями, однако часть ячеек нулевой страницы в МК любой модели обязательно будет принадлежать ОЗУ данных. Именно в эти ячейки ОЗУ выгодно помещать часто используемые переменные и программные счетчики. Команды с прямой адресацией типа Directвсегда на 1 байт короче команд с прямой расширенной адресацией типа Extended,поэтому объем программы будет меньше. Кроме того, команды с адресацией типа Direct выполняются на один цикл быстрее. Эти два преимущества могут дать большой выигрыш, как по быстродействию программы управления, так и по объему ее кодового представления. Условное обозначение адреса в мнемонике команды – орr.
Пример:
add орr | ;записать команду add с прямой адресацией в общем виде |
lda $31 | ;загрузить в А содержимое ячейки памяти с адресом $0031 |
add $31 | ;сложить содержимое аккумулятора А с содержимым ячейки памяти с адресом $0031, результат поместить в А |
ora $0А | ;выполнить операцию поразрядного ИЛИ над А и содержимым ячейки памяти с адресом $000A ,результат поместить в А |
Прямая расширенная адресация (Extended).При прямой расширенной адресации открывается доступ к полному интервалу адресного пространства МК НС08 объемом 64 Кб, потому что за кодом операции следует уже не 8-разрядный, а 16-разрядный адрес. Поэтому все команды с прямой расширенной адресацией содержат 3 байта: первый байт задает код операции, второй байт является старшим байтом (MSB) и третий – младшим байтом (LSВ) адреса. Этот способ адресации должен быть выбран, когда необходимо использовать адресное пространство, выходящее за рамки нулевой страницы (от $0000 до $00FF). При этом выбор типа адресации (прямая или прямая расширенная) не является задачей программиста, так как программа Ассемблер выбирает его автоматически в зависимости от численного значения адреса.
Пример:
add орr | ;записать команду add с прямой расширенной адресацией в общем виде |
add $01Е1 | ;сложить содержимое аккумулятора А с содержимым ячейки памяти с адресом $01Е1, результат поместить в А |
ldx $01Е1 | ;загрузить в младший байт индексного регистра X содержимое ячейки памяти с адресом $01Е1 |
Индексная адресация (Indexed)особенно подходит для доступа к блокам памяти или таблицам, в которых адреса расположены один за другим и извлечение или загрузка происходят последовательно шаг за шагом. Принцип индексной адресации заключается в том, что команда воспринимает содержимое индексного регистра Н:Х как базовый адрес операнда. Если команда не содержит беззнаковой константы, то этот адрес и служит адресом ячейки памяти, в которой хранится искомый операнд. Если же в формате команды указана константа размером в 1 или 2 байта, которая называется смещением, то адрес операнда вычисляется как сумма смещения и базового адреса. Таким образом, смещение, добавленное к содержимому индексного регистра Н:Х перед исполнением действия над операндом, является текущим адресом операнда. При переходе от одного цикла исполнения программного фрагмента к другому индексный регистр может увеличиваться или уменьшаться программистом. Тогда одинаковые смысловые действия будут производиться над последовательно расположенными в памяти операндами.
Команды с индексной адресацией без смещения – это однобайтовые команды, адрес операнда которых должен быть предварительно занесен в индексный регистр Н:Х. Старший байт (МSB) находится в регистре Н, младший байт (LSВ) – в регистре X. Содержимое индексного регистра представляет собой конечный или исполнительный адрес. Этот способ адресации может использоваться для передачи указателя на таблицу, или для хранения адреса, который указывает на часто используемую ячейку памяти или порт ввода и вывода.
Пример:
add ,x | ;записать команду add с индексной адресацией в общем виде |
lda ,x | ;загрузить в аккумулятор А содержимое ячейки памяти, адрес которой находится в индексном регистре Н:Х |
add ,x | ;сложить содержимое аккумулятора А с содержимым ячейки памяти, адрес которой находится в индексном регистре Н:Х |
Обратите внимание на то, что в мнемонике команды нет численного значения адреса. Написание команды одинаково для операндов, находящихся в любой ячейке адресного пространства МК.
Команды с индексной адресацией и 8-разрядным смещением (Indexed, 8 bit offset) – это двухбайтовые команды, в которых за кодом операции располагается 8-разрядный адрес смещения. Центральный процессор вычисляет конечный адрес, добавляя 8-разрядное смещение к содержимому индексного регистра Н:Х. Оба адреса интерпретируются как положительные числа. При этом способе адресации легко адресовать i-й элемент в таблице из n элементов. Таблица может начинаться в любой точке внутри адресного интервала размером 64 Кб, потому что в качестве указателя начала таблицы используется 16-разрядный регистр Н:Х. Чтобы определить i-й элемент, используется смещение, которое не превышает 256 байт.
Если таблица содержит большее число элементов, можно использовать индексную адресацию с 16-разрядным смещением.
Пример:
add орr,х | ;записать команду add с индексной адресацией со смещением в 1 байт в общем виде |
add $80,х | ;сложить содержимое аккумулятора А с содержимым ячейки памяти, адрес которой равен (Н:Х)+128 |
lda $1,х | ;загрузить в аккумулятор А содержимое ячейки памяти, адрес которой равен (Н:Х)+1 |
Команды индексной адресации с 16-разрядным смещением (Indexed, 16 bit offset) – это трехбайтовые команды, в которых за кодом операции следуют 2 байта 16-разрядного адреса. Смещение также прибавляется к содержимому индексного регистра Н:Х, чтобы определять исполнительный адрес. Первым байтом после кода операции является старший байт 16-разрядного кода смещения (МSВ), а вторым байтом – младший байт (LSВ). Этот способ адресации может использоваться для доступа к таблицам, в которых имеется более 256 элементов.
Пример:
add орr,х | ;записать команды add с индексной адресацией со смещением в 2 байта в общем виде |
add $0100,х | ;сложить содержимое аккумулятора А с содержимым ячейки памяти, адрес которой равен (Н:X)+256 |
lda $01FF,х | ;загрузить в аккумулятор А содержимое ячейки памяти, адрес которой равен (Н:Х)+511 |
Индексная адресация с последующим инкрементированием (Indexed with post incrementer)используется только в командах mov и cbeq. Адрес одного из операндов этих команд находится в двухбайтовом индексном регистре Н:Х. После выполнения команды содержимое индексного регистра Н:Х увеличивается на 1.
Пример:
МОV х+,орr | ;Записать команду МОV с индексной адресацией с постинкрементированием в общем виде |
МОV х+,$68 | ;Записать данные из ячейки памяти, адрес которой находится в индексном регистре Н:Х в ячейку памяти с адресом $68. Увеличить на 1 адрес в регистре Н:Х |
СВЕQ х+,rel | ;Записать команду CВЕQ с индексной адресацией с постинкрементированием в общем виде |
СВЕQ х+,m1 | ;Сравнить аккумулятор А и содержимое ячейки памяти, адрес которой находится в индексном регистре Н:Х. Перейти по метке m1 в случае равенства. Увеличить на 1 адрес в регистре Н:Х |
Индексная адресация со смещением 1 байт и последующим инкрементированием (Indexed, 8 bit offset with post incrementer)используется только в команде СВЕQ. В определении адреса одного из операндов команды участвует индексный регистр Н:Х, который содержит код базового адреса. Центральный процессор вычисляет адрес операнда путем сложения содержимого индексного регистра Н:Х с байтом кода смещения, который указан во втором байте команды. После сложения адрес операнда представляется в двухбайтовом формате. После выполнения команды содержимое индексного регистра Н:Х увеличивается на 1.
Пример:
СВEQ opr,х+,rel | ;записать команду СВЕQ с индексной адресацией и смещением 1 байт с последующим инкрементированием в общем виде |
СВЕQ $80,х+,m1 | ;сравнить содержимое аккумулятора А и ячейки памяти, адрес которой равен (Н:Х)+128. Перейти по метке m1 в случае равенства. Увеличить на 1 адрес в регистре Н:Х |
Индексная адресация по указателю стека SР.Простой доступ к данным, расположенный в области памяти стека, осуществляется при индексной адресации по указателю стека. При этом способе адресации для вычисления исполнительного адреса операнда центральный процессор добавляет положительное 16-разрядное значение указателя стека SР к положительному смещению, которое указано в коде команды. Смещение может быть 8-разрядным или 16-разрядным. Если прерывания блокированы, указатель стека SР свободен от выполнения основных функций и может использоваться в качестве второго индексного регистра в дополнение к регистру Н:Х.
Все команды с адресацией по указателю имеют двухбайтовый код операции, в качестве первого байта кода операции используется число $9Е. Следовательно, эти команды исполняются на один цикл дольше, чем команды с индексной адресацией по регистру Н:Х.
При использовании индексной адресации по указателю стека с 8-разрядным смещением (Stack pointer, 8 bit offset)исполнительный адрес операнда вычисляется как сумма содержимого указателя стека SР и 8-разрядного смещения. Все команды с такой адресацией имеют трехбайтовый формат.
Пример:
АDD орr,SР | ;записать команду АDD с адресацией по указателю стека и смещением 1 байт в общем виде |
АDD $80,SР | ;сложить содержимое аккумулятора А с содержимым ячейки памяти, адрес которой равен (SР)+128 |
LDА $1,SР | ;загрузить в аккумулятор А содержимое ячейки памяти, адрес которой равен (SР)+1 |
Если в команде применяется индексная адресация по указателю стека с 16-разрядным смещением(Stack pointer, 16 bit offset),то адрес операнда вычисляется как сумма содержимого указателя стека SР и 16-разрядного смещения. Все команды с такой адресацией имеют четырехбайтовый формат.
Мнемонические обозначения команд с индексной адресацией со смещениями 1 и 2 байта совпадают. Однако не следует беспокоиться об этом при написании программы. В процессе трансляции программа Ассемблер самостоятельно поставит код необходимой операции, проанализировав численное значение адреса орr.
Пример:
АDD орr,SР | ;записать команду АDD с адресацией по указателю стека со смещением 2 байта в общем виде |
АDD $200,х | ;сложить содержимое аккумулятора А с содержимым ячейки памяти, адрес которой равен (SР)+512 |
LDА $03FF,х | ;загрузить в аккумулятор А содержимое ячейки памяти, адрес которой равен (SР)+1023 |
Относительная адресация (Relative)используется только в командах условных переходов, которые применяются для организации ветвления программ. Команды условных переходов имеют двухбайтовый формат. Первый байт содержит код операции, второй – смещение адреса следующей команды относительно адреса текущей команды в целочисленном формате со знаком. Коды смещения могут лежать в диапазоне от –128 до +127. Если условие, заданное типом используемой команды условного перехода, выполняется, то адрес следующей команды центральный процессор вычисляет путем сложения текущего адреса с кодом смещения. Если условие не выполняется, то МК переходит к выполнению следующей команды.
При написании программ нет необходимости вычислять абсолютные коды смещения для команд условного перехода. Достаточно указать лишь метку, численное значение кода смещения вычислит программа Ассемблер.
Пример:
JZ label_1 | ;перейти по метке label_1, если результат равен 0 |