русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Ассемблер микроконтроллеров AVR и его особенности

Ассемблер микроконтроллеров AVR и его особенности

Общая информация

Здесь представлена информация по ассемблеру всей серии AVR, т.к. все микроконтроллеры этой серии программно совместимы.
Ассемблер – это инструмент, с помощью которого создаётся программа для микроконтроллера. Ассемблер транслирует ассемблируемый исходный код программы в объектный код, который может использоваться в симуляторах или эмуляторах AVR. Также ассемблер генерирует  код, который может быть непосредственно введен в программную память микроконтроллера.
При работе с ассемблером нет никакой необходимости в непосредственном соединении с микроконтроллером.

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

Строка  программы может  быть в одной из четырёх форм:

[ Метка:] директива [операнды] [Комментарий]
[ Метка:] команда [операнды] [Комментарий]
Комментарий
Пустая строка

Комментарий имеет следующую форму:

; [Текст]

Таким образом любой текст после символа “ ; ”    игнорируется  ассемблером и имеет значение только для пользователя.

Операнды можно задавать в различных форматах:

- десятичный (по умолчанию): 10,255
- шестнадцатеричный (два способа): 0x0а, $0а
- двоичный: 0b00001010, 0b11111111
- восьмеричный (впереди ноль): 010, 077

 

 

2 Система команд

Система команд микроконтроллеров ATMEL семейства AVR очень большая и в то же время эффективная. Одной из отличительных особенностей микроконтроллеров AVR является то, что почти все команды выполняются за 1 тактовый цикл. Исключение составляют команды перехода. Это существенно увеличивает производительность микроконтроллера даже при относительно невысокой тактовой частоте. 

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

  • команды передачи данных;
  • побитовые команды и команды тестирования битов.

 

 

3 Директивы ассемблера

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

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


Директива

Описание

BYTE

Зарезервировать байт под переменную

CSEG

Сегмент кодов

DB

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

DEF

Задать символическое имя регистру

DEVICE

Задать для какого типа микроконтроллера компилировать

DSEG

Сегмент данных

DW

Задать постоянное(ые) слово(а) в памяти

EQU

Установите символ равный выражению

ESEG

Сегмент EEPROM

EXIT

Выход из файла

INCLUDE

Включить исходный код из другого файла

LIST

Включить генерацию .lst - файла

NOLIST

Выключить генерацию .lst - файла

ORG

Начальный адрес программы

SET

Установите символ равный выражению

Синтаксис всех директив следующий:
.[директива]
То есть перед директивой должна стоять точка. Иначе ассемблер воспринимает это как метку.
Дадим несколько пояснений наиболее  важным директивам ассемблера

CSEG - Code segment

Директива CSEG  указывает на начало сегмента кодов. Ассемблируемый файл может иметь несколько кодовых сегментов, которые будут объединены          в один при ассемблировании.
Синтаксис:

.CSEG
Пример:
.DSEG                                   ; Начало сегмента данных
vartab: .BYTE 4              ; Резервируется 4 байта в СОЗУ
.CSEG                                   ; Начало сегмента кодов
const:  .DW 2               ; Записать 0x0002  в программной памяти
        mov r1,r0            ;  Что-то делать

DSEG - Data Segment

Директива DSEG указывает на начало сегмента данных.  Ассемблируемый файл может содержать несколько сегментов данных, которые потом будут собраны в один при ассемблировании. Обычно сегмент данных состоит лишь из директив BYTE  и меток.

Синтаксис:

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

ESEG - EEPROM Segment

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

.ESEG   

Пример:

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

ORG  - Установить адрес начала программы

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

.ORG  адрес

Пример:

.DSEG                      ; Начало сегмента данных
.ORG 0x37               ; Установить адрес СОЗУ  на 37h
variable: .BYTE 1    ; Зарезервировать байт СОЗУ по адресу 37h
.CSEG
.ORG 0x10               ; Установить счетчик команд на адрес   10h
          mov r0,r1        ; Чего-нибудь делать

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

Директива DB резервирует ресурсы памяти в программной памяти или           в EEPROM. Директиве должна предшествовать метка. DB задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.

Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение  должно быть величиной между –128 и 255.

Если директива указывается в сегменте кодов и список выражений содержит более двух величин, то выражения будут записаны так, что 2 байта будут размещаться в каждом слове   Flash-памяти.

Синтаксис:

LABEL:  .DB список выражений

Пример:

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

 

DW – Определить слово(а) в программной памяти или в EEPROM

         Директива DW резервирует ресурсы памяти в программной памяти или          в EEPROM.  Директиве  должна предшествовать метка. DW задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.

Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение  должно быть величиной между –32768 и 65535.

Синтаксис:

LABEL: .DW список выражений

Пример:

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

DEF – Присвоить имя регистру

         Директива DEF позволяет присвоить символическое имя регистру. Регистр может иметь несколько символических имен.
Синтаксис:

.DEF Имя=Регистр

Пример:

.DEF temp=R16
.DEF ior=R0
.CSEG
 ldi temp,0xf0               ; Загрузить 0xf0 в регистр temp
 in ior,0x3f                    ; Прочитать SREG в регистр ior
 eor temp,

EQU – Присвоить имя выражению

         Директива EQU присваивает значение метке. Эта метка может быть использована в других выражениях. Значение этой метки нельзя изменить или переопределить.

Синтаксис:

.EQU метка=выражение

Пример:

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

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.

Просмотров: 20864

Вы можете --> Заказать программу или Задать вопрос на форуме

Вернуться воглавление


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Полезен материал? Поделись:

Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.