Содержимое указателя увеличивается на единицу.

SPH:SPL = SPH:SPL + 1.

2. Число извлекается из ячейки памяти с адресом, хранящимся в указателе стека (SPH:SPL) → число.

Таким образом, стек растет от старших адресов к младшим, поэтому учитывая, что начальное значение указателя стека после сброса равно нулю, необходимо в инициализирующей части программы установить указатель стека, если предполагается использование хотя бы одной подпрограммы.

Регистры ввода/вывода, также изображенные на рис. 3.2, представляют собой набор регистров управления процессорного ядра и регистров управления и данных аппаратных узлов AVR-микроконтроллера. Регистрами ввода/вывода являются упоминавшиеся регистры SREG, MCUSR и указатель стека SPH:SPL, а также регистры, управляющие системой прерывания микроконтроллера, режимами подключения EEPROM памяти, сторожевым таймером, портами ввода/вывода и другими периферийными узлами. Изучение данных регистров удобно выполнять одновременно с изучением конкретного периферийного узла.

Все регистры ввода/вывода могут считываться и записываться через оперативные регистры при помощи команд IN, OUT (см. группу команд передачи данных). Регистры ввода/вывода, имеющие адреса в диапазоне $00– $1F (знак $ указывает на шестнадцатеричную систему счисления), обладают возможностью побитовой адресации. Непосредственная установка и сброс отдельных разрядов этих регистров выполняется командами SBI CBI (см. группу команд работы с битами). Для признаков результата операции, которые являются битами регистра ввода/вывода SREG, имеется целый набор команд установки и сброса. Команды условных переходов в качестве своих операндов могут иметь как биты-признаки результата операции, так и отдельные разряды побитно адресуемых регистров ввода/вывода.

Регистровый файл, блок регистров ввода/вывода и оперативная память, как показано на рис. 3.3, образуют единое адресное пространство, что дает возможность при программировании обращаться к 32 оперативным регистрам и к регистрам ввода/вывода как к ячейкам памяти, используя команды доступа к SRAM (в том числе и с косвенной адресацией).

На рис. 3.3 показано распределение адресов в едином адресном пространстве. Младшие 32 адреса ($0–$1F) соответствуют оперативным регистрам. Следующие 64 адреса ($20–$5F) зарезервированы для регистров ввода/вывода. Внутренняя SRAM у всех AVR начинается с адреса $60.

Таким образом, регистры ввода/вывода имеют двойную нумерацию. Если используются команды IN, OUT, SBI, CBI, SBIC, SBIS, то следует применять нумерацию регистров ввода/вывода, начинающуюся с нуля (назовем ее основной). Если же к регистрам ввода/вывода доступ осуществляется как к ячейкам памяти, то необходимо использовать нумерацию единого адресного пространства оперативной памяти данных AVR. Очевидно, что адрес в едином адресном пространстве памяти данных получается путем прибавления числа $20 к основному адресу регистра ввода/вывода.

Следует отметить, что регистры ввода/вывода не полностью используют отведенные для них 64 адреса. Неиспользуемые адреса зарезервированы для будущих применений, дополнительных ячеек памяти по этим адресам не существует.

Следует также иметь в виду, что у разных типов AVR одни и те же регистры ввода/вывода могут иметь различные адреса. Для того чтобы обеспечить переносимость программного обеспечения с одного типа кристалла на другой, следует использовать в программе стандартные, принятые в оригинальной фирменной документации символические имена регистров ввода/вывода, а соответствие этих имен реальным адресам задавать, подключая в начале своей программы (при помощи директивы ассемблера .INCLUDE) файл определения адресов регистров ввода/вывода.

Файлы определения адресов регистров ввода/вывода имеют расширение .inc. Они уже созданы разработчиками фирмы ATMEL и свободно распространяются. В этих файлах задается соответствие символических имен основным адресам регистров ввода/вывода. Если для обращения к регистру ввода/вывода используются команды обмена с SRAM, то к символическому имени необходимо прибавить число $20.

Кроме оперативной памяти программно доступными ресурсами микроконтроллера являются энергонезависимые, электрически программируемые FLASH- и EEPROM-блоки памяти, которые имеют отдельные адресные пространства.

Так как все команды AVR представляют собой 16-разрядные слова, FLASH-память организована как последовательность 16-разрядных ячеек и имеет емкость от 512 слов до 64 K слов в зависимости от типа кристалла.

Во FLASH-память кроме программы могут быть записаны постоянные данные, которые не изменяются во время функционирования микропроцессорной системы. Это различные константы, таблицы знакогенераторов, таблицы линеаризации датчиков и т. п. Данные из FLASH-памяти могут быть программным образом считаны в регистровый файл при помощи команд LPM, ELPM (см. группу команд передачи данных).

Младшие адреса памяти программ имеют специальное назначение. Адрес $0000 является адресом, с которого начинает выполняться программа после сброса процессора. Начиная со следующего адреса $0001, ячейки памяти программ образуют область векторов прерывания. В этой области для каждого возможного источника прерывания отведен свой адрес, по которому (в случае использования данного прерывания) размещают команду относительного перехода RJMP на подпрограмму обработки прерывания (рис. 3.3). Следует помнить, что адреса векторов прерывания одних и тех же аппаратных узлов для разных типов AVR могут иметь разное значение. Поэтому для обеспечения переносимости программного обеспечения удобно, так же как и в случае с регистрами ввода/вывода, использовать символические имена адресов векторов прерывания, которые определены в соответствующем inc-файле.

EEPROM-блок электрически стираемой памяти данных AVR предназначен для хранения энергонезависимых данных, которые могут изменяться непосредственно на объекте. Это калибровочные коэффициенты, различные установки, конфигурационные параметры системы и т. п. EEPROM-память данных может быть программным путем как считана, так и записана. Однако специальных команд обращения к EEPROM-памяти нет. Чтение и запись ячеек EEPROM выполняется через регистры ввода/вывода EEAR (регистр адреса), EEDR (регистр данных) и EECR (регистр управления).