Основи програмування і налагодження контролерів AVR 


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



ЗНАЕТЕ ЛИ ВЫ?

Основи програмування і налагодження контролерів AVR



Основи програмування і налагодження контролерів AVR

 

2.1. Програми AVR Assembler v.1.0

 

Відкриття асемблерних файлів

 

Новий або існуючий асемблерний файл можна відкрити в WAVRASM. Для кожного нового файлу створюється нове вікно редагування.

Для створення нового асемблерного файлу потрібно нажати кнопку на панелі інструментів або нажати меню File >> New (ALT – F N). Для відкриття уже існуючого асемблерного файлу потрібно нажати кнопку на панелі інструментів або нажати меню File >> Open (ALT – F O). Для того, щоб обновити активне вікно текстового редактора потрібно нажати кнопку на панелі інструментів або нажати меню File >> Reload. Для запису файлу потрібно нажати кнопку на панелі інструментів або нажати меню File >> Save (ALT – F S).

 

Інтегрований редактор

 

В текстовому редакторі фрагменти тексту можна вирізати в буфер обміну, а потім з буферу вставляти в будь-яке місце програми. Для переміщення текстового фрагменту необхідно виконати наступні дії:

· Виділити фрагмент, який потрібно перемістити.

· Нажати на кнопку на панелі інструментів або ж нажати меню Edit>> Cut (Shift-Del). Фрагмент переміститься в буфер обміну.

· Поставити курсор в те місце програми, куди потрібно вставити даний текстовий фрагмент.

· Нажати на кнопку на панелі інструментів або ж нажати меню Edit>> Paste (Shift-Ins).

Якщо якийсь фрагмент буде повторюватись при подальшому написанні програми, його можна скопіювати в буфер обміну, а потім вставити в потрібне місце. Для копіювання текстового фрагменту необхідно:

· Виділити фрагмент, який необхідно скопіювати.

· Нажати на кнопку на панелі інструментів або ж нажати меню Edit>> Copy (Ctrl-Ins).

· Поставити курсор в те місце програми, куди потрібно вставити даний текстовий фрагмент.

· Нажати на кнопку на панелі інструментів або ж нажати меню Edit>> Paste (Shift-Ins).

Щоб повернути видалений текст, потрібно нажати кнопку на панелі інструментів або ж нажати меню Edit>> Undo (Alt-Backspace) зразу ж після видалення тексту.

 

Написання програми

 

Для прикладу розглянемо просту програму: в регістр R17 запишемо число 5, а в регістр R18 – число 7. Знайдемо суму і результат виведемо на порт D.

 

 

.device AT90S1200

.include “1200def.inc”

Ser R16

Out DDRD, R16

Ldi R17, 5

Ldi R18, 7

Add R17, R18

Out PortD, R17

 

Перша строчка програми – це об’явлення того пристрою (мікроконтролера), для якого буде написана програма. Device являється директивою асемблера. Всі директиви починаються з крапки. Слідуюча директива Include викликає бібліотеку 1200def.inc, в якій описана робота мікроконтролера AT90S1200, всі його порти і регістри.

Далі уже йде тіло програми.

Команда Ser установлює всі біти регістру R16 в одиниці.

Команда Out DDRD, R16 налагоджує порт D на вивід даних. Для цього в порту D існує регістр DDRD, який відповідає за запис-зчитування інформації. Якщо біти регістру DDRD встановленні в нуль, то на порт D можна записувати інформацію. Якщо ж біти регістру DDRD встановленні в одиницю, то з порту D зчитують інформацію.

Команди Ldi R17, 5 і Ldi R18, 7 записують в регістри R17 і R18 значення 5 і 7 відповідно. Дана команда працює тільки з регістрами R16 – R31.

Команда Add R17, R18 додає значення регістрів R17 і R18 і результат записує в регістр R17.

Out PortD, R18 виводить на порт D значення регістру R17.

 

Асемблування програми

 

Після написання програми її потрібно проасемблувати. Для цього в головному меню треба нажати команду Assemble. Але перед цим потрібно налаштувати опції асемблування. Меню налаштування асемблування Options показано на рис.2.1.

