Раздел: Документация
0 ... 51 52 53 54 55 56 57 ... 195 команда — команда расширенного косвенного вызова eicall. Если не принимать во внимание некоторые отличия, описанные ниже, эти команды работают так же, как и соответствующие команды безусловного перехода. Относительный вызов подпрограммы — команда rcall Сначала команда rcall сохраняет в стеке адрес возврата — текущее значение счетчика команд, увеличенное на 1. Затем содержимое счетчика команд увеличивается или уменьшается на некоторое значение, являющееся операндом команды (см. Рис. 2.37). Поскольку операнд представляет собой 12-битное число, максимальная величина перехода составляет от -2047 до +2048 слов (±4 Кбайт). В программах в качестве операндов этой команды, как и в случае команды rjmp, используются метки. Ассемблер сам вычисляет величину перехода и подставляет это значение в слово команды. Во всех моделях, кроме ATmega2560x/2561x, команда относительного вызова подпрограмм выполняется за 3 такта, два из которых затрачиваются на сохранение в стеке двухбайтного счетчика команд. В моделях же ATmega2560x/2561x эта команда выполняется за 4 такта, поскольку счетчик команд — трехбайтный. Абсолютный вызов подпрограммы — команда call При выполнении команды после сохранения в стеке адреса возврата в счетчик команд загружается число, являющееся операндом команды (см. Рис. 2.38). С помощью этой команды можно осуществлять вызов в пределах всего адресного пространства имеющихся на сегодняшний день микроконтроллеров AVR. Команда абсолютного вызова подпрограмм выполняется за 4 такта (в моделях ATmega2560x/2561x — за 5). Косвенный вызов подпрограммы — команды icall и eicall Команда icall сначала сохраняет в стеке адрес возврата. Затем в счетчик команд загружается содержимое индексного регистра (Рис 2.39, а). Так как индексный регистр — 16-битный, то максимально возможная величина перехода составляет 128 Кбайт (в моделях с объемом памяти программ более 128 Кбайт старшие биты счетчика команд обнуляются). В микроконтроллерах ATmega2560x/256lx появилась команда расширенного косвенного вызова подпрограмм — eicall. Эта команда после сохранения в стеке адреса возврата копирует в счетчик команд содержимое регистра Z и регистра ввода/вывода EIND (Рис. 2.39, б) Во всех моделях, кроме ATmega2560x/2561x, команда icall выполняется за 3 такта. В моделях ATmega2560x/2561x обе команды — icall и eicall - выполняются за 4 такта. 2.3.7. Команды возврата из подпрограмм В конце каждой подпрограммы обязательно должна находиться команда возврата из нее. В системе команд микроконтроллеров семейства имеется две таких команды. Для возврата из обычной подпрограммы, вызываемой командами вызова подпрограмм, используется команда RET. Для возврата из подпрограммы обработки прерывания используется команда RETI. Обе команды восстанавливают из стека содержимое счетчика команд, сохраненное там перед переходом к подпрограмме. Команда возврата из подпрограммы RETI дополнительно устанавливает в 1 флаг общего разрешения прерываний I регистра SREG, сбрасываемый аппаратно при возникновении прерывания. На выполнение каждой из команд возврата из подпрограммы требуется 4 или 5 (в моделях ATmega2560x/2561x) тактов. 2.4. Стек Во всех микроконтроллерах семейства Mega стек реализован программно. Он размещается в памяти данных, и его глубина определяется только размером свободной области памяти данных. В качестве указателя стека во всех моделях используется пара регистров ввода/вывода SPH:SPL, расположенных по адресам $ЗЕ ($5Е) и $3D ($5D) соответственно. Так как после подачи напряжения питания (или после сброса) в регистрах содержится нулевое значение, в самом начале программы указатель стека необходимо проинициализировать, записав в него значение верхнего адреса памяти данных. Обычно это делается следующим образом: ldi rl6,low(RAMEND) out SPL,rl6 ldi r16 , high(RAMEND) out SPH,rl6 Загрузим в рабочий регистр младший байт значения Инициализируем указатель стека Загрузим в рабочий регистр старший байт значения Инициализируем указатель стека При вызове подпрограмм адрес команды, расположенной за командой вызова, сохраняется в стеке. Значение указателя стека при этом уменьшается на 2 или 3, в зависимости от размера счетчика команд. При возврате из подпрограммы этот адрес извлекается из стека и загружается в счетчик команд. Значение указателя стека соответственно увеличивается на 2 (3). То же происходит и во время прерывания. При генерации прерывания адрес следующей команды сохраняется в стеке, а при возврате из подпрограммы обработки прерывания он восстанавливается из стека. Во всех моделях микроконтроллеров семейства Mega стек доступен программно. Для работы со стеком имеются две команды: команда занесения в стек (push) и команда извлечения из стека (POP). ГЛАВА Система команд 3.1.Общие сведения Система команд микроконтроллеров AVR семейства Mega весьма развита и насчитывает в различных моделях от 130 до 135 различных инструкций. Несмотря на то что микроконтроллеры AVR являются микроконтроллерами с RISC-архитектурой (процессор с сокращенным набором команд), по количеству реализованных инструкций и их разнообразию они больше похожи на микроконтроллеры с CISC-архитектурой (процессор с полным набором команд). Практически каждая из команд (за исключением команд, у которых одним из операндов является 16-битный адрес) занимает одну ячейку памяти программ. Причем это достигнуто не за счет сокращения числа команд процессора, а за счет увеличения разрядности памяти программ. 3.2.Операнды Программа для любого микроконтроллера представляет собой последовательность команд, записанных в памяти программ. Большинство команд при выполнении изменяют содержимое одного или нескольких регистров общего назначения, регистров ввода/вывода или ячеек ОЗУ. Для обращения к различным областям адресного пространства памяти данных используются различные команды, реализующие, в свою очередь, различные способы адресации. Подробно способы адресации памяти данных были рассмотрены в главе 2. Доступ к регистрам ввода/вывода осуществляется по их адресам, являющихся операндами команды. Однако при написании программ гораздо удобнее обращаться к регистрам, используя вместо числовых значений адресов их стандартные, принятые в документации символические имена. Чтобы задать соответствие этих имен реальным адресам, необходимо подключить в начале программы (при помощи директивы ассемблера . INCLUDE) файл определения адресов регистров ввода/вывода. Помимо всего прочего, такое решение облегчит перенос программного обеспечения с одного типа кристалла на другой. 0 ... 51 52 53 54 55 56 57 ... 195
|