Читайте также: |
|
С помощью языка Ассемблер можно создавать эффективные по длине кода и по быстродействию программы. Однако при этом имеются сложности и увеличивается время разработки программного обеспечения.
Программа на ассемблере представляет собой текстовый файл, который состоит из мнемоник (ассемблерных команд микроконтроллера), меток и директив. Стандартный формат текста ассемблерной программы представляет собой невидимые колонки меток, команд и комментария. Комментарии всегда начинаются с “; ”. Численное значение адреса в командах переходов и вызовов подпрограмм в программах на Ассемблере заменяется текстовым значением, соответствующем сути перехода или вызова.
Любая строка текста программы может начинаться с метки – набор символов, заканчивающийся двоеточием. Метки используются для обозначения строки некоторым именем и используются, в основном, для обозначения начала подпрограммы, в командах условных переходов и для обозначения данных в программной памяти.
Компилятор, кроме команд микроконтроллера поддерживает директивы. Директивы используются для указания о расположении частей программы в памяти, для именования ресурсов микроконтроллера и др..
Программа - компилятор по “известным ей мнемоникам, директивам и длине команд” преобразует текст программы в двоичный код и определяет адреса ячеек в соответствии с метками при помощи программного счетчика.
Ниже приведен перечень некоторых директив.
.ORG adress – присвоить абсолютный адрес
Пример:.ORG 0x12
Команда следующая за этой директивой помещается Ассемблером в ячейку 0х12 программной памяти.
.DEF NAME - присвоить имя регистру РОН
Пример:.DEF COUNTER=R20 Регистру R20 присвоить имя COUNTER.
.EQU – присвоить имя выражению или константе
Пример:.EQU PAUSE = 34 значение 34 именовать именем PAUSE.
.DB – определить байт-константу в программной памяти или в EEPROM
.DW – определение слова-константы в программной памяти или EEPROM
.INCLUDE “FILE NAME”– вставить файл, имя которого в кавычках
Ассемблер позволяет использовать в тексте программы выражения.
ВЫРАЖЕНИЯ могут содержать операнды, функции и операции.
В качестве операндов могут быть использованы:
- метки;
- константы, определенные директивой EQU;
- целые константы: десятичные с записью 10,255
· шестнадцатиричные с записью 0хс4 или $45
· двоичные с записью 0b10001100.
· коды символов ASCII c записью ‘A’,’a’.
Функции:
LOW (выражение) – младший байт выражения,
HIGH (выражение) – старший байт выражения и др.
Операции:
§ Умножение – знак *, пример: LDI R30,label*2;
§ Деление - знак /, пример: LDI r23,46|2;
§ Сложение знак +, пример: LDI R24, 0xCC+20;
§ Вычитание знак -;
§ Сдвиг влево и вправо знаки << и >> на число разрядов, указанное после знака, пример: LDI R16,0b00000011<<4;
§ Логические операции и др.
Пример: программа управления светофором
Красная, желтая и зеленая лампы подключены к разрядам порта B соответственно: к 6,7 и 5. Времена свечения ламп: красной 0,5*10=5сек, желтой 0,5*3=1,5сек, зеленой 0,5*8=4сек. Всего в таблице 25 значений.
Комментарии описывают не команды Ассемблера, а функции программы. Функция приведенной программы: циклическая загрузка в порт D значений, выбираемых из таблицы с интервалом 0,3 секунд.
.include "m16def.inc";Включен файл имен ресурсов МК
.DEF COUNTER=R20
.org 0;Начало программы с нулевой ячейки
rjmp start;Обход вектора прерывания
.org $c;адрес вектора прерывания по совпадению Т1
rjmp tim1_A;Вектор прерывания по совпадению Т1
start: ldi R16,4;Обошли вектор
out sph,R16;Загрузка старших и младших разрядов
ldi R16,$5f;указателя стека SP значениями 3FF -
out spl,R16;адресом старшей ячейки ОЗУ
ldi counter,0;Обнуление счетчика
ldi R16,$ff;Настройка
out ddrb,R16;порта В на вывод
sei;Общее разрешение прерываний
ldi R16,0b00010000;Разрешение прерываний по совпадению
out timsk,R16;таймера Т1
ldi R16,$9c;Значения, соответствующие
out ocr1ah,R16;временному интервалу 0,5сек в регистр
ldi R16,$40;сравнения OCR1A
out ocr1al,R16
ldi R16,0b01000000;Настройка Т1 в режим сброса по
out tccr1a,R16;совпадению
ldi R16,0b00001001;Включается Т1
out tccr1b,R16
loop: rjmp loop
tim1A: ldi zh,high(tab*2);В регистр Z адрес начала таблицы
ldi zl,low(tab*2)
add zl, COUNTER;Адрес текущего элемента в tab
ldi R16,0;Чтобы не потерять
adc zh,R16;возможный перенос
lpm;Чтение значения из прогр. памяти
out portb,R0;Переключение светофора
inc COUNTER;Адрес след. элемента в tab
cpi COUNTER,25;Сравнение с числом значений в таблице
brne quit;Если не последнее, то повторять выбор
ldi COUNTER,0;Счетчик для нового цикла
quit: reti
tab:.db $40,$40,$40,$40,$40,$40,$40,$40,$40,$40;красный
.db $80,$80,$80;желтый
.db $10,$10,$10,$10,$10,$10,$10,$10,$10;зеленый
Дата добавления: 2015-07-20; просмотров: 163 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Энергонезависимая память данных | | | Типы данных, объявление данных |