Работа №2 микроконтроллер atmega103: команды обработки данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Работа №2 микроконтроллер atmega103: команды обработки данных



Цель работы: изучение команд арифметических и логических операций, сдвигов и битовых операций, практическое освоение приемов программирования на ассемблере, изучение директив.

Введение

Для обработки данных микроконтроллер ATmega103 использует группу команд, реализующих арифметические и логические операции, сдвиги и операции над отдельными битами. Арифметические операции являются операциями над 8-разрядными целыми числами. Для выполнения целочисленных операций над длинными словами служат команды сложения и вычитания с учетом флага переноса. Для выполнения операций над числами с плавающей точкой, реализации тригонометрических функций и т.д. служат библиотеки периода выполнения, входящие в состав интегрированной системы программирования «AVR Studio».

Арифметические и логические команды приведены в табл.2.1. и табл.2.2.

 

Таблица 2.1 – Арифметические и логические команды

Мнемо­ника

Операнды

Описание

Операция

Флаги

K-bo циклов

ADD

Rd,Rr

0≤d≤31

0≤r≤31

Сложить без переноса

Rd ←Rd + Rr

Z, C, N, V, H

1

ADC

Rd,Rr

0≤d≤31

 0≤r≤31

Сложить с переносом

Rd ←Rd + Rr + С

Z, C, N, V, H

1

ADIW

Rd,K

d | {24,26,28,30} 0≤K≤63

Сложить непосредственное, значение со словом

Rdh:Rdl ←Rdh:Rdl + К

Z, C, N, V

2

SUB

Rd,Rr

0≤d≤31

0≤r≤31

Вычесть без заема

Rd ← Rd - Rr

Z, C, N, V, H

1

SUBI

Rd, К 16<d<31 0≤K≤255

Вычесть непосредственное значение

Rd ← Rd - К

Z, C, N, V, H

1

SBC

Rd, Rr

 0≤d≤31

0≤r≤31

Вычесть с заемом

Rd ←Rd - Rr-C

Z, C, N, V, H

1

SBCI

Rd, К

16≤d≤31

0≤K≤255

Вычесть непосредственное значение с заемом

Rd ←Rd - K-C

Z, C, N, V, H

1

SBIW

Rd, К

 d | £{24,26,28,30} 0≤K≤63

Вычесть непосредственное значение из слова

Rdh:Rdl← Rdh:Rdl - К

Z, C, N, V

2

AND

Rd, Rr

0≤d≤31

0≤r≤31

Выполнить логическое AND

Rd ←Rd • Rr

Z, N, V

1

AND I

Rd, К

16≤d≤31

0≤K≤255

Выполнить логическое AND

Rd ←Rd • К

Z, N, V

1

OR

Rd, Rr

0≤d≤31

0≤r≤31

Выполнить логическое OR

Rd ←Rd v Rr

Z, N, V

1

ORI

Rd, К 16≤d≤31 0≤К≤255

Выполнить логическое OR с непосредственным значением

Rd ←Rd v К

Z, N, V

1  

EOR

Rd, Rr 0≤d≤31 0 ≤r≤31

Выполнить исключающее OR

Rd ←Rd © Rr

Z, N, V

1  

СОМ

Rd 0≤d≤31

Выполнить дополнение до единицы

Rd ←$FF - Rd

Z, C, N, V

1  

NEG

Rd 0≤d≤31

Выполнить дополнение до двух

Rd← $00 - Rd

Z, C, N, V, H

1  

SBR

Rd, К 16≤d≤31 0≤K≤255

Установить биты в регистре

Rd ← Rd v К

Z, N, V

1  

CBR

Rd, К 16≤d≤31 0≤K≤255

Очистить биты в регистре

Rd← Rd • (SFF - K)

Z, N, V

1  

INC

Rd 0≤d≤31

Инкрементировать

Rd ←Rd + 1

Z, N, V

1  

DEC

Rd 0≤d≤31

Декрементировать

Rd← Rd - 1

Z, N, V

1  

TST

Rd 0≤d≤31

Проверить на ноль или минус

Rd ←Rd • Rd

Z, N, V

1  

CLR

Rd 0≤d≤31

Очистить регистр

Rd ← Rd Ф Rd

Z, N, V

1  

SER

Rd 16≤d≤31

Установить все биты регистра

Rd ←$FF

нет

1  

CP

Rd, Rr 0≤d≤31 0≤r≤31

Сравнить

Rd-Rr

Z, C, N, V, H

1  

СРС

Rd, Rr 0≤d≤31 0≤r≤31

Сравнить с учетом переноса

Rd-Rr-C

Z, C, N, V, H

1  

CPI

Rd, К 16≤d≤31 0≤K≤255

Сравнить с константой

Rd-K

Z, C, N, V, H

1  
                       

 

 

Таблица 2.2 – Команды сдвигов и операций с битами

Мнемо­ника

Операн­ды

Описание

Операция

Флаги

Кол-во циклов

 
LSL

Rd

0≤d≤31

Логически сдвинуть влево

Rd(n+1) ←Rd(n),

Rd(0) ←0, С← Rd(7)

Z,C,N,V,H

1

 
LSR

Rd

0≤d≤31

Логически сдвинуть вправо

Rd(n) ←Rd(n+1),

Rd(7) ←0, С← Rd(0)

Z,C,N,V

1

 
ROL

Rd

0≤d≤31

Сдвинуть влево через перенос

Rd(0) ←С,

Rd(n+1) ←Rd(n), С← Rd(7)

Z,C,N,V,H

1

 
ROR

Rd

0≤d≤31.

Сдвинуть вправо через перенос

Rd(7) ←C, Rd(n) ← Rd(n+1), С←Rd(0)

Z.C.N,V

1

 
ASR

Rd

0≤d≤31

Арифметически сдвинуть вправо

Rd(n) ← Rd(n+1), С← Rd(0), n=0...6

Z,C,N,V

1

 
SWAP

Rd

0≤d≤31

Поменять тетрады местами

Rd(3...0) ↔Rd(7...4)

Нет

1

 
BSET

s

0≤s≤7

Установить флаг

SREG(s) ←1

SREG(s)

1

 
BCLR

s

0≤s≤7

Очистить флаг

SREG(s) ← 0

SREG(s)

1

 
SBI

P,b

0≤P≤31 0≤b≤7

Установить бит в регистр I/O

l/0(P,b) ←1

Нет

2

 
CBI

P,b 0≤P≤31 0≤b≤7

Очистить бит в регистре I/O

l/0(P,b) ←0

Нет

2

 

BST

Rd,b

0≤d≤31 0≤b≤7

Переписать бит из регистра во флаг Т

Т←Rd(b)

Т

1

BLD

Rd,b 0≤d≤31 0≤b≤7

Загрузить Т флаг в бит регистра

Rd(b) ←Т

Нет

1

SEC

 

Установить флаг переноса

С← 1

С

1

CLC

 

Очистить флаг переноса

С←0

С

1

SEN

 

Установить флаг отрицательного значения

N←1

N

1

CLN

 

Очистить флаг отрицательного значения

N← 0

N

1

SEZ

 

Установить флаг нулевого значения

Z ←1

Z

1

CLZ

 

Очистить флаг нулевого значения

Z←0

Z

1

SEI

 

Установить флаг глобального прерывания

k←1

I

1

CLI

 

Очистить флаг глобального прерывания

U←0

I

1

SES

 

Установить флаг знака

S←1

S

1

CLS

 

Очистить флаг знака

S←0

S

1

SEV

 

Установить флаг переполнения

V←1

V

1

CLV

 

Очистить флаг переполнения

V←0

V

1

SET

 

Установить флаг Т

T← 1

т

1

CLT

 

Очистить флаг Т

T←0

т

1

SEH

 

Установить флаг полупереноса

H← 1

н

1

CLH

 

Очистить флаг полупереноса

H← 0

н

1

NOP

 

Выполнить холостую команду

 

Нет

1

SLEEP

 

Установить режим SLEEP

См. описание команды

Нет

1

WDR

 

Сбросить сторожевой таймер

См. описание команды

Нет

1

                       

 

