1   2   3   4
Ім'я файлу: РобототехникаЛабораторныеБаза_4_5_6.pdf
Розширення: pdf
Розмір: 3063кб.
Дата: 21.10.2022
скачати

t_press. Ця змінна зберігатиме час тривалості натискання кнопки в тактах п’ятого таймера. Також оголосимо булеву змінну flag, яка дорівнює логічній одиниці, якщо мікроконтролер чекає натискання кнопки і логічному нулю, якщо натискання відбулося і йде процес вимірювання часу. Порахуємо в яких межах можна виміряти час натискання при зроблених налаштуваннях. Так як дільник таймера включений на 1024 це означає, що кожен такт таймера буде проходити з частотою
Рис
.L4_4
Підключення кнопки RC колом.

17 16000000/1024=
15625 Гц. (4.3)
Іншими словами, кожен такт таймера триває
1/15625 =
0,000064 с = 64 мкс. (4.4)
Насправді 64 мікросекунди є мінімальний час, який можна виміряти, а також є точність, з якою ми вимірюємо час. Тобто не можна точно виміряти інтервал часу, тривалість якого не ділиться націло на 64. Наприклад, при вимірі інтервалу тривалістю 200 мкс ми отримаємо 64×3= 192 мкс. Для вимірювання часу натискання кнопки така точність цілком допустима, оскільки звичайне натискання кнопки триває більше 50мс = 50000мкс.
Розрахуємо тепер максимальну тривалість натискання кнопки, яку можна виміряти. Оскільки ми використовуємо 16-бітний таймер, то очевидно, що максимальна тривалість дорівнює часу переповнення таймера
64мкс × 2 16
= 64 × 65536 = 4194304 мкс = 4,194 с, (4.5) тобто становить трохи більше чотирьох секунд.
Для того, щоб виміряти час натискання кнопки, нам потрібно спочатку вловити негативний фронт і одночасно з цим запустити процес рахунку, а потім зафіксувати позитивний фронт і зупинити рахунок. У програмі
progL4_3
наведено повний лістинг коду.
progL4_3
1 2
3 4
5 6
7 8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#define
F_CPU 16000000UL
// вкажемо компілятору частоту
#include
<
avr
/
io h
>
// Бібліотека вводу/виводу AVR
#include
<
util
/
delay h
>
// Бібліотека затримок
#include
<
avr
/
interrupt h
>
// Бібліотека імен переривань
// кваліфікатор volatile інформує компілятор, що значення
// змінної буде змінюватися з зовні в невизначений час volatile uint16_t t_press
=
0;
//час натискання в тактах таймера volatile bool flag
=
1;
//1 чекаємо момент натискання
//0 вимірюємо час натискання int main(
void
) {
Serial
begin
(9600);
DDRL
&=


(1
<<
DDL1);
//пін PL1 як ВХІД (сюди підключається кнопка)
//ICP5=PL1=D48 захоплення по фронту на піні
PORTL
|=
(1
<<
PORTL1);
//
//WGM52=WGM51=WGM50=0 normal режим
//COM5A0=COM5A1=0 піни OC1A відключено
TIMSK5
|=
(1
<<
ICIE5);
//дозволяємо запуск переривання по захопленню

18 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
//ICNC5=0 придушник перешкод відключено
//ICES5=0 захоплення по негативному фронту
TCCR5B
|=
(1
<<
CS52)
|
(1
<<
CS50);
//дільник 1024 и запуск таймеру
//16000000/1024=15625Гц або 1/15625=64 мікросекунди sei();
//дозволяємо глобальні переривання while
(1) {
Serial
println
(t_press);
_delay_ms(1000);
}
}
//ISR — Interrupt Service Routine (обробник переривання)
ISR(TIMER5_CAPT_vect){ if
(flag){
TCNT5
=
0; flag
=
0;
TCCR5B
|=
(1
<<
ICES5);
// захоплення по позитивному фронту
} else
{ t_press
=
ICR5; flag
=
1;
TCCR5B
&=

(1
<<
ICES5);
// захоплення по негативному фронту
}
}
Розглянемо обробник переривання рядки 38 – 49 програми
progL4_3
. Ім'я вектору переривання TIMER5_CAPT_vect визначаємо з таблиці L4_2 для мікроконтролера ATmega2560. Спочатку роботи біт ICES5 скинуто (знаходиться у стані «0» за умовчанням), що призводить до запуску переривання негативним фронтом, тобто у момент натискання кнопки. Також у цей момент значення змінної flag дорівнює true
. Значить після проходження оператора if
(рядок 39) виконуються рядки 40 - 42. На 40-му рядку скидається значення рахункового регістра першого таймера, на 41-му рядку змінної flag присвоюється значення false
, на 42-му рядку встановлюється біт ICES5, що призведе до наступного запуску обробника переривання в момент позитивного фронту тобто коли кнопка відпускається. При наступі цієї події знову викликається обробник
TIMER5_CAPT_vect. Але зараз flag дорівнює f alse
і, отже, буде виконано рядки 44 – 48. На 44-му рядку відбувається зчитування значення регістру захоплення у змінну t_press
. Це і є час утримання кнопки в тактах таймера. У рядках 46, 47 відбувається підготовка до наступного виміру.
Проведемо порівняння вимірювання тривалості натискання двома способами використовуючи програму
progL4_3
та логічний аналізатор (його потрібно налаштувати на запуск по негативному фронту), підключений до кнопки.

19
Отримуємо що програма видає значення, представлені на рисунку рис
.L4_6
, а аналізатор на рис
.L4_5
Аналізатор показує, що натискання кнопки тривало 0,708 секунд. Програма виводить значення 11282 помножуючи це число на 0,064 мілісекунди отримуємо 11282 × 0,064 = 722 мілісекунд.
Тобто розбіжність не перевищує 2-х відсотків.
Зауважимо, що програма не є «дурнястійкою», тобто при натисканні на кнопку більш ніж 4,2 секунд отримаємо не коректний результат.
Підкреслимо той факт, що вся основна робота по вимірюванню тривалості натискання кнопки проводиться в обробнику переривань. Основна програма (строки 32 – 35) задіяні тільки для того щоб вивести отриманий результат на комп’ютері в монітор порту. Для цього у даному випадку заради простоти використовуються «ардуінівські» функції
Serial
begin
(9600)
(строка 16) та
Serial
println
()
(строка 33). Ці функції дуже спрощують роботу по протоколу UART і не впливають на розуміння основних ідей пов’язаних з механізмами роботи переривань за таймерами.
Також слід зазначити, що якби ми захотіли виводити результати вимірювань тривалості натискання кнопки у секундах, то нам довелося б використовувати тип float який для мікроконтролерів AVR дуже «тяжкий». Це означає, що перерахунок тактів таймеру в секунди потрібно було б робити в тілі основної програми, а не як не в обробнику переривань.
Рис
.L4_6.
Тривалість натискання в моніторі порту.
Рис
.L4_5
. Тривалість натискання кнопки в логічному аналізаторі.

20
Хід роботи
Завдання №4.1.
Використавши переривання по переповненню відповідного таймеру в нормальному режимі налаштуйте на вказаному піні сигнал тривалістю t
1
високого рівня та t
2
– низького рівня. Поясніть з якою точністю це теоретично можна зробити. Перевірте розрахунки експериментально.
Таблиця L4_3.
Варіант
№ таймеру, дільник
t
1
, t
2
Пін
1
T0, 1 100 мкс, 150 мкс А5 2
Т2, 8 1,5 мс; 2,9 мс А4 3
T0, 64 9,2 мс; 14 мс
А3 4
Т2, 256 32,5 мс; 12,1 мс А2 5
T0, 1024 48 мс; 80,5 мс А1 6
Т2, 1 250 мкс, 200 мкс А0 7
T0, 8 3,1 мс; 2,0 мс А5 8
Т2, 64 12 мс 7,1 мс А4 9
T0, 256 24,5 мс; 53 мс А3 10
Т2, 32 3,2 мс; 2,1 мс А2 11
Т2, 64 4,1 мс; 17,5 мс А1 12
T0, 1 300 мкс; 350 мкс А0 13
Т2, 128 14,2 мс; 8,1 мс А5 14
T0, 64 6,1 мс; 11 мс А4 15
Т2, 256 19,7 мс; 35 мс А3 16
T0, 1024 62,8 мс; 15,9мс А2 17
Т2, 1 400 мкс, 250 мкс А1 18
T0, 8 1,8 мс; 3,5 мс А0 19
Т2, 64 16 мс; 13,2 мс А5 20
T0, 256 28,3 мс; 8,5 мс А4

21
Завдання №4.2.
За допомогою переривання за збігом на першому таймері (або іншому по вказанню викладача) зробити так щоб значення глобальній змінній
інкрементувалося на одиницю через кожні t мікросекунд, також через цей час стан піна повинен інвертуватися. Конкретні значення t, дільника, переривання та номер піна вибрати згідно зі своїм варіантом з таблиці L4_4. Провести розрахунки теоретично та перевірити отримані результати за допомогою логічного аналізатора.
Таблиця L4_4.
Варіант
Дільник
Переривання,
№ режиму
t, мкс
Пін
1 256
COMPB, №12 10000
А0 2
1
COMPA, №4 1500
А1 3
8
COMPB, №12 5000
А2 4
1024
COMPA, №4 40000
А3 5
256
COMPB, №12 12000
А4 6
1
COMPA, №4 625
А5 7
8
COMPB, №12 3000
D2 8
1024
COMPA, №4 80000
D7 9
256
COMPB, №12 8000
D4 10 1
COMPA, №4 2000
D8 11 8
COMPB, №12 2500
D1 12 1024
COMPA, №4 1920
А0 13 256
COMPB, №12 14000
А1 14 1
COMPA, №4 500
А2 15 8
COMPB, №12 1500
А3 16 1024
COMPA, №4 5120
А4 17 256
COMPB, №12 6000
А5 18 1
COMPA, №4 750
D2 19 8
COMPB, №12 1200
D7 20 1024
COMPA, №4 8320
D4

22
Завдання №4.3.
Зробіть наступне.
1. Налаштуйте пін ICP1=D8 для ATmega328 або ICP4=D49 для ATmega2560 на вихід та сформуйте на ньому меандр будь-яким програмним засобом в фоновому режимі відповідної частоти за допомогою 8-бітного таймеру.
2. Переконайтеся за допомогою логічного аналізатору, що на необхідному піні присутній потрібний сигнал.
3. Змініть програму з пункту 1 таким чином, щоб вона додатково вимірювала частоту сигналу на відповідному піні за допомогою режиму захвату. Для виводу значення отриманої частоти в монітор порту можна скористатись
«ардуінівськими» функціями.
4. Розрахувати абсолютну та відносну точності отриманих результатів.
Таблиця L4_5.
* - якщо викладач не задав інший мікроконтролер
Варіант
Пін*
Частота меандру,Гц
1
ICP1 5000 2
ICP1 31250 3
ICP1 25000 4
ICP1 6250 5
ICP1 10000 6
ICP1 15625 7
ICP1 12500 8
ICP1 50000 9
ICP1 3125 10
ICP1 1250 11
ICP4 625 12
ICP4 31250 13
ICP4 6250 14
ICP4 15625 15
ICP4 50000 16
ICP4 1250 17
ICP4 5000 18
ICP4 25000 19
ICP4 10000 20
ICP4 12500

23
Лабораторна робота №5 (зовнішні переривання)
Мета лабораторної роботи
Навчитися теоретично розраховувати та експериментально визначати параметри роботи зовнішніхпереривань мікроконтролерів ATmega328 і
ATmega2560 в різних режимах роботи.
Теоретичні відомості
Першим кроком розглянемо які згідно з технічної документації існують зовнішні переривання. В таблиці Interrupt Vectors in ATmega328 (Table 16-1) для мікроконтролера
ATmega328 та в таблиці
Interrupt
Vectors in
ATmega640/1280/1281/2560/2561 (Table 32) для мікроконтролера ATmega2560 знаходимо наступну інформацію (див. таблицю L5_1 та L5_2).
Таблиця L5_1. Вектори зовнішніх переривань для ATmega328
Номер вектору
Адреса Джерело
Опис переривання
2 0x0002
INT0
Зовнішнє переривання 0 3
0x0004
INT1
Зовнішнє переривання 1 4
0x0006
PCINT0
Переривання 0 при зміні стану виводів
5 0x0008
PCINT1
Переривання 1 при зміні стану виводів
6 0x000A
PCINT2
Переривання 2 при зміні стану виводів
Таблиця L5_2. Вектори зовнішніх переривань для ATmega2560
Номер вектору
Адреса Джерело
Опис переривання
2
$0002
INT0
Зовнішнє переривання 0 3
$0004
INT1
Зовнішнє переривання 1 4
$0006
INT2
Зовнішнє переривання 2 5
$0008
INT3
Зовнішнє переривання 3 6
$000A
INT4
Зовнішнє переривання 4 7
$000C
INT5
Зовнішнє переривання 5 8
$000E
INT6
Зовнішнє переривання 6 9
$0010
INT7
Зовнішнє переривання 7 10
$0012
PCINT0
Переривання 0 при зміні стану виводів
11
$0014
PCINT1
Переривання 1 при зміні стану виводів
12
$0016
PCINT2
Переривання 2 при зміні стану виводів