Рис.2.1

Для того, щоб записати проасембловану програму в контролер, нам потрібно, щоб вона мала шістнадцятирічний формат hex. Для цього у строку Output-file extension потрібно ввести hex.

Наступне меню Output file format пропонує вибрати формат вихідного файлу. Для Atmel-контролерів вибираємо останній стандарт Intel Intellec 8/MDS.

В самому низу є два меню, для вибору яких потрібно поставити галочку. Перше меню Wrap relative jumps означає, що в проасемблованій програмі буде виконуватись автоматичний перехід при відносному переході. Тобто при виконанні команди RJMP виконується автоматичний перехід на задану мітку. Якщо буде активне друге меню Save before assemble, то вихідний файл буде записаний після асемблування.

 

 

Вивчення пакету AVR Studio

 

Після того, як була проасемблована програма, її можна перевірити в AVR Studio. Цей пакет є симулятором будь-якого мікроконтролеру фірми Atmel серії AT90S*.

Для відкриття програми заходимо в меню File >> Open (Ctrl-O) і відкриваємо програму з форматом obj. Цей формат з’являється автоматично при асемблуванні програми. Після відкриття файлу відкривається так називаєме вихідне вікно, яке показано на рис.2.2.

Рис.2.2

 

В даному вікні зображується код програми, який можна продивитися в дисасемблованому варіанті за допомогою перемикача {mov}. Кожна команда, яка буде виконуватись, відмічена маркером.

Далі можна відкрити вікно регістрів (меню View >> Registers), вікно процесора (View >> Processor), вікно пам’яті (View >> New memory view), а також периферійні пристрої (View >> Peripheral). До периферійних пристроїв відносяться 8-бітний таймер – лічильник, порти (Port A, Port B, Port C, Port D), регістри енергонезалежної пам’яті EEPROM.

 

 

2.2.1.Вікно регістрів

Складається з 32-х регістрів і має вигляд, як показано на рис.2.3.

Рис.2.3

 

Величини регістрів можуть змінюватись після виконання команди. Значення регістрів можна змінювати самостійно. Для цього потрібно поставити курсор на значення регістру і нажати двічі ліву кнопку миші з невеликою паузою між натисканням кнопки. Після цього вписати нове значення регістру у шістнадцятирічному коді.

 

Вікно процесора

 

Вказує всю необхідну інформацію про команду, яка виконується в даний момент (рис.2.4).

Рис.2.4

 

Програмний лічильник (Program Counter) вказує адресу команди, яка буде виконуватись. Він вказує адрес в 16-річному коді і цей код може бути змінений після зупинки команди. Коли значення програмного лічильника змінюється, поточна команда відкидається. Після зміни значення програмного лічильника програма переходить на наступну адресу.

Стековий вказівник (Stack Pointer) зберігає поточне значення стекового вказівника, які розташовані в області вводу-виводу. Якщо мітка має апаратний стек замість базового стеку SRAM, вона вказується в полі стекового вказівника. Значення стекового вказівника може бути змінено після того, як зупинено виконання команди.

Лічильник циклів (Cycle Counter) дає інформацію про кількість циклів тактового генератора, які пройшли після останнього скидання. Значення лічильника циклів записується в десятковому коді і може бути змінений після зупинки команди.

Прапорці (Flags) показують поточне значення бітів статус регістру (Status register). Коли виконання команди зупинено, ці біти можуть бути змінені натисканням кнопки миші на визначений біт. Відмічений прапорець означає, що відповідний біт статус регістру має значення 1.

 

2.2.3. Вікно пам’яті

 

Використовується користувачем для огляду і модифікації змісту змінних пам’яті, які використовуються у виконуємих мітках (рис.2.5). Одне й теж вікно використовується для огляду різних типів пам’яті: пам’яті даних, програмної пам’яті, пам’яті вводу-виводу і енергонезалежної пам’яті EEPROM.

Рис.2.5

 

Тип пам’яті, який потрібно продивитись, може бути змінений в меню вибору пам’яті, яке знаходиться в верхньому лівому куті вікна пам’яті. Коли створюється нове вікно пам’яті, пам’ять даних (Data memory) створює стандартний тип пам’яті.