ВЫПОЛНЕНИЕ РАБОТЫ

1. Изучить набор команд арифметических, логических, битовых операций и сдвигов, выполняемых микроконтроллером ATmega103.

2. Запустить на компьютере систему программирования «AVR Studio». Используя команду Help открыть справочную систему, в разделе Help topics главу AVR Assembler и изучить параграф Assembler Directives, особенно в части директив EQU и ORG.

3. Создать новый проект Project_demo02 и файл исходного текста demo02.asm, поместить в него следующий текст:

 

.include "m103def.inc"

;********Определение констант*****************************************************

.EQU lniX=$60

.EQU lniY=$70

.EQU lniZ=$80

.EQU NCircle=16

.ORG 0

 rjmp $30

;***** Инициализация указателей, счетчика циклов и флага управления переносом *****

 .ORG $30

ldi R26,low(lniX)                            ; загрузка per. X значением указателя на память данных

ldi R27,high(lniX)                           ;

ldi R28,low(lniY)                            ; загрузка per. Y значением указателя на память данных

ldi R29,high(lniY)                           ;

ldi R30,low(lniZ)                             ; загрузка per. Z значением указателя на память данных

ldi R31,high(lniZ)                            ;

ldi R16,Ncircle                                 ; в R16 - счетчик циклов =2*N чисел

ldi R17,$00                                       ; в R17 - 0

ldi R18,$01                                         ; в R18 - 1 в младший бит

;***** Сложение массивов 16-разрядных чисел***************************************

LP1:

sbrs R17, 0

clc

LP2:   ld R3, X+                         ; загрузка байта 1-операнда

ld R4, Y+                         ; загрузка байта 2-операнда

adc R3, R4                       ; сложение байтов операндов с учетом переноса

st Z+, R3                          ; запись результата в память

eor R17, R18                    ; чередование 0 и 1 в младшем бите R17

dec R16                            ; декремент счетчика байтов

            brne LP1                           ; зацикливание, если счетчик байтов не равен нулю

loop:     rjmp loop                          ; зацикливание программы для исключения зависаний

 

Эта программа читает восемь пар двухбайтных операндов из ОЗУ данных, складывает операнды побайтно с учетом флага переноса и посылает результаты также в ОЗУ. В программе, кроме уже встречавшейся нам директивы ORG, использованы директивы EQU, с помощью которых определяются имена констант, встречающихся далее в тексте. Этими константами являются значения адреса областей ОЗУ, где хранятся операнды и результаты, количество циклов сложения. Область первых операндов начинается с адреса $60, вторых операндов - $70, результата - $80. Количество циклов равно 2байта*8операндов=16.

Для сокращения числа команд внутри цикла предусмотрена одинаковая обработка первых байтов операндов, которые складываются без учета переноса, и вторых байтов, складываемых с учетом значения бита С. Единый цикл использует команду ADC, но дополнительно привлекается бит 0 регистра R17, значение которого изменяется при каждом проходе. При R17.0=0 (обработка первых байтов) бит переноса обнуляется. Такой алгоритм применим только для 16-разрядных операндов. Для работы программы необходим счетчик, три указателя на области ОЗУ и флаг обнуления бита переноса. В качестве счетчика циклов используется регистр R16. Его содержимое декрементируется и проверяется командой BRNE, которая организует цикл. В качестве указателей на ячейки-источники операндов используются регистры X и Y. На текущую ячейку-приемник результата указывает регистр Z.       

1. Выполнить трансляцию исходного файла командой Project | Assemble (F7). Далее ввести команду Debug | Trace Into (F11), после чего в открывшемся окне Simulator Options указать типа микроконтроллера ATmega103 и тактовую частоту 4,0МГц. После этого с помощью команды View можно открыть окна отображения ресурсов процессора, памяти и регистров общего назначения.

2. Используя прямое редактирование ОЗУ данных (матрица Data в окне Memory) занести в ячейки с адреса $60 шестнадцать байтов любого кода, которые будут представлять восемь первых двухбайтных операндов. С адреса $70 занести шестнадцать байтов другого кода, которые будут представлять восемь вторых двухбайтных операндов. Первые байты операндов, например, могут быть такие:

$60: АА 02 03 04...

$70: CD 04 05 06...

3. Выполнить программу по шагам, инициируя выполнение каждой команды клавишей F11. Наблюдать изменение значений в регистрах микроконтроллера и ячейках ОЗУ данных с помощью окна Memory. При указанных выше операндах результаты должны быть следующими:

$80:77 07 08 0А...

Система «AVR Studio» записывает в память трасс последовательность выполняемых команд отлаживаемой программы. Окно трассы открывается по команде View | Trace, интерпретировать его содержимое можно с помощью информации, доступной по команде Help | Help topics | AVR Studio Simulator | Contents of trace buffer. Если по окну трассы щелкнуть правой клавишей мыши, то откроется окно команд трассировки. По одной из команд содержимое памяти трасс может быть записано в файл. Это полезно, поскольку при вложенных циклах даже небольшая по тексту программа может выполняться долго и трудна для анализа.

 

Окно трассы выполнения программы demo02.asm видно ниже: (Рисунок 2.1.)

Кроме режима пошаговой отладки в системе «AVR Studio» существует еще режим отладки с остановами в контрольных точках (breakpoints). Этот режим позволяет останавливаться (и анализировать состояние микроконтроллера) только на определенных командах. После выполнения первой команды Debug | Trace into открывается возможность использовать все опции команды Breakpoints, управляющей механизмом контрольных точек. Эта команда с опцией Toggle Program Breakpoint (F9) устанавливает контрольную точку в строке исходного текста, где находится курсор. После этого можно использовать опцию Go (F5) команды Debug, которая запускает прогон отлаживаемой программы от текущего состояния до контрольной точки. Курсор тоже может рассматриваться как контрольная точка, имеется вариант Debug | Run to cursor (Ctrl+F1O). Эта команда выполняет прогон от текущего положения до курсора.

У команды Breakpoints имеется опция Show list(Ctrl+B), которая открывает окно со списком всех контрольных точек. С помощью этого окна точки можно перемещать, запрещать, разрешать. Имеется также опция Clear all Program Breakpoints, позволяющая очистить все контрольные точки.

4. Написать и отладить программу выполнения одного из следующих заданий, выполнить анализ ее трассы, сохранить трассу в файле и распечатать его.

 

Рисунок 2.1 – Окно трассировки программы

 

Задания.

 

1. Выполнить попарное сложение 16-разрядных чисел со знаком, содержащихся в двух массивах объемом по 15 чисел с начальными адресами $хх, $уу, результаты сохранить в массиве с начальным адресом $zz. Номера чисел, при сложении которых возникло переполнение, записать в регистры R20 и R21. Общее количество переполнении указать в регистре R22.

2. Выполнить попарное вычитание 16-разрядных чисел со знаком, содержащихся в двух массивах объемом по 10 чисел с начальными адресами $хх, $уу, результаты сохранить в массиве с начальным адресом $zz. При переполнении результат округлять до максимального положительного или отрицательного значения. Общее количество округлений указать в регистре R22.

3. Выбрать числа с минимальным и максимальным значением из массива, содержащего 40 16- разрядных чисел со знаком, которые размещены в памяти, начиная с адреса $хх. Минимальное и максимальное число записать в регистры R20, R21, а порядковые номера этих чисел в исходном массиве данных - в регистры R22 и R23.

4. Выполнить сравнение 8-разрядных чисел, содержащихся в массиве объемом из 50 чисел с начальным адресом $хх, с эталоном, хранящимся регистре R17. Числа, несовпадающие с эталоном, разместить в массиве с начальным адресом $уу. Общее число несовпадающих чисел записать в регистр R20.

 

Вопросы для защиты работы:

 

1. Команды логических операций  ATMega 103.

2. Команды арифметических операций ATMega 103.

3. Команды сдвигов и битовых операций ATMega 103.

4. Директивы препроцессора ATMega 103.


 

 



Поделиться:


Читайте также:




Последнее изменение этой страницы: 2019-11-02; просмотров: 289; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.15.63.145 (0.123 с.)