В начале любой программы, как правило, подключается один из стандартных заголовочных файлов, поставляемых вместе с пакетом программ AVR Studio.
Заголовочные файлы существуют для всех моделей AVR. По умолчанию исходной директорией их размещения является “С:\Program Files\Atmel\AVRTools\AvrAssembler2\Appnotes”. Каждый файл имеет имя подобное "m8def.inc", в котором первая часть указывает на модель микроконтроллера.
Заголовочный файл содержит объявление всех символьных имен, которые могут быть использованы в программе. В первую очередь к ним относятся названия управляющих РВВ и их битовых полей:
; ***** I/O REGISTER DEFINITIONS ************************** ; NOTE: ; Definitions marked "MEMORY MAPPED" are extended I/O ports ; and cannot be used with IN/OUT instructions .equ SREG = 0x3F .equ SPL = 0x3D .equ SPH = 0x3E . .equ TWAR = 0x02 .equ TWSR = 0x01 .equ TWBR = 0x00 ; ***** BIT DEFINITIONS *********************************** . ; ***** CPU ************************** ; SREG - Status Register .equ SREG_C = 0 ; Carry Flag .equ SREG_Z = 1 ; Zero Flag .equ SREG_N = 2 ; Negative Flag .equ SREG_V = 3 ; Two's Complement Overflow Flag .equ SREG_S = 4 ; Sign Bit .equ SREG_H = 5 ; Half Carry Flag .equ SREG_T = 6 ; Bit Copy Storage .equ SREG_I = 7 ; Global Interrupt Enable .
Директива .equ связывает название каждого из РВВ с его фактическим адресом в адресном пространстве ввода-вывода. Эти адреса могут использоваться только совместно с инструкциями in, out, sbi, cbi, sbis, sbic. Если обращаться к управляющему регистру как к ячейке памяти в абсолютном адресном пространстве, то к его имени необходимо будет добавлять смещение 0x20:
lds SPL+0x20,R16 ;копировать R16 в ячейку 0x5D SRAM (0x3D I/O).
Обозначения РВВ и их битов в точности совпадают с теми, которые приводятся в технической документации на каждую конкретную модель. Поэтому не рекомендуется изменять эти имена в заголовочном файле по своему усмотрению. Стандартные названия помогают облегчить переносимость программ в пределах одного семейства. Если, например, понадобиться перенести рабочий код с модели ATmega8 на ATmeg8535, то все что надо будет сделать – это заменить в исходном тексте файле "m8def.inc" на "m8535def.inc" и заново откомпилировать проект.
В каждом заголовочном файле РОНам R27…R31 директивой .def присвоены дополнительные служебные имена:
; ***** CPU REGISTER DEFINITIONS ************************** .def XH = R27 .def XL = R26 .def YH = R29 .def YL = R28 .def ZH = R31 .def ZL = R30
Файл содержит также объявление ряда констант, которые часто встречаются в процессе программирования (размеры различных областей памяти, начальные адреса секции загрузчика и т.д.):
; ***** DATA MEMORY DECLARATIONS ************************** .equ FLASHEND = 0x0FFF ; Note: Word address .equ IOEND = 0x003F .equ SRAM_START = 0x0060 .equ SRAM_SIZE = 1024 .equ RAMEND = 0x045F .equ XRAMEND = 0x0000 .equ E2END = 0x01FF .equ EEPROMEND = 0x01FF .equ EEADRBITS = 9 ̣̣̣̣̣̣̣̣ ; ***** BOOTLOADER DECLARATIONS *************************** .equ NRWW_START_ADDR = 0xC00 .equ NRWW_STOP_ADDR = 0xFFF .equ RWW_START_ADDR = 0x0 .equ RWW_STOP_ADDR = 0xBFF .equ PAGESIZE = 32 .equ FIRSTBOOTSTART = 0xF80 .equ SECONDBOOTSTART = 0xF00 .equ THIRDBOOTSTART = 0xE00 .equ FOURTHBOOTSTART = 0xC00 .equ SMALLBOOTSTART = FIRSTBOOTSTART .equ LARGEBOOTSTART = FOURTHBOOTSTART
В конце файла приведена таблица векторов прерывания:
; ***** INTERRUPT VECTORS ********************************* .equ INT0addr = 0x0001 ; External Interrupt Request 0 .equ INT1addr = 0x0002 ; External Interrupt Request 1 .equ OC2addr = 0x0003 ; Timer/Counter2 Compare Match ̣̣̣̣̣̣̣̣ .equ ACIaddr = 0x0010 ; Analog Comparator .equ TWIaddr = 0x0011 ; 2-wire Serial Interface .equ SPMRaddr = 0x0012 ; Store Program Memory Ready .equ INT_VECTORS_SIZE = 19 ; size in words
Перейти к следующей части: Структура программы
Комментарии (0)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация