Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Мікропроцесорні пристрої та системи

.pdf
Скачиваний:
41
Добавлен:
14.01.2021
Размер:
6.73 Mб
Скачать

 

LDI R22, $01

;Запис слова керування (D2 - введення, D0 – виведення) до R22

 

LDI R18, $N

;3апис кількості чисел до R18

 

LDI R21, $00

;3апис слова керування до R21 для настройки порта В на введення

 

OUT $17, R21

;Настроїти порт В на введення даних

 

OUT $11, R22

; Настроїти порт D

L1:

IN R17, $10

;Зчитування сигналу готовності

 

ANDI R17, $04

;Маскування сигналу готовності

 

TST R17

;Перевірка наявності сигналу готовності

 

BRNE L1

;Якщо сигналу готовності немає, то перейти до L1

 

IN R2, $16

;3читати дані з АЦП

L2:

CLR R3

;R3=0 для формування сигналу скид

 

OUT $12, R3

;Відправити сигнал скиду на АЦП

 

IN R17, $10

;Зчитування сигналу готовності

 

ANDI R17, $04

;Зчитування сигналу готовності

 

TST R17

;Перевірка наявності сигналу готовності

 

BREQ L2

;Якщо сигнал готовності є, то перейти до L2

 

RCALL OBR

;Якщо сигналу готовності немає, то викликається п/п OBR

 

DEC R18

;3меньшити кількість чисел N на 1

 

TST R18

;Перевірка на 0

 

BRNE L1

;Якщо N≠0, то перейти на L1 для зчитування нових даних з АЦП

 

NOP

;Кінець програми

Для організації лічильника числа вимірів N використовується регістр R18. Сигнал про готовність АЦП (нульовий логічний рівень) водиться командою IN R17, $10 і надходить по розряду D2 до R17. За допомогою команди ANDI R17, $04 виконується логічне множення вмісту розрядів R17 на двійковий код 0000 0100 (маскування розряду D2).

Якщо сигнал готовності АЦП відсутній (D2 = 0), то по команді умовного переходу BRNE L1 виконання програми повторюється з мітки L1. Організовується цикл очікування готовності АЦП. При надходженні сигналу готовності по команді IN R2, $16 здійснюється введення даних від АЦП в R2. За допомогою команди виводу OUT $12, R3 через порт D передається сигнал D0 = 0, що здійснює "скидання" готовності і повторний пуск АЦП. Вивід сигналу скидання готовності циклічно повторюється доти, поки від АЦП не надійде сигнал "не готовий" (D2 =1).

Аналого-цифровий перетворювач переходить до нового циклу виміру, а програма звертається за допомогою оператора RCALL OBR до підпрограми обробки результатів виміру. По завершенні підпрограми відбувається повернення до основної програми і декрементується зміст регістра R18. Якщо число оброблених вимірів не дорівнює N, то відбувається повернення до мітки L1 і ввід чергового результату від АЦП. Виконання програми завершується командою NOP, якщо число оброблених даних дорівнює N.

Розглянемо на прикладі програмно-кероване введення/виведення

даних, коли один і той же порт використовується як для введення, так і для виведення. Необхідно вивести 20 даних з ОЗП з адресою $60 на ЦАП (спочатку формується сигнал скиду – 0, перевіряється наявність сигналу готовності – 1, виводяться дані), прочитати дані з АЦП (перевірити сигнал готовності – 1, зчитати дані з АЦП, сформувати сигнал скиду – 0), записати зчитані дані в ОЗП за адресою, починаючи з $60.

 

 

Ubx

B

 

АЦП

 

 

 

8

Ubux

 

 

ЦAП

2

Готовність

Скид

D 0

 

Готовність

 

4

 

 

 

7

 

Скид

Рисунок 3 – Схема підключення АЦП, ЦАП до МК AT90S2313

 

LDI R20, 20d

;Запис до R20 кількості чисел

 

CLR R31

;Ініціалізація регістрової пари Z і запис до R31 числа $00

 

LDI R30, $60

;Ініціалізація Z і запис до R30 числа $60 (адресу першого числа)

M1: LPM

;Зчитування першого числа до R0

 

SER R9

;Установка в R9 всіх біт для настройки порта В на виведення даних

 

OUT $17, R9

;Порт В настроєний

 

LDI R25, $81

;Установка керуючого слова для порта D (D7 = 1, D4 = 0, D2 = 1,

 

 

; D0 = 0)

 

LDI R16, $01

;Установка слова керування для пуска ЦАП (D0 = 0, щоб не

 

 

;запустити АЦП)

 

