Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
6.67 Mб
Скачать

Завдання:

1. Об’явити дві двобайтні знакові константи:

2. У сегменті пам’яті даних об’явити змінну у яку буде записуватися результат множення

3. Розмістити вхідні величини у регістри мікроконтролера

4. Здійснити побайтне множення (з врахуванням того, які інструкції треба використати MUL, MULS, MULSU) і результати цих множень перемістити у резервні регістри для подальшого опрацювання.

5. Визначити значення третього байту множення

6. Записати перший (молодший) байт результату множення двох двобайтних знакових чисел у ОЗУ мікроконтролера (визначену попередньо змінну в п.2)

7.Сформувати другий байт результату множення двох двобайтних знакових чисел

7.1 Додати відповідні регістри

7.2 При додаванні здійснювати акумулювання всіх переносів у старші розряди

7.3 Записати другий байт множення двобайтним знакових чисел у ОЗУ двох двобайтних знакових чисел у ОЗУ мікроконтролера (визначену попередньо змінну в п.2)

8.Сформувати третій байт результату множення двох двобайтних знакових чисел

8.1 Додати відповідні регістри і переносів при формуванні другого байту результату

8.2 При додаванні здійснювати акумулювання всіх переносів у старші розряди

8.3 Записати третій байт множення двобайтним знакових чисел у ОЗУ двох двобайтних знакових чисел у ОЗУ мікроконтролера (визначену попередньо змінну в п.2)

9.Сформувати четвертий байт результату множення двох двобайтних знакових чисел

9.1 Додати відповідні регістри і переносів при формуванні третього байту результату

9.2 Записати четвертий байт множення двобайтним знакових чисел у ОЗУ двох двобайтних знакових чисел у ОЗУ мікроконтролера (визначену попередньо змінну в п.2)

9. Перевірити виконання програми на двох двобайтних додатних числах, двох від’ємних двобайтних числах, додатного двобайтного числа і від’ємного двобайтного числа.

Лабораторна робота №8 «Вивчення програмування паралельного порту вводу-виводу мікроконтролера AVR»

Ціль роботи

  • вивчити принципів роботи з паралельною шиною AVR мікроконтролера

  • закріпити знання попередніх лабораторних роботах

Програма виконання роботи

- Проініціалізувати потрібні порти мікроконтролера

- Прийняти вхідну інформацію з портів настроєних на прийом даних (Порт A і Порт B)

- Перемножити між собою вхідну інформацію

- Результат множення виставити на порти, які настроєні на вивід (Порт C і Порт D)

Додатковий теоретичний матеріал необхідний для виконання лабораторної роботи

Мікроконтролер ATMEGA128 має 53 програмовані лінії вводу/виводу. всі вони об’єднані у порти (кожен порт контролює 8 ліній вводу/виводу)

Опис портів

Порт A

Порт A - 8-розр. порт двонаправленого вводу-виводу з внутрішніми підтягуючими до плюсу резисторами (вибираються окремо для кожного розряду). Вихідні буфери порту A мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту А будуть діяти як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту A знаходяться в третьому (високоімпедансное) стані при виконанні умови скидання, навіть якщо синхронізація не запущена. Порт А також виконує деякі спеціальні функції ATmega128.

Порт B

Порт B - 8-розр. порт двонаправленого вводу-виводу з внутрішніми підтягуючими до плюсу резисторами (вибираються окремо для кожного розряду). Вихідні буфери порту B мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту B будуть діяти як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту B знаходяться в третьому (високоімпедансное) стані при виконанні умови скидання, навіть якщо синхронізація не запущена. Порт B також виконує деякі спеціальні функції ATmega128.

Порт C

Порт C - 8-розр. порт двонаправленого вводу-виводу з внутрішніми підтягуючими до плюсу резисторами (вибираються окремо для кожного розряду). Вихідні буфери порту C мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту C будуть діяти як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту C знаходяться в третьому (високоімпедансное) стані при виконанні умови скидання, навіть якщо синхронізація не запущена. Порт C також виконує деякі спеціальні функції ATmega128.

Порт D

Порт D - 8-розр. порт двонаправленого вводу-виводу з внутрішніми підтягуючими до плюсу резисторами (вибираються окремо для кожного розряду). Вихідні буфери порту D мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту D будуть діяти як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту D знаходяться в третьому (високоімпедансное) стані при виконанні умови скидання, навіть якщо синхронізація не запущена. Порт D також виконує деякі спеціальні функції ATmega128

Порт E

Порт E - 8-розр. порт двонаправленого вводу-виводу з внутрішніми підтягуючими до плюсу резисторами (вибираються окремо для кожного розряду). Вихідні буфери порту E мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту E будуть діяти як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту E знаходяться в третьому (високоімпедансное) стані при виконанні умови скидання, навіть якщо синхронізація не запущена. Порт E також виконує деякі спеціальні функції ATmega128

Порт F

Порт F діє як аналоговий ввід аналогово-цифрового перетворювача. Порт F також може використовуватися як 8-розр. порт двонаправленого вводу-виводу, якщо АЦП не використовується. До кожної лінії порту може бути підключений вбудований підтягаючий до плюсу резистор (вибирається окремо для кожного біта). Вихідні буфери порту F мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту F діятимуть як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту F знаходяться в третьому (високоімпедансному) стані при виконанні умови скидання, навіть якщо синхронізація не запущена. Якщо активізований інтерфейс JTAG, то підтягуючі резистори на лініях PF7 (TDI), PF5 (TMS) і PF4 (TCK) будуть підключені, навіть якщо виконується Скидання.

Висновок TDO знаходиться в третьому стані, якщо не введено стан TAP, при якому зсуваються виводяться дані.

Порт F також виконує функції інтерфейсу JTAG.

Порт G

Порт G - 5-розр. порт двонаправленого вводу-виводу з внутрішніми підтягуютчими до плюсу резисторами (вибираються окремо для кожного розряду). Вихідні буфери порту G мають симетричну вихідну характеристику з однаковими вхідними і вихідними струмами. При вводі, лінії порту G будуть діяти як джерело струму, якщо зовні діє низький рівень і включені підтягуючі резистори. Виходи порту G знаходяться в третьому (високоімпедансному) стані при виконанні умови скидання, навіть якщо синхронізація не запущена.

Порт G також виконує деякі спеціальні функції ATmega128.

Всі порти вводу-виводу (ПВВ) AVR-мікроконтролерів працюють за принципом читання-модифікація-запис при використанні їх як портів універсального вводу-виводу. Це означає, що зміна напрямку вводу-виводу одної лінії порту командами SBI і CBI буде відбувається без помилкових змін напрями вводу-виводу інших ліній порту. Це поширюється також і на зміну логічного рівня (якщо лінія порту налаштована на вивід) або на включення/відключення підтягуючих резисторів (якщо лінія налаштована на ввід). Кожен вихідний буфер має симетричну характеристику управління з високим вхідними і вихідними струмами. Вихідний драйвер володіє навантажувальною здатністю, яка дозволяє безпосередньо керувати світлодіодними індикаторами. До всіх лініях портів може бути підключений індивідуальний вибірковий підтягаючий до плюсу живлення резистор, опір якого не залежить від напруги живлення. На всіх лініях ПВВ встановлені захисні діоди, які підключені до VCC і Загальному (GND), як показано на малюнку.

Посилання на регістри і біти регістрів в даному описі дані в загальній формі. При цьому, символ "x" замінює найменування ПВВ, а символ "n" замінює номер розряду ПВВ. Однак при написанні програми необхідно використовувати точну форму запису. Наприклад, PORTB3, що означає розряд 3 порту B, в даному документі записується як PORTxn.

Для кожного порту вводу-виводу в пам'яті вводу-виводу зарезервовано три комірки: одна під регістр даних - PORTx, інша під регістр напрямку даних - DDRx і третя під стан входів порту - PINx. Комірка, що зберігає стан на входах портів, доступна тільки для читання, а регістри даних і напрямку даних мають двонаправлений доступ. Крім того, установка біта виключення підтягуючих резисторів PUD регістра SFIOR відключає функцію підтягування на всіх виходах всіх портів.

Нижче наведено опис порту вводу-виводу для універсального цифрового вводу-виводу. Більшість виходів портів підтримують альтернативні функції вбудованих периферійних пристроїв мікроконтролера. Опис альтернативних функцій наведено далі в описі до мікроконтролера..

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

Порт у якості універсального цифрового вводу-виводу

Всі порти є двонаправленими портами вводу-виводу з опціональним підтягуючим резистором. Рисунок ілюструє функціональну схему однієї лінії порту вводу-виводу, позначений як Pxn.

Сигнали WPx, WDx, RRx, RPx і RDx є загальними в межах одного порту. Сигнали clkI/O, SLEEP, і PUD є загальними для всіх портів.

Настройки виходів

Режим і стан для кожного виводу визначається значенням відповідних розрядів трьох регістрів: DDxn, PORTxn і PINxn.

Біти DDxn регістра DDRx визначають спрямованість лінії вводу-виводу. Якщо DDxn = 1, то Pxn конфігурується на вивід. Якщо DDxn = 0, то Pxn конфігурується на ввід.

Якщо PORTxn = 1 при конфігурації лінії порту на ввід, то дозволяється підключення підтягуючого резистора. Для виключення даного резистора необхідно записати в PORTxn лог. 0 або налаштувати лінію порту на вивід. Під час скидання всі лінії портів знаходяться в третьому (високоімпедансному) стані, навіть якщо не працює синхронізація.

Якщо PORTxn = 1 при конфігурації лінії порту на вивід, то стан виходу у логічній одиниці. Якщо PORTxn = 0 при конфігурації лінії порту на вивід, то стан виходу у логічному нулі.

Оскільки одночасний запис у регістри DDRx і PORTx неможливий, то при перемиканні між третім станом ({DDxn, PORTxn} = 0b00) і виведенням лог. 1 ({DDxn, PORTxn} = 0b11) повинно виникнути проміжний стан або з підключеним підтягуючого резистора ({DDxn, PORTxn} = 0b01) або з виводом лог. 0 ({DDxn, PORTxn} = 0b10). Як правило, перехід через стан з підключенням підтягуючого резистора еквівалентно стану виходу лог.1, якщо вихід мікроконтролера зв’язаний з високоімпедансним входом. В іншому випадку, необхідно встановити біт PUD регістра SFIOR для виключення всіх підтягаючих резисторів на всіх портах.

Перемикання між вводом з підтягуючим резистором і виводом низького рівня пов'язане з аналогічною проблемою. Тому, користувач змушений використовувати або третій стан ({DDxn, PORTxn} = 0b00) або вивід лог. 1 ({DDxn, PORTxn} = 0b11) в якості проміжного етапу.

У таблиці підсумовується дію керуючих сигналів на стан виводу.

DDxn

PORTxn

PUD (в SFIOR)

Ввід-вивід

Підтягуючий резистор

Коментар

0

0

X

Ввід

Ні

Третій стан (Z-стан)

0

1

0

Ввід

Так

Pxn буде джерелом струму при подачі зовнішнього низького рівня

0

1

1

Ввід

Ні

Третій стан (Z-стан)

1

0

X

Вивів

Ні

Вивід лог. 0

1

1

X

Вивів

Ні

Вивід лог. 1

Зчитування стану входу

Незалежно від значення біту напряму даних DDxn стан виходу порту може бути опитано через регістровий біт PINxn. Як показано на попередньому рисунку регістровий біт PINxn і попередня йому тригерна «защолка» створюють синхронізатор. Даний підхід дозволяє уникнути метастабільності, якщо зміна стану на виводі сталося коло фронту внутрішньої синхронізації. Однак такий підхід пов'язаний з виникненням затримки. На рисунку представлена тимчасова діаграма синхронізації під час опитування зовні прикладеного до виходу сигналу. Тривалість мінімальної і максимальної затримок на поширення сигналу позначені як tpd, max і tpd, min, відповідно.

