ПРОГРАММИРУЕМ МИКРОКОНТРОЛЛЕРЫ 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. Система команд микроконтроллеров.
Все ссылки на книги и журналы, представлены на этом сайте, исключительно для ознакомления, авторские права на эти публикации принадлежат авторам книг и издательствам журналов!
Подробно тут!