OUT $11, R25

;Порт D настроєний на роботу (D7 – out, D4 – in, D2 – out, D0 – in)

 

OUT $12, R16

;Пуск ЦАП

L1:

SBIS $10, 4

;Перевірка наявності сигналу готовності ЦАП

 

RJMP L1

;Очікування сигналу готовності ЦАП

 

OUT $18, R0

;Відправка даних на ЦАП з R0

 

CLR R9

;Скидання усіх біт в R9 для настройки порта В на ввід

 

OUT $17, R9

;Порт В настроєний на введення данних

L2:

SBIS $10, 2

;Перевірка сигналу готовності від АЦП

 

RJMP L2

;Очікування сигналу готовності ЦАП

 

IN R0, $16

;3читування даних з АЦП

 

LDI R16, $80

;Установка слова керування для пуска АЦП(D7 = 0, щоб не

 

 

;запустити ЦАП)

 

OUT $12, R16

;Скид АЦП

 

SPM

;3апис зчитаного числа з АЦП до ОЗП, адреса якої в Z

 

INC R30

3більшення адреси комірки ОЗП на 1

 

DEC R10

;3меньшити кількість чисел N на 1

 

TST R10

;Перевірка на 0

 

BRNE Ml

;Якщо N0, то перейти на L1 для зчитування нових даних з АЦП

 

NOP

;Кінець програми

Задача 1. Зчитати 20 чисел з 12 розрядного АЦП. Результат зберегти в комірках пам’яті починаючи з адреси 80h. Розробити функціональну схему та написати програму на мові Асемблер.

0

8

АЦП

Ubx

 

 

 

B

 

 

 

7

 

 

 

0

4

 

 

D 3

Готовність

 

 

5

 

 

Скид

 

 

6

 

 

 

 

 

Рисунок 4 – Функціональна схема програмно-керованого обміну між мікроконтролером та АЦП

Обмін інформацією виконується по шині даних через порти вводу В, D за наступним алгоритмом:

після завершення кожного виміру АЦП виробляє сигнал готовності даних, що через порт D (біт D.5=0) надходить на МП;

після одержання сигналу готовності МП по шині даних через порт В уводить восьмирозрядний код та по шині даних через порт D чотирьохрозрядний код від АЦП;

після закінчення прийому інформації від АЦП МП формує сигнал скидання, що надходить на біт D6=0 шини даних і через порт виводу D передається на АЦП. Сигнал скидання скасовує сигнал готовності АЦП і дозволяє перехід до наступного циклу виміру;

після видачі сигналу скидання МП здійснює перевірку скасування сигналу готовності АЦП і у випадку відсутності скасування сигналу готовності повторює сигнал скидання доти, поки від АЦП не надійде сигнал «Не готовий», тобто АЦП перейде до чергового виміру;

після одержання підтвердження відсутності готовності АЦП МП викликає підпрограму OBR обробки отриманих даних.

після закінчення підпрограми OBR МП перевіряє, чи достатнє число результатів вимірювань отримане від АЦП. У випадку, якщо число вимірів менше заданого N, то програма переходить до перевірки наявності сигналу готовності АЦП, і процес вимірювань й обробки повторюється. Якщо число вимірювань у точності дорівнює заданому числу N, то виконання програми завершується.

 

CLR R27

;

 

LDI R26, $80

; налаштування регістрової пари Х

 

LDI R22, RamEnd

;

 

OUT SPL, R22

; налаштування стеку

 

LDI R22, $40

;запис слова керування (D5-D0 – введення, D6 – виведення)

 

LDI R18, 20

;запис кількості чисел до R18

 

LDI R21, $00

;запис слова керування до R21 для настройки порта В на

 

 

;введення

 

OUT $17, R21

;настроїти порт В на введення даних

 

OUT $11, R22

;настроїти порт D

L1:

IN R17, $10

;зчитування сигналу готовності

 

ANDI R17, $20

;маскування сигналу готовності

 

TST R17

;перевірка наявності сигналу готовності

 

BRNE L1

;якщо сигналу готовності немає, то перейти до L1

 

IN R2, $16

;зчитати дані з АЦП (молодших 8 біт)

 

IN R20, $10

;зчитати дані з АЦП (старших 4 біт)

 

ANDI R20, $0F

;виділення старших 4 біт

L2:

CBI $12,6

;відправити сигнал скиду на АЦП

 

IN R17, $10

;зчитування сигналу готовності

 

ANDI R17, $20

;зчитування сигналу готовності

 

TST R17