У наступних прикладах показано як встановити на лініях 0 і 1 порту В рівень лог. 1, а на лініях 2 і 3 - лог. 0, а також як налаштувати лінії 4 ... 7 на введення з підключенням підтягаючих резисторів на лініях 6 і 7. Результуючий стан ліній зчитуються назад, але, з урахуванням сказаного вище, включена інструкція nop для забезпечення можливості зворотного зчитування щойно назначеного стану деяких виводів.

Приклад коду на Асемблері

...

; Дозволяємо підтягування і встановлюємо високі вихідні рівні

; Визначаємо напрями даних ліній портів

ldi r16, (1 << PB7) | (1 << PB6) | (1 << PB1) | (1 << PB0)

ldi r17, (1 << DDB3) | (1 << DDB2) | (1 << DDB1) | (1 << DDB0)

out PORTB, r16

out DDRB, r17

; Вставляємо інструкцію nop для синхронізації

nop

; Опитування стану виходів порту

in r16, PINB

...

Прим. 1: В програмі на Асемблері використовуються два тимчасових регістра для мінімізації інтервалу часу від настройки підтягаючих резисторів на розрядах 0, 1, 6 і 7 до коректної установки біту напрямку, які дозволяють вивід лог. 0 на лініях 2 і 3 і замінюють високий рівень на розрядах 0 і 1, утворений за рахунок підключення підтягаючих резисторів, на високий рівень потужнострумового драйвера.

Регістри вводу/виводу (які треба знати при виконанні цієї лабораторної роботи)

Адреса

Номер регістру вводу/виводу47

Назва

Біт 7

Біт 6

Біт 5

Біт 4

Біт 3

Біт 2

Біт 1

Біт 0

Буде описано пізніше або можна ознайомитися з опису до мікроконтролера ATMEGA128

$65

PORTG

-

-

-

PORTG4

PORTG3

PORTG2

PORTG1

PORTG0

$64

DDRG

-

-

-

DDG4

DDG3

DDG2

DDG1

DDG0

$63

PING

-

-

-

PING4

PING3

PING2

PING1

PING0

$62

PORTF

PORTF7

PORTF6

PORTF5

PORTF4

PORTF3

PORTF2

PORTF1

PORTF0

$61

DDRF

DDF7

DDF6

DDF5

DDF4

DDF3

DDF2

DDF1

DDF0

$60

Резерв

-

-

-

-

-

-

-

-

$5F

$3F

SREG

I

T

H

S

V

N

Z

C

$5E

$3E

SPH

SP15

SP14

SP13

SP12

SP11

SP10

SP9

SP8

$5D

$3D

SPL

SP7

SP6

SP5

SP4

SP3

SP2

SP1

SP0

Буде описано пізніше або можна ознайомитися з опису до мікроконтролера ATMEGA128

$3B

$1B

PORTA

PORTA7

PORTA6

PORTA5

PORTA4

PORTA3

PORTA2

PORTA1

PORTA0

$3A

$1A

DDRA

DDA7

DDA6

DDA5

DDA4

DDA3

DDA2

DDA1

DDA0

$39

$19

PINA

PINA7

PINA6

PINA5

PINA4

PINA3

PINA2

PINA1

PINA0

$38

$18

PORTB

PORTB7

PORTB6

PORTB5

PORTB4

PORTB3

PORTB2

PORTB1

PORTB0

$37

$17

DDRB

DDB7

DDB6

DDB5

DDB4

DDB3

DDB2

DDB1

DDB0

$36

$16

PINB

PINB7

PINB6

PINB5

PINB4

PINB3

PINB2

PINB1

PINB0

$35

$15

PORTC

PORTC7

PORTC6

PORTC5

PORTC4

PORTC3

PORTC2

PORTC1

PORTC0

$34

$14

DDRC

DDC7

DDC6

DDC5

DDC4

DDC3

DDC2

DDC1

DDC0

$33

$13

PINC

PINC7

PINC6

PINC5

PINC4

PINC3

PINC2

PINC1

PINC0

$32

$12

PORTD

PORTD7

PORTD6

PORTD5

PORTD4

PORTD3

PORTD2

PORTD1

