|
|
<< Предыдущая страница | К оглавлению | www.mirmk.ru | Следующая страница>> |
Глава 15. Внутренние регистры.Любой микропроцессор обязательно имеет в своем составе несколько внутренних регистров, которые он использует для хранения промежуточных данных. Микросхема AT89C2051 не исключение. Так как этот микроконтроллер – аналог микросхемы MSC-51, то набор его внутренних регистров полностью повторяет набор регистров MSC-51.
На рисунках 34 и 35 приведено схематическое изображение основных рабочих регистров микроконтроллера AT89C2051. Первым на рисунке, изображен регистр PC. Это регистр – указатель адреса. Регистр имеет шестнадцать разрядов, что показано при помощи цифр в верхней части рисунка. В этом регистре всегда хранится адрес ячейки памяти. Это адрес текущей выполняемой команды. В процессе выполнения программы микроконтроллер читает по этому адресу из памяти программ хранящийся там код очередной команды. Затем он распознает команду и в том случае, если она состоит не из одного, а из нескольких байт, то процессор читает эти байты, каждый раз увеличивая содержимое счетчика адреса на единицу. Затем микроконтроллер выполняет команду, еще раз увеличивает значение регистра PC на единицу и переходит к чтению и выполнению следующей команды. Если процессор встречает команду передачи управления, то исполняя ее, он записывает в регистр PC новый адрес (адрес перехода). В результате выполнение программы продолжается с этого самого адреса. Далее идет еще один шестнадцатиразрядный регистр DPTR. Который разделен на два восьмиразрядных регистра DPH (H- от английского слова High – верхний) и DPL (от Love – нижний). Процессор может использовать как весь регистр целиком, так и любую его часть по отдельности. Вообще то контроллер AT89C2051 – относится к классу восьмиразрядных микропроцессорных устройств. Однако, как все подобные устройства оно не может обойтись без хотя бы одного шестнадцатиразрядного регистра. Регистр адреса не считается, он всегда имеет не менее шестнадцати разрядов. Используется регистр в нескольких командах, в которых не обойтись без шестнадцатиразрядного регистра. Подробнее назначение всех регистров мы узнаем при детальном рассмотрении команд микроконтроллера. Следующие два регистра A и B мы увидим в том или ином виде в любом микропроцессоре. Регистр A – это так называемый аккумулятор. Аккумулятор – это основной регистр для всех арифметических и логических операций (сложение, вычитание, умножение, деление, логическое И, ИЛИ, НЕ и т. д.). Именно туда помещаются все результаты всех этих операций. Регистр B служит расширением аккумулятора, необходимым для осуществления операций умножения и деления. При умножении туда заносятся старшие разряды произведения (умножение двух восьмиразрядных чисел даст в общем случае шестнадцатиразрядный результат) или остаток от деления.
Далее на рисунке мы видим регистр PSW. Такой регистр мы так же можем найти в любом процессоре. Это так называемый регистр флагов. С одной стороны это обычный регистр. Процессор может, как читать, так и записывать информацию в этот регистр. Однако это не основное его назначение. На рисунке вы видите, что регистр разделен на отдельные биты. Эти биты имеют самостоятельное значение. Например, бит с названием CY служит для хранения признака переноса операции сложения и вычитания. Если складываемые числа состоят не из одного, а из двух и более байтов, то для их сложения создается небольшая подпрограмма. Она читает и складывает числа побайтно. При этом при сложении любой из пары байтов может возникнуть единица переноса в следующий разряд. Она то и записывается в бит хранения флага переноса CY. При сложении следующей пары байт этот бит так же учитывается. Флаг OV – служит для хранения признака арифметического переполнения результата, флаг P – хранит признак четности результата вычисления. Флаг AC – это флаг дополнительного переноса из младшей тетрады АЛУ в старшую (тетрада - это часть байта в четыре бита).. Два бита, обозначенные, как RS служат для определения текущего банка рабочих регистров. Что это такое чуть ниже. Флаг F0 – отдан в полное распоряжение программиста. Здесь он может хранить любой признак, нужный ему по ходу программы. Младший бит регистра PSW не используется. Хранение всех основных флагов в одном регистре позволяет легко сохранять их всех одной командой, где ни будь во временной ячейке памяти, например на время обработки запроса, на прерывание. Процессор может перейти к обработке запроса на прерывание в любой момент. К этому моменту во всех ячейках флагов может храниться нужная для дальнейшего вычисления информация. В процедуре обработки прерывания обязательно потребуется хранить свои флаги (особенно это касается флага CY без которого не обходится практически ни одно вычисление). Поэтому первое, что делает процедура обработки прерывания - это сохраняет регистр PSW. А по окончании процедуры обработки прерывания программа должна обязательно восстановить регистр PSW. Последним на рис. 34 показан регистр SP. На этом регистре нужно остановиться подробнее. Это регистр – указатель стека. Любой микропроцессор широко использует так называемую стековую память. Что же такое стековая память. Стековая память – это особый способ организации памяти. По принципу магазина в автомате Калашникова. Сначала вы вкладываете в магазин патроны один за другим. А затем автомат извлекает их из магазина в обратном порядке. Точно так же работает и стековая память. На рисунке 36 изображен процесс записи информации в стек и чтения из стека. При записи информации в стек новый байт помещается в самую первую ячейку стека. При записи в стек следующего байта, он так же заносится в первую ячейку, а содержимое этой ячейки, занесенное туда в предыдущем цикле записи перемещается во вторую ячейку. При записи третьего байта, второй переместится в ячейку 2, а первый в ячейку 3. Так происходит каждый раз, когда в стек заносится очередной байт. На рисунке изображен стек, состоящий из шести ячеек (говорят – стек глубиной в шесть ячеек). Это значит, что в него без вреда можно записать последовательно шесть байт. При записи седьмого байта, вся информация в стеке снова сместится вглубь стека. В результате самый первый байт будет потерян. Поэтому при использовании стековой памяти всегда нужно следить, что бы его глубина была достаточной.
Процесс считывания информации из стека происходит в обратном порядке. Когда происходит считывание байта из стека, то читается содержимое самой крайней ячейки памяти. Содержимое остальных ячеек сдвигается в обратную сторону так, что число из ячейки 2 переписывается в ячейку 1, из ячейки 3 в ячейку 2 и т. д. Точно как патроны, которые вынимают из магазина. Этот принцип называют: первым вошел – последним вышел. В микропроцессорной технике стек используется очень широко. Обычно он применяется для временного хранения, каких либо данных пока выполняется некая операция. Например, подпрограмма или процедура обработки прерывания. Часто в начале подпрограммы содержимое нескольких регистров последовательно заносится в стек. А в конце подпрограммы эти данные извлекаются из стека в обратном порядке. Реально стековая память любого микропроцессора организовывается немного по-другому. Стек организуется в обычной памяти данных. Для этого и применяется регистр – указатель стека (SP). В этом регистре всегда хранится адрес «вершины стека». Это тот адрес по которому будет записываться число, посылаемое в стек. В системе команд процессора имеется команда записи в стек и извлечения из стека. Во всех современных процессорах каждая команда записи в стек записывает в него сразу два байта. А команда чтения из стека соответственно два байта извлекает из стека. Это происходит следующим образом: По команде записи в стек процессор записывает информацию в ячейку, адрес которой хранится в регистре SP и увеличивает содержимое SP на единицу. Затем записывает второй байт и опять увеличивает SP на единицу. В результате содержимое SP увеличивается на 2. По команде чтения из стека сначала содержимое SP уменьшается на 1 и читается первый байт. Затем содержимое SP уменьшается еще на единицу и читается второй байт. Результат этих действий полностью аналогичен способу, изображенному на рис. 36. Преимущество в том что, меняя начальный адрес вершины стека для стековой памяти можно использовать любую область памяти данных. Необходимо лишь следить за тем, что бы для стека было отведено достаточное пространство памяти. И это пространство не использовалось бы для других целей. Теперь о регистрах, изображенных на рис. 35. Это так называемые регистры общего назначения. Они могут использоваться программистом для хранения любых промежуточных значений наряду с ячейками памяти (ОЗУ). Отличие их от ячеек памяти в том, что команды чтения и записи в эти регистры короче и выполняются быстрее. В микросхеме AT89C2051 имеются четыре группы (четыре банка) регистров общего назначения по восемь регистров в каждом. Все регистры общего назначения имеют восемь разрядов. В каждый момент времени включен только один из банков. Переключением банков ведает поле RS (два бита) в регистре флагов PSW. Когда в поле RS записано число 002, то работает банк 0. Когда там 012, то работает банк 1 и т. д. Наличие нескольких банков регистров общего назначения позволяет использовать в разных подпрограммах разные банки регистров. При этом можно не сохранять их содержимое в стеке при переходе от одной подпрограммы к другой. Нужно только вовремя переключать банки. Как это делается, мы увидим, когда начнем подробно разбирать управляющую программу позиционера спутниковой антенны. |
<< Предыдущая страница | К оглавлению | www.mirmk.ru | Следующая страница>> |