Адресація і зміст пам’яті завжди відображаються в 16-річному коді. Користувач може увімкнути огляд змісту пам’яті в символах ASCII, а також продивитись зміст пам’яті в 8-річному коді. Користувач може змінити зміст пам’яті подвійним натисканням кнопки миші (double click).

 

2.2.4. Вікно порту

 

Відкривається в меню View >> Peripheral >> Port >> Port A (Port B, Port C, Port D) і має вигляд як показано на рис.2.6.

Рис.2.6

 

Вікно порту має три різні регістри вводу-виводу (Port – регістр даних, Pin – ніжки порту, DDR – Data Direction Registers (регістри напрямку передачі даних)), які звичайно зв’язані з портом. Ніжки порту використовуються тільки для зчитування, в той час як регістр даних і регістри напрямку передачі даних – для зчитування/запису.

Pin не являється регістром, по цьому адресу здійснюється доступ до фізичних значень кожного із виводів порту. При зчитуванні з регістру даних Port, зчитуються дані з “регістру-защіпку”, при зчитуванні з Pin зчитуються логічні значення, які знаходяться на виводах порту.

Біти регістру DDR вибирають напрямок передачі даних. Якщо біт встановлений (1), вивід сконфігурований як вихід. Якщо біт скинутий (0) – вивід сконфігурований як вхід.

 

Вибір контролера

 

В AVR Studio існують симулятори всіх контролерів серії AT90S*. Для вибору контролера заходимо в меню Options >> Simulator Options (рис.2.11).

Рис.2.11

 

В меню Device вибираємо потрібний контролер. Якщо вибрати варіант Custom, то можна задати свої параметри контролера. В меню Program Memory задаємо об’єм програмної пам’яті, в меню Data Memory - об’єм пам’яті даних, в меню EEPROM - об’єм енергонезалежної пам’яті і в меню I/O Size - об’єм пам’яті вводу-виводу.

 

 

Операція

(i) Rd < $FF
  Синтаксис Операнди: Лічильник програм:
(i) SER Rd 16 < Rd < 31 PC < PC + 1

Операція

(i) PC < PC + k + 1 Пристрої з 16-розрядним лічильником команд, максимум 128 Кбайт пам’яті програм
(ii) PC < PC + k + 1 Пристрої з 22-розрядним лічильником команд, максимум 8 Мбайт пам’яті програм
  Синтаксис Операнди: Лічильник програм: Стек
(i) RCALL k -2K < k <2K PC < PC + k + 1 STACK < PC + 1; SP < SP-2 (2 байта, 16 біт)
(ii) RCALL k -2K < k <2K PC < PC + k + 1 STACK < PC + 1; SP < SP-3 (3 байта, 22 бітa)

Операція

(i) PC(15-0) < STACK Пристрої з 16-розрядним лічильником команд, максимум 128 Кбайт пам’яті програм
(ii) PC(21-0) < STACK Пристрої з 22-розрядним лічильником команд, максимум 8 Мбайт пам’яті програм
  Синтаксис Операнди: Лічильник програм: Стек
(i) RET None Див. операцію SP < SP+2 (2 байта, 16 бит)
(ii) RET None Див. операцію SP < SP+3 (3 байта, 22 битa)

Операція

(i) PC(15-0) < STACK Пристрої з 16-розрядним лічильником команд, максимум 128 Кбайт пам’яті програм
(i) PC(21-0) < STACK Пристрої з 22-розрядним лічильником команд, максимум 8 Мбайт пам’яті програм
  Синтаксис Операнди: Лічильник програм: Стек
(i) RETI None Див. операцію SP < SP+2 (2 байта, 16 бит)
(ii) RETI None Див. операцію SP < SP+3 (3 байта, 22 битa)

Операція

  Синтаксис Операнди: Лічильник програм:
(i) SLEEP None PC < PC + 1

Приклади написання програм

 