;перевірка наявності сигналу готовності

 

BREQ L2

;якщо сигнал готовності є, то перейти до L2

 

RCALL OBR

;якщо сигналу готовності немає, то викликається п/п OBR

 

SBI $12, 6

;зняти сигнал скиду АЦП

 

DEC R18

;зменшити кількість чисел N на 1

 

TST R18

;перевірка на 0

 

BRNE L1

;якщо N≠0, то перейти на L1 для зчитування нових даних

 

NOP

;Кінець програми

OBR:

ST X+, R2

; підпрограма запису чисел до комірок пам’яті

 

ST X+, R20

 

 

RET

 

Задача 2. Зчитати 30 чисел з 8 розрядного АЦП, всі числа що перевищують 100 переписати в комірки пам’яті SRAM починаючи з $60, всі числа що менше 10 переписати в комірки пам’яті SRAM починаючи з $А0. Додати всі числа, результат зберегти в R8.

B

8

АЦП

Ubx

 

 

 

2

Готовність

 

 

 

 

 

D

 

 

 

0

Скид

 

 

 

 

 

Рисунок 5 – Функціональна схема програмно-керованого обміну між мікроконтролером та АЦП

Обмін інформацією виконується по шині даних через порти вводу В, D за наступним алгоритмом:

після завершення кожного виміру АЦП виробляє сигнал готовності даних, що через порт D (біт D.2=0) надходить на МП;

після одержання сигналу готовності МП по шині даних через порт В уводить восьмирозрядний код від АЦП;

після закінчення прийому інформації від АЦП МП формує сигнал скидання, що надходить на біт D.0=0 шини даних і через порт виводу D передається на АЦП. Сигнал скидання скасовує сигнал готовності АЦП і дозволяє перехід до наступного циклу виміру;

після видачі сигналу скидання МП здійснює перевірку скасування сигналу готовності АЦП і у випадку відсутності скасування сигналу готовності повторює сигнал скидання доти, поки від АЦП не надійде сигнал «Не готовий», тобто АЦП перейде до чергового виміру;

після одержання підтвердження відсутності готовності АЦП МП викликає підпрограму OBR обробки отриманих даних.

після закінчення підпрограми OBR МП перевіряє, чи достатнє число результатів вимірювань отримане від АЦП. У випадку, якщо число вимірів менше заданого N, то програма переходить до перевірки наявності сигналу готовності АЦП, і процес вимірювань й обробки повторюється. Якщо число вимірювань у точності дорівнює заданому числу N, то виконання програми завершується.

 

CLR R27

;

 

LDI R26, $60

; налаштування регістрової пари Х

 

CLR R29

;

 

LDI R28, $A0

; налаштування регістрової пари Y

 

CLR R8

; очищення регістру, де зберігається результат

 

LDI R22, RamEnd

;

 

OUT SPL, R22

; налаштування стеку

 

LDI R22, $01

;запис слова керування (D2 - введення, D0 –

 

 

;виведення) до R22

 

LDI R18, 30

;запис кількості чисел до R18

 

LDI R21, $00

;запис слова керування до R21 для настройки

 

 

;порта В на введення

 

OUT $17, R21

;настроїти порт В на введення даних

 

OUT $11, R22

;настроїти порт D

L1:

IN R17, $10

;зчитування сигналу готовності

 

ANDI R17, $04

;маскування сигналу готовності

 

TST R17

;перевірка наявності сигналу готовності

 

BRNE L1

;якщо сигналу готовності немає, то перейти до L1

 

IN R2, $16

;зчитати дані з АЦП

L2:

CLR R3

;R3=0 для формування сигналу скид

 

OUT $12, R3

;відправити сигнал скиду на АЦП

 

IN R17, $10

;зчитування сигналу готовності

 

ANDI R17, $04

;зчитування сигналу готовності

 

TST R17

;перевірка наявності сигналу готовності

 

BREQ L2

;якщо сигнал готовності є, то перейти до L2

 

RCALL OBR

;якщо сигналу готовності немає, то викликається

 

 

;підпрограма OBR

 

DEC R18

;зменшити кількість чисел N на 1

 

TST R18

;перевірка на 0

 

BRNE L1

;якщо N≠0, то перейти на L1 для зчитування нових

 

 

;даних з АЦП

 

NOP

;кінець програми

OBR:

MOV R20, R2

 

 

CPI R20, 101

 

 

BRSH K1

 

 

CPI R20, 10

 

 

BRLO K2

 

 

ADC R8, R2

 

K3:

RET

 

K1:

ST X+, R2

 

 

