Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп лек по ЭиУА.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
934.4 Кб
Скачать

5.2 Счетчик команд

Счетчик команд (Program Counter — PC) используется для адресации, или указания, считываемой из памяти программ команды. Этот 13-битный регистр обычно инкрементируется после каждой выборки, функционируя как двоичный счетчик. Однако, как мы с вами увидим в следующей лекции, существует ряд ко­манд, таких как команда goto, выполнение которых вызывает переход к другому месту в памяти программ. Соответственно, нормальное функционирование счет­чика команд нарушается. Программист может также напрямую обращаться к счетчику команд через память данных.

В счетчике команд микроконтроллера PIC16F84 задействованы только младшие 10 бит (210 = 1024), поэтому число команд ограничено. Если программа попытается перейти по адресу, находящемуся вне этого диапазона, то адрес окажется «сверх памяти программ». В любом случае счетчик команд очищается при сбросе микроконтроллера, т.е. первая выполняемая команда, всегда располагается по адресу h’000’. Этот адрес называется вектором сброса.

5.3 Стек

Корректную работу основной программы и подпрограмм обеспечивает стек. В него записывают номер последней команды из счетчика команд при вызове подпрограммы. Из этой подпрограммы может быть вызвана другая подпрограмма. Чтобы, в конечном счете, вернуться обратно в основную программу, последовательность действий при возврате должна в точ­ности соответствовать последовательности действий при входе. Это обеспечива­ется LIFO-структурой стека (последний пришел – первый ушел), который автоматически поддерживает произволь­ные вложенные последовательности, причем глубина вложенности ограничена только размером стека. В микроконтроллерах среднего семейства число уровней вложенности равно восьми. Стековый механизм также используется и для обработки прерываний. Поэтому в системах, использующих как подпрограммы, так и прерывания, глубина вложенности будет немного меньше. Этот способ настолько удобен, что практически используется во всех микропроцессорах.

Рассмотрим ситуацию, показанную на рисунке 5.1, где главная программа MP вызывает подпрограмму первого уровня P1, которая, в свою очередь, вызывает подпрограмму второго уровня P2.

Рисунок 5.1 – Вложенные подпрограммы

При вызове подпрограммы Р1 в стек записывается номер последней команды из счетчика команд, обозначим её как MPn. При вызове из подпрограммы Р1 новой подпрограммы Р2 в вершину стека записывается из счетчика команд номер последней команды, обозначим её как Р1k, а команда MPn опускается на более низкий уровень стека. При выполнении команды Return из Р2, Команда P1k переходит в счетчик команд, а команда MPn вновь поднимается на вершину стека. Подпрограмма Р1 продолжает выполняться со следующей команды после Call P2. При выполнении команды Return из Р1, Команда MPn переходит в счетчик команд, стек освобождается и основная программа продолжает работу со следующей команды после Call P1.

Поскольку стек совместно со своим указателем является частью «железа» микроконтроллера и не требует инициализации, программист должен учитывать только следующие моменты:

- вызов подпрограмм должен осуществляться с помощью команды Call;

- точка входа в подпрограмму должна быть помечена (это её имя);

- последней командой в подпрограмме должна быть команда Return или Retlw, причем, последняя используется для загрузки в рабочий регистр заданной константы L при возврате из подпрограммы.