В даному розділі приведено приклади програм для мікроконтролера AT90S1200. Оскільки він являється наймолодшим із серїї AVR, то програми будуть працювати й на інших серіях AVR-контролерів. Слід зазначити, що у AT90S1200 всього 2 порти вводу-виводу (порт В і порт D), один з яких – порт D – неповний. В нього немає старшого (7-го) розряду.

Приклад1. Розробити програму, котра виводить 1-цю на b0 порту В при натисканні кнопки і тримає її значення на протязі 10 секунд.

.device at90s1200

.include "1200def.inc"

ser r16; всі біти регістра R16 встановлюються в одиницю

out ddrb,r16; налаштовування порту В на вивід

loop: clr r18; очистка регістра R18

out portb,r18; вивід значення регістра R18 на порт В

sbic pind,0; якщо нульовий біт порту D дорівнює 0, то програма пропускає;наступну команду

rjmp loop; перехід на початок програми (мітку loop)

ldi r18,1; присвоїти регістру R18 константу 1

out portb,r18; вивід значення регістра R18 на порт В

rcall Delay; виклик підпрограми

rjmp loop; перехід на початок програми (метку loop)

Delay:; підпрограма затримки на 10 секунд

clr r19; очистка регістра R19

clr r21; очистка регістра R21

clr r20; очистка регістра R20

n1: inc r19; інкремент (+1) регістра R19

cpi r19,255; порівняння регістра R19 з 255

brne n1; якщо R19¹255, то програма переходить на мітку n1

inc r20; інкремент (+1) регістра R20

cpi r20,255; порівняння регістра R20 з 255

brne n1; якщо R20¹255, то програма переходить на мітку n1

inc r21; інкремент (+1) регістра R21

cpi r21,160; порівняння регістра R21 з 160

brne n1; якщо R21¹160, то програма переходить на мітку n1

ret; повернення із підпрограми в те місце, звідки дана підпрограма;викликалась

 

Приклад 2. Зчитати з порту В (біти b0¸b3) одне двійкове слово, а з порту В (біти b4¸b7) друге. Виконати операцію логічного “І” над ними і інверсію над результатом. Отриманий результат вивести на біти d3¸d6 порту D.

.device at90s1200;

.include "1200def.inc";

ser r16; всі біти регістра R16 встановлюються в одиницю

out ddrd,r16;налаштування порту D на вивід

loop: in r17,pinb;ввод даних з порту В в регістр R17

bst r17,0; копіювання нульового біта регістра R17 в біт-акумулятор Т регістра;статусу

bld r18,0; загрузка в нульовий біт регістра R18 значення біт-акумулятора

bst r17,1; копіювання першого біта регістра R17 в біт-акумулятор

bld r18,1; загрузка в перший біт регістра R18 значення біт-акумулятора

bst r17,2; копіювання другого біта регістра R17 в біт-акумулятор

bld r18,2; загрузка в другий біт регістра R18 значення біт-акумулятора

bst r17,3; копіювання третього біта регістра R17 в біт-акумулятор

bld r18,3; загрузка в третій біт регістра R18 значення біт-акумулятора

bst r17,4; копіювання четвертого біта регістра R17 в біт-акумулятор

bld r19,0; загрузка в нульовий біт регістра R19 значення біт-акумулятора

bst r17,5; копіювання п’ятого біта регістра R17 в біт-акумулятор

bld r19,1; загрузка в перший біт регістра R19 значення біт-акумулятора

bst r17,6; копіювання шостого біта регістра R17 в біт-акумулятор

bld r19,2; загрузка в другий біт регістра R19 значення біт-акумулятора

bst r17,7; копіювання сьомого біта регістра R17 в біт-акумулятор

bld r19,3; загрузка в третій біт регістра R19 значення біт-акумулятора

and r18,r19;побітова операція логічного “І” над регістрами R18 и R19 (результат;операції записується в регістр R18)

com r18;інвертування регістра R18

bst r18,0; копіювання нульового біта регістра R18 в біт-акумулятор

bld r20,3; загрузка в третій біт регістра R20 значення біт-акумулятора

bst r18,1; копіювання першого біта регістра R18 в біт-акумулятор

bld r20,4; загрузка в четвертий біт регістра R20 значення біт-акумулятора

