AVR Studio 4 (Version 4.12 Service Pack 4 Build 498) |
Написал microsin | |
06.05.2007 | |
1. Директивы начинаются с точки (.INCLUDE, .DB) 2. Определения регистров для ATmega16 можно взять в файле c:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m16def.inc . Для этого его нужно скопировать в директорию проекта, снять на копии атрибут "только чтение" и включить в начало ассемблерной программы командой .INCLUDE "m16def.inc" Кроме того, в этом файле нужно закомментировать строку (иначе ассемблер ругнется на переопределение директивы OR):
;.equ OR =3
После этого можно в программе указывать символьные имена.
3. Инициализация стека в ATmega16: .ORG 0 JMP RESET ... RESET: ldi r16, low(RAMEND) out SPL, r16 ldi r16, high(RAMEND) out SPH, r16 ...
4. Назначение имен константам (например, для обозначения ножек процессора): .EQU _KEY =PB7 .EQU _LED =PB6 .EQU OC0 =PB3 .EQU _BEEPER =PB1 LDI r16, (1<<_KEY)|(1<<_LED)|(1<<OC0)|(1<<_BEEPER) ;0xCA out PORTB, r16
5. Для назначения имен регистрам применяется команда .DEF или .SET: .DEF ampl =r0 .DEF time8a =r1
6. Константы напрямую могут загружаться только в регистры r16..r31, и только оттуда - в другие регистры: ldi r16, 128 mov r0, r16
7. Константы из таблиц памяти программ может считывать только команда LPM, которая загружает данные в регистр R0 через адрес, который загружается в регистровую пару Z. Замечу, то TABLE - это метка в сегменте .CSEG, и поскольку каждая команда занимает 2 байта, адрес метки TABLE надо умножить на 2.
8. В обработчиках прерывания почти всегда нужно сохранять регистр статуса SREG. Делается это специальным образом - сохраняется SREG в стек через пересылку в обычный регистр r0..r31, поскольку команды PUSH/POP работают только с регистрами r0..r31: |
|
Последнее обновление ( 03.04.2013 ) |