Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное_пособие.doc
Скачиваний:
70
Добавлен:
10.11.2019
Размер:
8.13 Mб
Скачать

4 Ассемблер микроконтроллеров avr

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

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

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

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

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

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

.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 четырех значений, выбранных из таблицы и установка в единицу чтение значений из

.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 ;зеленый