RJMP K3

 

K2:

ST Y+, R2

 

 

RJMP K3

 

Обмін даними за перериванням

Блок переривань приймає запити переривання й організує перехід до виконання визначеної програми, що перериває. Запити переривання надходять із зовнішніх джерел і з джерел, розташованих у різних пристроях мікроконтролера.

Запит переривання з зовнішнього джерела може бути представлений низьким рівнем сигналу (L), переходом від високого рівня до низького (HL), переходом від низького рівня до високого (LH) або переходом будь-якого напрямку (LH/HL). Вибір способу представлення визначається комбінацією станів розрядів ІSCx0 і ІSCxl у регістрі MCUCR ($D5) (таблиця 1).

Кожний запит переривання надходить у блок переривань, якщо переривання в мікроконтролері дозволені (І = SREG.7 = 1) і дозволене переривання по даному запиту. Переривання по окремому запиту дозволено, якщо в одиничному стані знаходиться розряд, що маскує, (MASK) для даного запиту переривання, розташований в одному з регістрів I/O.

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

При надходженні запиту блок переривань організує апаратний безумовний перехід до виконання команди, адреса якої (вектор переривання) зв'язана з ім'ям запиту переривання. За цією адресою в мікроконтролері записується команда безумовного переходу з мнемокодом RJMP. За цією командою виконується програмний безумовний перехід до першої команди відповідної програми, що перериває, що може бути розташована в будьякому місці FlashROM.

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

При переході до виконання програми, що перериває, розряд І в регістрі SREG апаратно скидається в нульовий стан і переривання по всіх запитах виявляються забороненими. Розряд І встановлюється в одиничний стан при виконанні команди повернення з програми, що перериває, із мнемокодом RETІ. Розряд І може бути встановлений в одиничний стан програмно або командою SEІ в програмі, що перериває. Програма, що виконується при запуску мікроконтролера і за запитом RESET, не містить команди RETІ, для виконання переривань повинна містити команду SEІ.

Мікроконтролер Attiny2313 використовує 19 джерел переривання (10 переривань AT90S2313). Ці переривання і вектор скидання розташовують окремими програмними векторами в просторі пам'яті програм. Кожному перериванню привласнений свій біт дозволу який повинний бути встановлений разом з бітом І регістра статусу.

Молодші адреси простору пам'яті програм автоматично визначаються як вектор скидання і переривань.

Переривання з молодшими адресами мають більший рівень пріоритету.

Програмні установки адрес векторів скидання і переривань, що найчастіше використовуються

Адреса в

Джерело

 

пам’яті

Опис

переривання

програм

 

 

Зовнішнє скидання, скидання при увімкненні

 

 

0х0000

rjmp RESET;

живлення, при спрацюванні сторожового таймеру, при

 

 

зниженні напруги живлення

0х0001

rjmp INT0;

Зовнішній запит на переривання по входу INT0

0х0002

rjmp INT1;

Зовнішній запит на переривання по входу INT1

0х0003

rjmp T/C1_CAPT;

Захоплення по таймеру/лічильнику T/C1

0х0004

rjmp T/C1_COMPA;

Співпадання з регістром порівняння А таймера T/C1

0х0005

rjmp T/C1_OVF;

Переповнення таймера/лічильника T/C1

0х0006

rjmp T/C0_OVF;

Переповнення таймера/лічильника T/C0

0х0007

rjmp UART_RX;

Прийом байту UART завершено

0х0008

rjmp UART_UDRE;

Регістр даних UART порожній

0х0009

rjmp UART_TX;

Передача даних UART завершена

0х000А

rjmp ANA_COMP;

Переривання від аналогового компаратора

0х000В

rjmp PCINT;

Зміна стану виводів PCINT0 - PCINT7

0х000С

rjmp T/C1_COMPB;

Співпадання з регістром порівняння B таймера T/C1

0х000D

rjmp T/C0_COMPA;

Співпадання з регістром порівняння A таймера T/C0

0x000E

rjmp T/C0_COMPB;

Співпадання з регістром порівняння B таймера T/C0

0x000F

0x0010

0x0011

0x0012

0x0013

0x0014

0x0015

rjmp USI_START; rjmp USI_ OVF; rjmp EE_READY; rjmp WDT_OVF;

MAIN: ldi r16, low

(RAMEND); out SPL, r16

<instr> xxx

Переповнення по USI. Готовність до старту Переповнення по USI. переповнення Готовність EEPROM

Переривання при переповненні сторожового таймера

Початок основної програми (Main program start)