24
Спочатку розглянемо зовнішні переривання INTn.
Для дозволу цих переривань існує регістр EIMSK (External Interrupt Mask
Register). Його структура у мікроконтролері ATmega328P зображена на рис.L5_1.
Рис.L5_1. Структура регістра EIMSK мікроконтролера ATmega328.
Структура той самого регістра але мікроконтролера ATmega2560 зображена на рис.L5_2.
Рис.L5_2. Структура регістра EIMSK мікроконтролера ATmega2560.
З рисунків L5_1 та L5_2 зрозуміло, що в разі потреби використати те чи
інше переривання необхідно встановити відповідний біт у регістрі EIMSK.
З технічної документації знаходимо до яких пінів мікроконтролерів належать зовнішні переривання INTn.
Таблиця L5_3. Зв'язок між пінами та зовнішніми перериваннями INTn.
INTn
ATmega328
ATmega2560
INT0
PD2 D2
PD0 D21
INT1
PD3 D3
PD1 D20
INT2
-
PD2 D19
INT3
-
PD3 D18
INT4
-
PE4 D2
INT5
-
PE5 D3
INT6
-
PE6 -
INT7
-
PE7 -
Для остаточного налаштування кожного зовнішнього переривання INTn потрібно два біти ISCn0 і ISCn1 регістрів EICRA і EICRB (External Interrupt
Control Register). Таким чином для налаштування INT0 і INT1 мікроконтролера
ATmega328 використовується чотири біта регістра EICRA (див. рис.L5_3), а для

25 налаштування всіх переривань INTn мікроконтролера ATmega2560 потрібно задіяти вісім біт регістра EICRA та вісім біт регістра EICRВ (див. рис.L5_4).
Рис. L5_3. Регістр EICRA мікроконтролера ATmega328.
Рис. L5_4. Регістри EICRA і EICRB мікроконтролера ATmega2560.
Розберемося які можливі події можна відстежувати за допомогою зовнішніх переривань INTn налаштувавши відповідно біти ISCn0 і ISCn1. Для цього подивимось пункт 17.2.1 технічної документації на ATmega328, або таблицю 34 для ATmega2560. Інформація з цих документів приведена в таблиці L5_4.
Таблиця L5_4. Налаштування типу події для зовнішніх переривань
INTn.
ISCn1
ISCn0
Подія
0 0 наявність сигналу низького рівня
0 1 будь-яка зміна сигналу
1 0 зміна сигналу від високого рівня до низького
(негативний фронт)
1 1 зміна сигналу від низького рівня до високого
(позитивний фронт)
З таблиці L5_4 бачимо, що доступні такі події на відповідному піні які призведуть до виклика потрібного обробника переривання: низький сигнал, будь-який фронт, негативний фронт або позитивний фронт.

