Каталог файлов

Главная » Все файлы » Книги по электронике (Электронная библиотека)

Выберите файл!!!


ПРОГРАММИРУЕМ МИКРОКОНТРОЛЛЕРЫ Z8 М.Гладштейн г.Рыбинск Часть 5. Доступ к информационным ресурсам процессора
17.12.2009, 01:27
загрузка...
ПРОГРАММИРУЕМ МИКРОКОНТРОЛЛЕРЫ Z8
М.Гладштейн г.Рыбинск
Часть 5. Доступ к информационным ресурсам процессора
5.1. Доступ к регистровому файлу
Регистровый файл Z8 содержит порты ввода/вывода, регистры управления и состояния, регистры общего назначения. Последние об¬разуют область ОЗУ, традиционно используемую для размещения акку¬муляторов, указателей адреса памяти и стека.
5.1.1. Регистры и регистровые пары
МК Z8 поддерживает обращения к 8-битным регистрам и 16-бит¬ным регистровым парам. Регистровые пары образованы регистрами, имеющими четные номера, с присоединением следующих за ними ре¬гистров с большими номерами (00Н и 01Н, 02Н и 03Н,...,FEH и FFH). Регистровая пара адресуется ссылкой на регистр с четным номером.
Регистровые пары могут инкрементироваться (команда INCW) или декрементироваться (DECW), что позволяет с успехом использовать их как указатели для доступа к памяти программ и внешней памяти данных.
Любая команда, адресующая 8-битный регистр, может опериро¬вать с содержимым любого регистра, независимо от его назначения. Поэтому порты ввода/вывода, регистры управления и состояния и ре¬гистры общего назначения могут считываться и записываться одними и теми же командами, и нет необходимости в специальных командах. Соответственно любая команда, адресующая 16-битную регистровую пару, может оперировать с содержимым любой действительной пары регистров.
Исключения из этого правила следующие:
1) Команда DJNZ может успешно оперировать только с содержи¬мым рабочего регистра общего назначения.
2) Управляющие регистры с доступом "Только для записи" могут изменяться только такими командами как CLR, LD, POP. Такие ко¬манды как AND и OR, требующие, чтобы текущее содержимое операнда было читаемым, не будут корректно выполняться с такими регистрами.
5.1.2. Указатель регистров
Когда для адресации к регистровому файлу используется корот¬кий 4-битный адрес, регистр рассматривается как один из 16 ре¬гистров рабочей или расширенной группы. Такая группа имеет 16-байтное выравнивание и указывается указателем регистров RP(FDH). Старшая тетрада RP указывает номер рабочей группы ре¬гистров, младшая - номер расширенной группы регистров [1]. Ниже приведены примеры, поясняющие работу указателя регистров RP:
RP = 00H (Рабочая группа 0, Расширенная группа 0)
R0 = P0 = 00H
R1 = P1 = 01H
...............
R15 = GPR = 0FH
RP = 0FH (Рабочая группа 0, Расширенная группа F)
R0 = PCON = 00H
.................
R11 = SMR = 0BH
.................
R15 = WDTMR = 0FH
RP = FFH (Рабочая группа F, Расширенная группа F)
R0 = резерв, 00H = PCON
R1 = TMR, 01H = резерв
.............................
R15 = SPL, 0FH = WDTMR
Изменение содержимого указателя регистров может быть выпол¬нено следующими командами:
SRP #Data
LD RP,#Data
Первая команда более эффективна - она содержит только два байта и выполняется на 6 тактов быстрее [2], однако использовать ее можно только для загрузки байтов с нулевой младшей тетрадой. В остальных случаях нужно применять вторую команду.
5.1.3. Переключение контекста
Типовая функция, выполняемая в процессе подпрограммы обслу¬живания прерывания - это переключение контекста. Эта функция зак¬лючается в сохранении и последующем восстановлении содержимого программного счетчика, флагового регистра и регистров прерывания задачи. Выполнение машинного цикла подтверждения прерывания авто-матически сохраняет содержимое программного счетчика и флагового регистра в стеке, а исполнение команды IRET в конце подпрограммы обслуживания прерывания - восстанавливает их значения. Сохранение регистрового пространства прерываемой задачи должно обеспечивать¬ся подпрограммой обслуживания прерывания. Такое сохранение ре¬гистров можно выполнить достаточно просто, если подпрограммам различного уровня выделить свою рабочую группу регистров (или часть рабочей группы). В этом случае, для сохранения содержимого регистров прерываемой задачи достаточно сохранить в стеке указа¬тель регистров. А для выделения прерывающей подпрограмме "своих" регистров - загрузить новое значение в указатель регистров RP. Для восстановления перед завершением подпрограммы обслуживания прерывания достаточно будет восстановить из стека значение RP.
Например, пусть подпрограмма обслуживания прерывания исполь¬зует рабочую группу регистров 4. Тогда подпрограмма обслуживания должна включать следующую последовательность команд:
PUSH RP ;Сохранить указатель регистров
;прерываемой задачи
SRP #40H ;Адресовать рабочую группу
;регистров 4
..................
POP RP ;Восстановить указатель регистров
IRET ;Возврат в прерванную программу
Следует отметить, что описанный способ переключения контекс¬та может с успехом использоваться и для других типов подпрограмм, требующих достаточно большого количества регистров для промежу¬точных данных.
5.1.4. Режимы адресации
Основные способы адресации, обеспечивающие доступ к регист¬ровому файлу, - прямая, косвенная и индексная.
Прямая адресация используется для доступа к отдельным ре¬гистрам или регистровым парам, адреса которых известны во время ассемблирования. Прямой адрес должен соответствовать допустимым для данной команды способам адресации и может выражаться номером рабочего регистра Rn (n = 0...15), номером рабочей пары регистров RRp (p = 0...14), числовым значением адреса регистра 00..FFH или пары регистров 00...FEH. Кроме того, регистр специального назна¬чения может быть указан известным идентификатором - мнемоническим обозначением [1]. Регистр или регистровая пара на языке ассембле¬ра могут также быть указаны именем или выражением.
Примеры команд с прямой адресацией:
AND 00H, MASK_RE ;Логическое И содержимого
;регистра 00Н с содержимым
;регистра с именем MASK_REG
OR 01H, R5 ;Логическое ИЛИ содержимого
;регистра 00Н с содержимым
;рабочего регистра 5
Примеры команд с адресацией к паре регистров:
INCW RR0 ;Инкремент рабочей пары регистров 0
DECW 7EH ;Декремент регистровой пары 7EH
Следует отметить, что команды INCW RR5 или DECW 5FH вызовут появление ошибки ассемблирования, т.к. адреса нечетные.
Косвенная адресация используется, когда адрес регистра не известен в процессе ассемблирования, а вычисляется в ходе выпол¬нения программы. Косвенная адресация очень удобна для последова¬тельного доступа к различным структурам данных: к строкам, масси¬вам, очередям, стекам.
Пусть, например, регистры 60Н - 7FH образуют буфер для пос¬ледовательного вывода путем повторяющегося вызова подпрограммы SERIAL_OUT. Пусть подпрограмма SERIAL_OUT использует рабочий ре¬гистр R0 для хранения передаваемого байта. Ниже приведена после¬довательность команд, иллюстрирующая использование косвенной ад-ресации для решения этой задачи:
LD R1,#20H ;Инициализация счетчика
;передаваемых байтов
LD R2,#60H ;Инициализация указателя
;буфера
out_again: LD R0,@R2 ;Загрузить в R0 байт
;из буфера
INC R2 ;Инкремент указателя
;буфера
CALL SERIAL_OUT ;Вывести байт
DJNZ R1,out_again ;Повторять, пока все
;байты не будут переданы
Косвенная адресация также может быть использована для досту-
па к 16-битным регистровым парам в командах INCW и DECW, например:
INCW @R0 ;Инкрементировать регистровую
;пару, адрес которой содержится
;в рабочем регистре R0
DECW @7FH ;Декрементировать регистровую
;пару, адрес которой содержится
;в регистре 7FH
Содержимое регистров R0 и 7FH должно быть четным числом для правильного доступа. Когда адресуется регистровая пара, младший значащий бит адреса устанавливается Z8 в соответствующее значе¬ние. Однако регистр, используемый для хранения адреса пары, сов¬сем не обязательно должен иметь четный адрес.
Режим индексной адресации используется в команде загрузки LD для пересылок байтов между рабочим регистром и другим регистром. Эффективный адрес последнего регистра, задаваемый командой, - это смещение относительно содержимого определенного рабочего (индекс-
ного) регистра. Этот адресный режим обеспечивает эффективное ис¬пользование памяти, когда адресуется последовательность байтов в таком блоке регистровой памяти как таблица или буфер. Рабочий регистр, используемый как индексный при вычислении эффективного адреса, может играть дополнительно роль счетчика цикла.
Например, предположим, что буфер символов в коде ASCII су¬ществует в регистровой памяти, начиная с адреса BUF, и имеет дли¬ну LENGTH байт. Для определения логической длины символьной стро¬ки, размещенной в буфере, он должен сканироваться в обратном нап¬равлении до обнаружения первого символа, не являющегося пробелом. Для решения этой задачи может быть использована следующая после¬довательность команд:
LD R0,#LENGTH ;Длина буфера в регистре R0,
;начиная с конца буфера,
;отыскивается первый "не пробел" loop:
LD R1,BUF-1(R0)
CP R1,#' '
JR ne,found ;Если не равно,то найден "не пробел"
DJNZ R0,loop ;Если буфер не просмотрен,
;то следующий символ
all_blanks: ;Длина строки в R0 равна 0
found: ;Длина строки в R0
Параметры фрагмента программы:
5 команд;
12 байтов;
6 тактов заголовок;
42 такта на один проверяемый символ.
Метки "all_blanks" и "found" адресуют одну и ту же ячейку программной памяти, но показаны отдельно. Это полезно для приме¬нений, где строка с нулевой длиной требует специальной обработки.
5.2. Доступ к памяти программ и внешней памяти данных
Отдельной командой МК Z8 может пересылать байт между регист-
ровой памятью и памятью программ или внешней памятью данных. Ко¬манды LDC и LDCI относятся к памяти программ, а команды LDE и LDEI - к внешней памяти данных. Эти команды требуют, чтобы рабо¬чая регистровая пара содержала адрес ячейки памяти программ или внешней памяти данных, к которой будет обращаться команда ( кос-венная адресация через рабочую пару регистров). Второй операнд - регистр - адресуется с использованием прямой рабочей регистровой адресации в командах LDC, LDE или с использованием косвенной ра¬бочей регистровой адресации в командах LDCI и LDEI. В дополнение к выполнению желаемой пересылки данных команды LDCI и LDEI авто¬матически инкрементируют регистр и регистровую пару косвенной ад¬ресации операндов, указанные в команде. Эти команды эффективны для реализации пересылки блоков данных между регистровой памятью и памятью программ или внешней памятью данных. Поскольку только способ косвенной адресации используется для задания адреса опе¬ранда программной памяти или внешней памяти данных, то более сложные способы адресации необходимо моделировать.
Например, команда
LDC R3,BASE(R2)
требует индексной адресации, где BASE - это базовый адрес таблицы в программной памяти, а R2 содержит смещение от начала таблицы до требуемого элемента таблицы. Ниже приведенный фрагмент программы моделирует эту команду с использованием двух дополнительных ре¬гистров (R0 и R1):
LD R0,#^HB BASE ;Загрузка в R0 старшего
;байта адреса BASE
LD R1,#^LB BASE ;Загрузка в R1 младшего
;байта адреса BASE
;Рабочая регистровая пара RR0 хранит адрес таблицы
ADD R1,R2
ADC R0,#0
;RR0 хранит теперь адрес требуемого элемента
LDC R3,@RR0
;Требуемый элемент загружен в R3
5.2.1. Настройка Z8 для применений с расширением памяти
Модификация 40 МК Z8 обеспечивает высокую гибкость примене¬ния: она может быть использована как для устройств, где требуется большое количество линий ввода/вывода, так и для устройств, тре¬бующих больших объемов памяти программ и данных. Эта модификация МК имеет 32 линии ввода/вывода, из которых 16, 12, 8 или 0 линий могут быть настроены для работы в качестве интерфейса внешней па¬мяти. Это позволяет расширять память программ до 64 Кбайт и подк¬лючать дополнительно внешнюю память данных объемом до 60 Кбайт. Для разделения адресных пространств внешней памяти программ и внешней памяти данных используется сигнал /DM, который имеет вы¬сокий неактивный уровень при выполнении команд LDC и LDCI и низ¬кий активный - при выполнении команд LDE и LDEI.
Настройка линий ввода/вывода портов Р0 и Р1 для работы в ре¬жиме интерфейса внешней памяти осуществляется загрузкой соответс¬твующего управляющего байта в регистр Р01М, а разрешение сигнала /DM (вывод Р34) обеспечивается записью соответствующей информации в регистр P3M.
Так например, приведенная ниже последовательность команд настраивает МК для работы с 12 адресными линиями внешней памяти и с разрешением сигнала /DM:
LD P01M,#00010010B ;Биты D3, D4 разрешают AD0...AD7,
;биты D0, D1 разрешают A8...A11
LD P3M,#00001000B ;Биты D3, D4 разрешают /DM
Следующие два байта программы после выбора режима портов Р0 и Р1 не должны содержать обращений к внешней памяти из-за конве¬йерной системы выполнения команд в МК. Необходимо отметить, что команда загрузки регистра P3M в рассмотренном примере удовлетво¬ряет этому требованию (предполагается, что она размещена во внут¬ренней памяти программ).
5.2.2. Команда LDCI
Команда LDCI дает экономичное средство для инициализации последовательности регистров по данным специальной таблицы иници-
ализации, размещенной в памяти программ. Ниже приведенная прог¬рамма показывает эту технологию инициализации управляющих регист¬ров от F2H до FFH от 14-байтного массива (INIT_tab) в памяти программы:
SRP #00H
LD R6,#^HB INIT_tab ;Загрузка в R6 старшего
;байта адреса таблицы
LD R7,#^LB INIT_tab ;Загрузка в R7 младшего
;байта адреса таблицы
LD R8,#F2H ;Адрес первого регистра
LD R9,#0EH ;Длина блока регистров
loop:LDCI @R8,@RR6 ;Загрузить регистр из таблицы
DJNZ R9,loop ;Продолжать до завершения
Параметры фрагмента программы:
7 команд;
14 байтов;
30 тактов заголовок;
30 тактов на один регистр.
5.2.3. Команда LDEI
Команда LDEI хорошо подходит для пересылки блоков данных между внешней памятью данных и регистровой памятью, поскольку при ее выполнении автоматически инкрементируются и регистр, и ре¬гистровая пара, содержащие адреса операндов. Ниже приведенная программа иллюстрирует сохранение содержимого регистрового буфе¬ра, размещенного с адреса 40Н до адреса 60Н, во внешней памяти данных, начиная с адреса SAVE:
LD R10,#^HB SAVE ;Загрузка адреса внешней
LD R11,#^LB SAVE ;памяти данных в пару RR10
LD R8,#40H ;Загрузка начального адреса
;регистровой памяти
LD R9,#21H ;Количество сохраняемых
;регистров
loop:LDEI @RR10,@R8 ;Сохранить регистр
DJNZ R9,loop ;Продолжать до завершения
Параметры фрагмента программы:
6 команд;
12 байтов;
24 такта заголовок;
30 тактов на каждый регистр.
5.3. Манипулирование битами
Необходимость проверки и изменения отдельных бит или групп битов операндов требуется для большинства прикладных программ МК Z8. Инициализация и модификация содержимого управляющих регист¬ров, поиск активных запросов прерывания при поллинге, манипуляции битами портов для управления или связи с присоединенными прибора¬ми, манипулирование флагами программы для целей внутреннего уп¬равления - это все примеры использования функций манипулирования битами. Эти примеры показывают необходимость таких функций во всех областях регистрового пространства МК.
Эти функции поддерживаются прежде всего 6 командами: TM, TCM, AND, OR, XOR и COM. Эти команды имеют доступ ко всем регист¬рам, независимо от их назначения, за исключением управляющих ре¬гистров, предназначенных только для записи. Табл. 1 содержит краткое описание функций, выполняемых над содержимым операн¬да-приемника каждой командой.
Все эти команды, за исключением команды COM, требуют операн¬да-маски (используется операнд-источник src), значение разрядов которой соответствует "выбранным" битам операнда-приемника (dst).
Команды AND, OR, XOR и COM имеют функции аналогичные функци¬ям других современных микроконтроллеров, поэтому более глубоко они далее не рассматриваются. Ниже детально рассматриваются ко¬манды TM и TCM.
5.3.1. Команда "Проверить с маской" (TM)
Команда TM используется для проверки отдельных битов на ло¬гический 0. При этом выполняется операция
dst AND src.
В результате выполнения этой команды ни операнд-источник src, ни операнд-приемник dst не изменяются. Изменяется только состояние флагового регистра FLAGS. Флаг нуля Z устанавливается, если все выбранные биты равны 0, иначе он сбрасывается. Флаг зна¬ка S установится в соответствии с результатом операции AND, флаг переполнения V всегда сбрасывается этой операцией. Все остальные флаги не изменяются.
Например, для проверки на нуль старшей цифры упакованного двухразрядного BCD числа из регистра R5 можно использовать коман¬ду:
TM R5,#11110000B.
Если после выполнения этой команды флаг Z установлен, Значит старшая цифра равна нулю.
5.3.2. Команда "Проверить дополнение с маской" (TCM)
Команда TCM используется для проверки выбранных битов на ло¬гическую 1. При этом выполняется операция
(NOT dst) AND src.
Также как и в результате TM, при выполнении команды TCM из¬меняется только состояние флагового регистра FLAGS. Флаг нуля Z устанавливается в 1, если все выбранные биты равны 1, иначе - сбросится в 0. Флаг S будет соответствовать значению бита D7 ре¬зультата операции AND, а флаг переполнения V всегда сбрасывается.
Например, для проверки запроса прерывания IRQ5 в регистре IRQ можно использовать команду
TCM IRQ,#00100000B.
Если флаг Z после выполнения этой команды будет установлен, значит IRQ5 = 1.
5.4. Стековые операции
Стек МК Z8 может размещаться в регистровой памяти (внутрен¬ний стек) или во внешней памяти данных (внешний стек - только для модели 40). Адрес верхушки стека содержится в указателе стека SP, который декрементируется перед загрузкой очередного байта в стек и инкрементируется после извлечения очередного байта из стека. Указатель стека SP занимает два управляющих регистра SPH и SPL (FEH и FFH), и его содержимое может обрабатываться также, как со¬держимое других регистров. При использовании внутреннего стека используется только регистр младшего байта SPL, а SPH может ис¬пользоваться как регистр общего назначения. Обращение к стеку ре¬ализуется командами POP, PUSH, CALL, RET и IRET, а также при вы¬полнении машинного цикла подтверждения прерывания.
Место размещения стека (внутренняя регистровая память или внешняя память данных) определяется значением бита D2 регистра P01M (F8H). Ниже приведена последовательность команд для инициа¬лизации внешнего стека по адресу STACK:
AND P01M,#11111011B ;Сбросить бит D2
LD SPH,#^HB STACK
LD SPL,#^LB STACK
Таким образом, команды МК обеспечивают доступ к битам, бай¬там и 16-битным словам, размещенным в регистровом файле, памяти программ, внешней памяти данных и в стеке.
ЛИТЕРАТУРА
1. Гладштейн М.А. Изучаем микроконтроллеры Z8. Часть 1. Адресное пространство микроконтроллеров.- Радио, 1999, N 7.
2. Гладштейн М.А. Программируем микроконтроллеры Z8. Часть 1. Система команд микроконтроллеров.
Категория: Книги по электронике (Электронная библиотека) | Добавил: Администратор
Просмотров: 1159 | Загрузок: 16 | Рейтинг: 0.0/0
ьте свои комментарии !!!!
Имя *:
Email:
Код *:

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


Copyright Zloy Soft (Company) © 2008 - 2024