
Мікропроцесорні пристрої та системи
.pdf
|
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 |
;Якщо N≠0, то перейти на 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.