Асемблер на микроконтролер AVR и неговите характеристики - Life-Prog

Главна информация

Ето информация за асемблера на цялата серия AVR, защото. Всички микроконтролери от тази серия са софтуерно съвместими. Асемблерът е инструмент, който създава програма за микроконтролера. Асемблерът превежда изходния код на асемблера на програмата в обектен код, който може да се използва в симулатори или AVR емулатори. Асемблерът също генерира код, който може да бъде въведен директно в програмната памет на микроконтролера. Когато работите с асемблер, няма нужда да се свързвате директно към микроконтролера.

Изходният файл, с който асемблерът работи, трябва да съдържа мнемоники, директиви и етикети. Можете да поставите пред всеки програмен ред етикет, който е буквено-цифров низ, завършващ с двоеточие. Етикетите се използват като инструкции за безусловни скокове и инструкции за условни скокове.

Програмният низ може да бъде в една от четирите форми:

[ Етикет:] директива [операнди] [Коментар] [ Етикет:] команда [операнди] [Коментар] Коментар Празен низ

Коментарът има следната форма:

Така всеки текст след знака „ ; ” се игнорира от асемблера и има значение само за потребителя.

Операндите могат да бъдат зададени в различни формати:

- десетичен (по подразбиране): 10.255 - шестнадесетичен (два начина): 0x0a, $0a - двоичен: 0b00001010, 0b11111111 - осмичен (водеща нула): 010, 077

2 Командна система

Наборът от инструкции на микроконтролерите ATMEL от семейството AVR е много голям и в същото време ефективен. Една от отличителните черти на AVR микроконтролерите е, че почти всички команди се изпълняват в 1тактов цикъл. Изключение правят командите за прескачане. Това значително повишава производителността на микроконтролера дори при относително ниска тактова честота.

Всички команди могат да бъдат класифицирани в 5 типа: 1. аритметични команди; 2. логически команди; 3. команди за преход;

  • команди за трансфер на данни;
  • битови команди и битови тестови команди.

3 Директиви за асемблерния език

Асемблерът поддържа много директиви. Директивите не се превеждат директно в кодове за операции. Напротив, те се използват за регулиране на местоположението на програма в паметта, дефиниране на макроси, инициализиране на паметта и т.н. Тоест, това са инструкции към самия асемблер, а не команди на микроконтролера. Всички директиви на асемблер са дадени в таблица. 1.2.

Таблица 1.2. Директиви за асемблер

Директива

Описание

Резервирайте байт за променлива

Задайте постоянен(и) байт(ове) в паметта

Задайте символно име на регистър

Задайте какъв тип микроконтролер да се компилира

Задайте постоянна дума(и) в паметта

Задайте знак равен на израз

Включете изходния код от друг файл

Разрешете генерирането на .lst файл

Деактивирайте генерирането на .lst файл

Задайте знак равен на израз

Синтаксисът на всички директиви е както следва: .[директива] Тоест директивата трябва да се предхожда от точка. В противен случай асемблерът го третира като етикет. Нека дадем няколко обяснения на най-важните директиви за асемблер

CSEG-код сегмент

Директивата CSEG показва началото на кодов сегмент. Файлът за сглобяване може да има няколко кодови сегмента, които ще бъдат комбинирани ведин при сглобяването. Синтаксис:

.CSEG Пример: .DSEG ; Начало на сегмент от данни vartab: .BYTE 4 ; Запазени 4 байта в SRAM .CSEG ; Начало на кодов сегмент const: .DW 2 ; Напишете 0x0002 в програмната памет mov r1,r0 ; нещо за правене

DSEG - Сегмент за данни

Директивата DSEG показва началото на сегмент от данни. Файлът, който се сглобява, може да съдържа няколко сегмента от данни, които след това ще бъдат сглобени в един по време на сглобяването. Обикновено сегмент от данни се състои само от BYTE директиви и етикети.

.DSEG Пример: .DSEG ; Начало на сегмент от данни var1: .BYTE 1; Резервирайте 1 байт за var1 таблица: .BYTE tab_size; Резервирайте tab_size байтове. .CSEG ldi r30,low(var1) ldi r31,high(var1) ld r1,Z

ESEG - EEPROM сегмент

Директивата ESEG сочи към началото на сегмент от EEPROM памет. Файлът, който се сглобява, може да съдържа няколко EEPROM сегмента, които ще бъдат сглобени в един сегмент по време на сглобяването. Обикновено сегментът на EEPROM се състои от DB и DW директиви (и етикети). Сегментът на EEPROM паметта има свой собствен брояч. Директивата ORG може да се използва за поставяне на променливи в желаната област на EEPROM. Синтаксис:

.DSEG; Начало на сегмент от данни var1: .BYTE 1; Резервирайте 1 байт за var1 таблица: .BYTE tab_size; Резервирайте tab_size байтове. .ESEG eevar1: .DW 0xffff ; Напишете 1 дума в EEPROM

Директивата ORG присвоява стойности на локални броячи. Използва се само във връзка с директиви .CSEG, .DSEG, .ESEG. Синтаксис:

DB - дефиниране на байт(ове) в програмната памет или EEPROM

Директивата DB запазва ресурсите на паметта в програмната памет или в EEPROM. Директивата трябва да бъде предшествана от етикет. DB указва списък с изрази и трябвасъдържа поне един израз. Директивата трябва да бъде поставена в кодовия сегмент или в сегмента на EEPROM.

Списъкът с изрази е поредица от изрази, разделени със запетаи. Всеки израз трябва да има стойност между -128 и 255.

Ако директивата е посочена в кодовия сегмент и списъкът с изрази съдържа повече от две стойности, тогава изразите ще бъдат написани така, че 2 байта ще бъдат поставени във всяка дума на флаш паметта.

ЕТИКЕТ: .DB списък с изрази

.CSEG const: .DB 0, 255, 0b01010101, -128, 0xaa .ESEG const2: .DB 1,2,3

DW - Дефиниране на дума(и) в програмната памет или EEPROM

Директивата DW запазва ресурсите на паметта в програмната памет или в EEPROM. Директивата трябва да бъде предшествана от етикет. DW определя списък от изрази и трябва да съдържа поне един израз. Директивата трябва да бъде поставена в кодовия сегмент или в сегмента на EEPROM.

Списъкът с изрази е поредица от изрази, разделени със запетаи. Всеки израз трябва да има стойност между -32768 и 65535.

ЕТИКЕТ: .DW списък с изрази

.CSEG varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535 .ESEG eevarlst: .DW 0,0xffff,10

DEF - Дайте име на регистър

Директивата DEF ви позволява да присвоите символно име на регистър. Един регистър може да има множество символни имена. Синтаксис:

.DEF temp=R16 .DEF ior=R0 .CSEG ldi temp,0xf0; Заредете 0xf0 във временния регистър в ior,0x3f; Прочетете SREG в регистър ior eor temp,

EQU - Присвояване на име на израз

Директивата EQU присвоява стойност на етикет. Този етикет може да се използва в други изрази. Стойността на този етикет не може да бъде променена или заменена.

.EQU io_offset = 0x23 .EQU porta =io_offset + 2 .CSEG; Начало на кодов сегмент clr r2 ; Изчистване на регистъра r2 out porta,r2 ; Пишете на порт А

ВКЛЮЧВАНЕ - вмъкване на друг файл

.INCLUDE "име на файл"

; iodefs.asm: .EQU sreg = 0x3f; Регистър на състоянието .EQU sphigh = 0x3e; Старшият байт на указателя на стека. .EQU splow = 0x3d; ; Ниският байт на указателя на стека. ; incdemo.asm .INCLUDE iodefs.asm; Включете файл "iodefs.asm" в r0,sreg ; Прочетете регистъра на състоянието

ИЗХОД – изходен файл

Директивата EXIT позволява на асемблера да спре асемблирането на текущия файл. Обикновено асемблерът работи до края на файла. Ако срещне директива EXIT, ще продължи да се сглобява от реда след директивата INCLUDE. Синтаксис:

.ИЗХОД ; излезте от този файл

УСТРОЙСТВО - Посочете за кой микроконтролер да се сглоби Директивата позволява на потребителя да каже на асемблера за какъв тип устройство се пише програмата. Ако асемблерът срещне инструкция, която не се поддържа от определения тип микроконтролер, ще бъде издадено съобщение. Също така ще се появи съобщение, ако размерът на програмата надвишава количеството налична памет в това устройство. Синтаксис:

.DEVICE AT90S1200 AT90S2313 AT90S2323 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90S8534 AT90S8535 ATtiny11 ATtiny12 ATtiny22 ATmega603 ATmega103

.УСТРОЙСТВО AT90S8535 ; използвайте AT90S8535 .CSEG .ORG 0000 jmp label1; При сглобяване се появява съобщение, че AT90S8535 не поддържа командата jmp 1.5.2.4 Някои функции за програмиране

Пример за използване на различни команди:

LDI R16,$FF OUT $12,R16 - запис на номер 255 в PORTD. STS $0032,R16 - запис на номер 255 директно в клетка $0032. АдресI/O регистър в SRAM се получава чрез добавяне на $20 към номера на порта. Програмната памет е ROM и се променя само когато чипът е програмиран. Константите могат да се съхраняват в програмната памет като думи.

CPI Rd,K - сравнява регистър Rd с константа K. 16