Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Работа №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; просмотров: 310; Нарушение авторского права страницы; Мы поможем в написании вашей работы!
infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.59.217.1 (0.008 с.)