PORTD0

$31

$11

DDRD

DDD7

DDD6

DDD5

DDD4

DDD3

DDD2

DDD1

DDD0

$30

$10

PIND

PIND7

PIND6

PIND5

PIND4

PIND3

PIND2

PIND1

PIND0

Буде описано пізніше або можна ознайомитися з опису до мікроконтролера ATMEGA128

Це корисно!

Для зручності використання AVR Studio при написанні програм для різних мікроконтролерів, у яких регістри вводу/виводу чи розширених регістрів вводу/виводу, а також деяких пере позначень регістрів регістрового файлу (зокрема X, Y і Z), абсолютні адреси яких у різних мікроконтролерах можуть бути різні, але назва і функціональне призначення є однакове – розробниками AVR Studio у папці \Program Files\Atmel\AVRTools\AVRAssembler\Аppnotes\ знаходяться *.inc файли у яких директивами EQU і DEF описані визначені всі регістри і відповідні біти регістрів, а також здійснено деякі визначення.

Для того, щоб включити у проект визначення регістрів мікроконтролера ATMEGA128 треба в проект включити m128def.inc файл.

Опис деяких мнемонік інструкцій, які можуть бути використовані у цій лабораторній роботі і не були описані у описах до попередніх лабораторних робіт

CBI – «Очистка біту в регістрі вводу-виводу»

Інструкція очищує вказаний біт в регістрі вводу-виводу. Ця інструкція виконується тільки на перших 32-ох регістрах області регістрів вводу-виводу – адреси 0÷31

I/O(A,b) ← 0

Синтаксис

Операнди

Лічильник команд

CBI A, b

0 ≤ A ≤ 31, 0 ≤ b ≤ 7

PC  ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

Приклад 1:

cbi $12, 7 ;Очистка біту 7 в регістрів PORTD

Приклад 2:

.INCLUDE "m128def.inc"

cbi PORTD, 7 ;Очистка біту 7 в регістрів PORTD

CBR – «Очистка біту в регістрі»

Інструкція очищує вказаний біт в регістрі Rd. Вона виконує логічне І між вмістимим регістру Rd і інвертованою константою K. Результат буде поміщений у Rd

Синтаксис

Операнди

Лічильник команд

CBR Rd, K

16 ≤ Rd ≤ 31, 0 ≤ b ≤ 255

PC  ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

<>

0

-

<>

-

Для тестування знаку

Очищується

Встановлюється якщо MSB встановлений; очищується інакше.

Встановлюється, якщо результат $00; інакше очищується

Наприклад:

cbr r16, $F0 ;Очистка старшої тетради регістра R16

cbr r18, 1 ;Очистка біта 0 регістра R18

SBI – «Встановлення біту в регістрі вводу-виводу»

Інструкція встановлює вказаний біт в регістрі вводу-виводу. Ця інструкція виконується тільки на перших 32-ох регістрах області регістрів вводу-виводу – адреси 0÷31

I/O(A,b) ← 1

Синтаксис

Операнди

Лічильник команд

SBI A, b

0 ≤ A ≤ 31, 0 ≤ b ≤ 7

PC  ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

Приклад 1:

sbi $12, 7 ;Встановлення біту 7 в регістрів PORTD

Приклад 2:

.INCLUDE "m128def.inc"

cbi PORTD, 7 ;Встановлення біту 7 в регістрів PORTD

SBR – «Встановлення біту в регістрі»

Інструкція встановлює вказаний біт в регістрі Rd. Вона виконує логічне АБО між вмістимим регістру Rd і константою K. Результат буде поміщений у Rd

Синтаксис

Операнди

Лічильник команд

SBR Rd, K

16 ≤ Rd ≤ 31, 0 ≤ K ≤ 255

PC  ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

<>

0

-

<>

-

Для тестування знаку

Очищується

Встановлюється якщо MSB встановлений; очищується інакше.

Встановлюється, якщо результат $00; інакше очищується

Наприклад:

sbr r16, 3 ;Встановлення бітів 0÷3 у регістрі R16

sbr r17, $F0 ;Встановлення старші чотири біти регістра R17