Зовнішні переривання викликаються виводами INTO і INT1 або будь-

яким з виводів PCINT7.0. Якщо переривання дозволене, то воно буде викликано навіть, якщо відповідний вивід налагоджений як вихід. Це забезпечує можливість викликати переривання програмним способом. Регістр управління "PCMSK" визначає, який з виводів PCINT7 –0 може викликати переривання. Виводи PCINT7–0 працюють незалежно від тактового генератора МК, тобто їх робота з ним не синхронізується, а це означає переривання на цих виводах може бути використано для пробудження з різних режимів сну, окрім холостоro -"Idle".

Переривання на виводах INT0 і INT1 можуть бути викликані спадаючим фронтом сигналу, наростаючим фронтом або зміною рівня сигналу на ніжці. Ці налаштування задаються в MCUCR бітами ISC11, ICS10 INT1, ISC01, ICS00 INT0.

Таблиця 1 – Режими виклику переривання INT1/ INT0

ISC11(ISC01)

ISC10(ISC00)

Опис

 

 

 

0

0

Низький рівень на вході INT1/INT0 генерує запит на

 

 

переривання

0

1

Будь-яка зміна логічного рівня на вході INT1/INT0 генерує

 

 

запит на переривання

1

0

Задній фронт вхідного сигналу INT1/INT0 викликає запит

 

 

на переривання

1

1

Передній фронт вхідного сигналу INT1/INT0 викликає

 

 

запит на переривання

Таблиця 2 – Регістр масок зовнішніх переривань – GIMSK

Біти

7

6

5

4

3

2

1

0

 

$3B ($5B)

INT1

INT0

PCIE

 

 

 

 

 

GIMSK

Читання/Запис

R/W

R/W

R/W

R

R

R

R

R

 

Початковий стан

0

0

0

0

0

0

0

0

 

Bit 7 – INT1: Дозвіл запиту зовнішніх переривань 1. При встановленому біту ІNT1 і встановленому біту І регістра статусу (SREG) дозволяються переривання по відповідним виводам входів сигналів переривань. Біт керування впізнанням переривання регістра керування

зовнішніми перериваннями EІCR (External Іnterrupt Control Regіster) визначає спрацьовування по наростаючому чи спадаючому фронту, по логічному рівні. Активація кожного з цих виводів викликає запит переривання навіть якщо вивід буде дозволений як вихід. Це забезпечує можливість організації програмного переривання.

Bit 6 - INT0: Дозвіл запиту зовнішніх переривань 0. При встановленому біту ІNT0 і встановленому біту І регістра статусу (SREG) дозволяються переривання по відповідним входах переривань. Зовнішні переривання завжди викликають переривання низьким рівнем. Активація кожного з цих виводів викликає запит переривання навіть якщо вивід буде дозволений як вихід. Це забезпечує можливість організації програмного переривання. Запит переривання по логічному рівні, якщо він дозволений, буде генерувати запит переривання доти, поки на вході буде знаходитися низький рівень.

Bit 5 – PCIE: Дозвіл запиту зовнішніх переривань за зміною стану виводів. Якщо біт PCIE встановлений в 1, й при цьому встановлений біт I регістра SREG, переривання за зміною будь-якого контакту дозволено. Які контакти будуть викликати переривання, визначається індивідуально, установкою одного з біт PCINT7–0 регістра PCMSK.

Таблиця 3 – Регістр маски переривання виводів PCINT7…0 «PCMSK»

Біти

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

PCMSK

Читання/Запис

PCINT7

PCINT6

PCINT5

PCINT4

PCINT3

PCINT2

PCINT1

PCINT0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Початковий стан

0

0

0

0

0

0

0

0

 

 

 

 

 

 

 

 

 

 

 

Bits 7…0 – PCINT7…0: Маскувальні біти виводів PCINT7...0. Кожен біт з PCINT7…0 відповідає за свій вивід. Установка якого-небудь біта з PCINT7...0 дозволяє відповідному I/O виводу працювати джерелом переривання, за умови, що встановлений біт PCIE в GIMSK. Якщо будь-який біт з PCINT7…0 очищений (нуль), то відповідний I/O - вивід не працюватиме джерелом переривання.

ATtiny2313 містить три регістри введення/виведення загального призначення. Ці регістри можуть бути використані для запам'ятовування будь-якої інформації і особливо вони корисні для запам'ятовування глобальних змінних і прапорів стану. Регістри введення/виведення загального призначення GPIOR2 – GPIOR0 доступні через інструкції SBI, CBI, SBIS, і SBIC.