- •1. Техническое описание лабораторного комплекса
- •1.1. Назначение комплекса
- •1.2. Состав комплекса
- •1.3. Технические данные комплекса
- •1.4. Структура комплекса и общие принципы работы
- •1.5 Общие принципы работы с комплексом
- •1.5.2 Ассемблер микроконтроллеров avr и его особенности
- •1.5.2.2 Система команд
- •1.5.2.3 Директивы ассемблера
- •Cseg - Code segment
- •Dseg - Data Segment
- •Eseg - eeprom Segment
- •Org - Установить адрес начала программы
- •Db - определить байт(ы) в программной памяти или в eeprom
- •Dw – Определить слово(а) в программной памяти или в eeprom
- •Def – Присвоить имя регистру
- •Equ – Присвоить имя выражению
- •Include –вставить другой файл
- •1.5.3.1 Написание программы
- •1.7 Сбои в лабораторном комплексе и их устранение
Include –вставить другой файл
Директива INCLUDE говорит Ассемблеру начать читать из другого файла. Ассемблер будет ассемблировать этот файл до конца файла или до директивы EXIT. Включаемый файл может сам включать директивы INCLUDE.
Синтаксис: .INCLUDE "имя файла"
Пример: ; iodefs.asm: .EQU sreg = 0x3f ; Регистр статуса .EQU sphigh = 0x3e ; Старший байт указателя стека. .EQU splow = 0x3d; ; Младший байт указателя стека.
; incdemo.asm .INCLUDE iodefs.asm ; Включить файл «iodefs.asm» in r0,sreg ; Прочитать регистр статуса
EXIT – выйти из файла
Директива EXIT позволяет ассемблеру остановить ассемблирование текущего файла. Обычно ассемблер работает до конца файла. Если он встретит директиву EXIT, то продолжит ассемблировать со строки, следующей за директивой INCLUDE.
Синтаксис: .EXIT
Пример: .EXIT ; выйти из этого файла
DEVICE - Указать для какого микроконтроллера ассемблировать
Директива позволяет пользователю сообщить ассемблеру, для какого типа устройства пишется программа. Если ассемблер встретит команду, которая не поддерживается указанным типом микроконтроллера, то будет выдано сообщение. Также сообщение появится в случае, если размер программы превысит объем имеющейся в этом устройстве памяти.
Синтаксис: .DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103
Пример: .DEVICE AT90S8535 ; использовать AT90S8535
.CSEG
.ORG 0000
jmp label1; При ассемблировании появиться сообщение, что ;AT90S8535 не поддерживает команду jmp
1.5.2.4 Некоторые особенности программирования
Память данных почти полностью доступна программе пользователя и большинство команд ассемблера предназначено для обмена данными с ней. Команды пересылки данных предоставляют возможность непосредственной и косвенной адресации ячеек СОЗУ, непосредственной адресации регистров ввода/вывода и регистров общего назначения. Так как каждому регистру сопоставлена ячейка памяти, то обращаться к ним можно не только командами адресации регистров, но и командами адресации ячеек СОЗУ.
Например, команда:
MOV R10,R15 скопировать регистр R15 в регистр R10
делает абсолютно то же самое, что и команда:
LDS R10,$0015 загрузить в регистр R10 содержимое ячейки с адресом $0015
То же самое относится и к регистрам ввода/вывода. Для них предусмотрены специальные команды:
IN Rd,P загрузить данные из порта I/O с номером Р в регистр Rd
OUT P,Rd записать данные из регистра Rd в порт I/O с номером Р.
При использовании этих команд номер порта указывается в диапазоне 0<P<63. При использовании команд адресации ячеек памяти для работы с регистрами ввода/вывода указывается адрес регистра в памяти данных $0020-$005F.
Пример применения разных команд:
LDI R16,$FF
OUT $12,R16 записать в PORTD число 255.
STS $0032,R16 записать непосредственно в ячейку $0032 число 255.
Адрес регистра ввода/вывода в СОЗУ получается прибавлением к номеру порта числа $20.
Память программ является ПЗУ и изменяется только при программировании кристалла. Константы можно располагать в памяти программ в виде слов.
Например: .dw $033f,$676d,$7653,$237e,$777f
Для работы с данными, расположенными в памяти программ, предусмотрена команда
LPM загрузить байт памяти программ, на который указывает регистр Z в регистр R0.
Адрес байта константы определяется содержимым регистра Z. Старшие 15 битов определяют слово адреса (от 0 до 4к) состояние младшего бита определяет выбор младшего байта (0) или старшего байта (1).
При работе с портами ввода/вывода следует учитывать следующую особенность. Если вывод порта сконфигурирован как выход, то его переключение производится через регистр данных (PORTA, PORTB, PORTC, PORTD), если вывод сконфигурирован как вход, то его опрос следует производить через регистр выводов входа порта (PINA, PINB, PINC, PIND).
Особенностью использования арифметических и логических команд является то, что некоторые из них работают только с регистрами R16-R31.
Пример:
CPI Rd,K сравнить регистр Rd с константой К. 16<d<31.
Команды CBI и SBI работают только с младшими 32-мя регистрами ввода/вывода.
При использовании подпрограмм нужно обязательно определять стек! Для этого нужно занести значения адреса вершины стека в регистры SPH и SPL.
1.5.3 Программирование микроконтроллера