Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Язык Ассемблер

Читайте также:
  1. Программный способ формирования временных интервалов на языке Ассемблер

С помощью языка Ассемблер можно создавать эффективные по длине кода и по быстродействию программы. Однако при этом имеются сложности и увеличивается время разработки программного обеспечения.

Программа на ассемблере представляет собой текстовый файл, который состоит из мнемоник (ассемблерных команд микроконтроллера), меток и директив. Стандартный формат текста ассемблерной программы представляет собой невидимые колонки меток, команд и комментария. Комментарии всегда начинаются с “; ”. Численное значение адреса в командах переходов и вызовов подпрограмм в программах на Ассемблере заменяется текстовым значением, соответствующем сути перехода или вызова.

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

Компилятор, кроме команд микроконтроллера поддерживает директивы. Директивы используются для указания о расположении частей программы в памяти, для именования ресурсов микроконтроллера и др..

Программа - компилятор по “известным ей мнемоникам, директивам и длине команд” преобразует текст программы в двоичный код и определяет адреса ячеек в соответствии с метками при помощи программного счетчика.

Ниже приведен перечень некоторых директив.

.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 | Нарушение авторских прав


Читайте в этой же книге: Команды сдвигов и операций с битами | Встроенные устройства | Подсистема прерываний микроконтроллера | Общие сведения | Режимы быстрой ШИМ №№5,6,7,14,15. | Режимы Точной фазы №№ 1,2,3,10,11. | Последовательный периферийный интерфейс - SPI | UART - универсальный последовательный порт | Аналоговый компаратор | Аналого-цифровой преобразователь |
<== предыдущая страница | следующая страница ==>
Энергонезависимая память данных| Типы данных, объявление данных

mybiblioteka.su - 2015-2024 год. (0.009 сек.)