bst r18,2; копіювання другого біта регістра R18 в біт-акумулятор

bld r20,5; загрузка в п’ятий біт регістра R20 значення біт-акумулятора

bst r18,3; копіювання третього біта регістра R18 в біт-акумулятор

bld r20,6; загрузка в шостий біт регістра R20 значення біт-акумулятора

out portd,r20; вивід значення регістра R20 в порт D

rjmp loop;перехід на мітку loop (начало програми)

 

Приклад 3. Розробити програму дешифратора двійкового коду, який подається на біти d0¸d2 порту D. Вихід дешифратора – біти порту В. Дозволяючим входом буде біт d6 порту D.

.device at90s1200

.include "1200def.inc"

ser r20; всі біти регістра R20 встановлюються в одиницю

out ddrb,r20;налаштовування порту B на вивід

main:

ldi r21,254;присвоїти регістру R21 число 254

out portb,r21; вивід значення регістра R21 в порт В

loop:

set;встановити в одиницю біт-акумулятор Т статус регістра

clr r21;очистка регістра R21

sbic pind,0;якщо нульовий біт порту D дорівнює 0, то програма пропускає

;наступну команду

bld r21,0; загрузка в нульовий біт регістра R21 значення біт-акумулятора

sbic pind,1;якщо перший біт порту D дорівнює 0, то програма пропускає;наступну команду

bld r21,1; загрузка в перший біт регістра R21 значення біт-акумулятора

sbic pind,2;якщо другий біт порту D дорівнює 0, то програма пропускає;наступну команду

bld r21,2; загрузка в другий біт регістра R22 значення біт-акумулятора

sbis pind,6;якщо шостий біт порту D дорівнює 1, то програма пропускає;наступну команду

rjmp m2;перехід на мітку m2

out portb,r20; вивід значення регістра R20 в порт В

rjmp loop;перехід на мітку loop

m2:

cpi r21,0;порівняння регістра R21 з 0

breq main;якщо R21=0, то програма переходить на мітку main

cpi r21,1; порівняння регістра R21 з 1

breq n1; якщо R21=1, то програма переходить на мітку n1

cpi r21,2; порівняння регістра R21 з 2

breq n2; якщо R21=1, то програма переходить на мітку n2

cpi r21,3; порівняння регістра R21 з 3

breq n3; якщо R21=1, то програма переходить на мітку n3

cpi r21,4; порівняння регістра R21 з 4

breq n4; якщо R21=1, то програма переходить на мітку n4

cpi r21,5; порівняння регістра R21 з 5

breq n5; якщо R21=1, то програма переходить на мітку n5

cpi r21,6; порівняння регістра R21 з 6

breq n6; якщо R21=1, то програма переходить на мітку n6

cpi r21,7; порівняння регістра R21зс 7

breq n7; якщо R21=1, то програма переходить на мітку n7

rjmp main; перехід на мітку main (начало програми)

n1:

ldi r22,253; присвоїти регістру R22 число 253

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

n2:

ldi r22,251; присвоїти регістру R22 число 251

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

n3:

ldi r22,247; присвоїти регістру R22 число 247

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

n4:

ldi r22,239; присвоїти регістру R22 число 239

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

n5: ldi r22,223; присвоїти регістру R22 число 223

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

n6: ldi r22,191; присвоїти регістру R22 число 191

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

n7: ldi r22,127; присвоїти регістру R22 число 127

out portb,r22; вивід значення регістра R22 в порт В

rjmp loop; перехід на мітку loop

 

 

Для мікроконтролерів AVR

 

Поряд з бурхливим розвитком і удосконалюванням мікроконтролерів AVR розвиваються апаратні і програмні засоби підтримки розробок, яким Atmel приділяє чималу увагу. Дана публікація являє собою огляд існуючих на сьогоднішній день програмних і апаратних засобів підтримки розробок для мікроконтролерів AVR і їхніх особливостей.

 

Основи програмування і налагодження контролерів AVR

 

2.1. Програми AVR Assembler v.1.0

 



Поделиться:


Последнее изменение этой страницы: 2016-08-26; просмотров: 216; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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