26
Використаємо отримані данні для створення простішого проекту.
Будемо керувати вбудованим світлодіодом на піні PB7=D13 мікроконтролера ATmega2560 за допомогою кнопки підключеною до піна який пов’язано з зовнішнім перериванням
INT5 (див. таблицю L5_3), тобто пін
PE5=D3. При натисканні на кнопку має викликатися обробник переривання
INT5 який буде інвертувати стан піна
PB7. Для боротьби з брязкотом контактів кнопці використаємо RC фільтр (див. рис.
L5_5
). Ця схема підключення кнопки вимагає програмного підтягування піна до +5 вольт і тоді при натисканні кнопки на цьому піні з’явиться логічний нуль.
Таким чином маємо наступну програму
progL5_1
1 2
3 4
5 6
7 8
9 10 11 12 13 14 15 16 17 18 19
#define
F_CPU 16000000UL
// Частота - 16MHz
#include
<
avr
/
io h
>
// Бібліотека вводу/виводу AVR
#include
<
avr
/
interrupt h
>
// Бібліотека імен переривань int main(
void
) {
DDRB
|=
(1
<<
DDB7);
// PB7=D13 ATmega2560 як ВИХІД
DDRE
&=

(1
<<
DDE5);
// PE5=D3 як ВХІД (сюди підключається кнопка)
PORTE
|=
(1
<<
PORTE5);
// к PE5 підтягуємо до + живлення
EICRB
|=
(1
<<
ISC51);
// ISC51=1 - переривання по FALLING на INT5
EIMSK
|=
(1
<<
INT5);
// Дозволяємо переривання INT5
sei();
// Дозволяємо глобальні переривання while
(1) {}
// Основна програма
}
//обробник переривання INT5
ISR(INT5_vect) {
PORTB
^=
(1
<<
PORTB7);
//інвертуємо стан піна PB7=D13
}
Зауважимо, що номінали як резистора, так і конденсатора можна міняти приблизно на порядок. Тобто схема буде залишатися працездатною при
мкФ
мкФ
C
кОм
кОм
R
1 1
,
0
;
10 1




Рис.L5_5. Підключення кнопки

27
Зараз розглянемо зовнішні переривання (Pin Change
Interrupts)
PCINTn.
Основна відмінність цих переривань від INTn полягає в тому, що вони завжди викликаються при будь-якій зміні стану на відповідних пінах і це не підлягає налаштуванню. Згідно з таблиць L5_1 та L5_2 таких переривань три як в мікроконтролері ATmega328 так і в ATmega2560. Інша дуже важлива відмінність переривань
PCINTn
пов’язана з тим, що кожне переривання поєднує декілька (як правило вісім) пінів. Зв'язок між перериваннями та пінами представлено в таблиці L5_5.
Таблиця L5_5. Відповідність пінів і переривань PCINTn.
Піни
PCINTn
ATmega328P
ATmega2560
PCIE0
П
ер ер ива нн я
PCIN
T
0
PCINT0
PB0 D8
PB0 D53
PCINT1
PB1 D9
PB1 D52
PCINT2
PB2 D10 PB2 D51
PCINT3
PB3 D11 PB3 D50
PCINT4
PB4 D12 PB4 D10
PCINT5
PB5 D13 PB5 D11
PCINT6
PB6 -
PB6 D12
PCINT7
PB7 -
PB7 D13
PCIE1
П
ер ер ива нн я
PCIN
T
1
PCINT8
PC0 A0 PE0 D0
PCINT9
PC1 A1 PJ0 D15
PCINT10
PC2 A2 PJ1 D14
PCINT11
PC3 A3 PJ2 -
PCINT12
PC4 A4 PJ3 -
PCINT13
PC5 A5 PJ4 -
PCINT14
PC6 RESET PJ5 -
PCINT15
-
PJ6 -
PCIE2
П
ер ер ива нн я
PCIN
T
2
PCINT16
PD0 D0 PK0 A8
PCINT17
PD1 D1 PK1 A9
PCINT18
PD2 D2 PK2 A10
PCINT19
PD3 D3 PK3 A11
PCINT20
PD4 D4 PK4 A12
PCINT21
PD5 D5 PK5 A13
PCINT22
PD6 D6 PK6 A14
PCINT23
PD7 D7 PK7 A15

28
З таблиці L5_5 бачимо, що, наприклад, переривання PCINT0 може бути викликане при будь якій зміні стану на пінах від PB0 до PB7. Також з цієї таблиці бачимо, що для того щоб дозволити переривання PCINTn потрібно встановити відповідний біт PCIEn. Ці біти знаходяться в регістрі PCICR (
1   2   3   4

скачати

© Усі права захищені
написати до нас