- •Методичні вказівки
- •6.05080202 „Електронні системи”
- •6.05080102 «Фізична та біомедична електроніка»
- •Введення.
- •Початкові дані для проектування.
- •Приклади реалізації елементів мікропроцесорної
- •Робота із зовнішніми перериваннями мк avr.
- •2.2 Робота з таймерами/лічильниками мк avr
- •2.3 Робота мк avr з lcd дисплеєм.
- •2.4 Інтерфейс 1-Wire і температурний датчик ds18b20
- •Література
- •51918, М. Дніпродзержинськ
Приклади реалізації елементів мікропроцесорної
системи керування.
Робота із зовнішніми перериваннями мк avr.
Переривання це подія, при якому відбувається призупинення основної програми і перехід на виконання підпрограми переривання. Щоб дізнатися, які ж є переривання в МК, необхідно відкрити Datasheet мікроконтролера та зайти на вкладку Interrupts і там на самому початку побачимо таблицю векторів переривань. Наприклад, для МК Atmega8 вона виглядає як наведено в табл.1.
У кожному векторі переривання знаходиться команда переходу з адресою початку підпрограми переривання. Будь-яка програма починається з Reset, в якому знаходиться команда переходу до блоку ініціалізації. А далі, кожне переривання налаштований на якусь подію і при спрацьовуванні цієї події програма переходить до сценарію обробки цього переривання. Видно, що кожному перериванню відповідає свій вектор переривання. Чим вище адреса переривання, тим нижчий пріоритет переривання. Тобто в черзі переривань, переривання з великим пріоритетом будуть виконуватись раніше. Якщо почалася обробка якого-небудь переривання, жодне інше переривання не може бути викликано, навіть з більшим пріоритетом. Інакше виходив би рекурсивний (нескінченний) виклик обробників переривань і складніше було б відстежити роботу програми.
При виклику обробника будь-якого переривання біт глобального дозволу переривань I регістра SREG (status register - регістр стану) скидається в "0" і тільки по завершенні обробки переривання знову встановлюється в "1" і дозволяє почати обробку наступного переривання в черзі. Щоб встановити примусово цей біт існує функція sei(), а щоб скинути - cli(). При запуску програми цей біт завжди скинутий і щоб переривання спрацьовували його потрібно встановити (викликати sei()).
Отже, у цьому параграфі нас будуть цікавити тільки зовнішні переривання, тобто переривання, що виникають при зміні стану певних входом МК. З таблиці векторів переривань видно, що у МК ATmega8 таких переривань 2 - INT0 і INT1 і їх пріоритет вище інших переривань. При детальному розгляді Datasheet External Interrupts і виявляємо, що для налаштування цих переривань потрібно скористатися регістром MCUCR (MCU Control Register - регістр управління) і GICR (General Interrupt Control Register - загальний регістр управління перериваннями). Розглянемо їх детальніше.
Таблиця 1 – Вектори переривань МК Atmega8.
Регістр MCUCR.
Біт 1, 0 - ISC01, ISC00: Налаштування умови спрацьовування переривання INT0 (таблиця 2).
Таблиця 2 – Налаштування умов спрацювання переривання INT0.
Біт 3, 2 - ISC11, ISC10: Налаштування умови спрацьовування переривання INT1 (таблиця 3).
Таблиця 3 – Налаштування умов спрацювання переривання INT1.
(Біти 4-7 відносяться до управління живленням і тут розглядати не будемо).
Регістр GICR
Біт 7 - INT1: Дозволяє зовнішнє переривання 1 ("1" - дозволено, "0" - заборонено).
Біт 6 - INT0: Дозволяє зовнішнє переривання 0 ("1" - дозволено, "0" - заборонено).
Також будь-яке переривання має свій прапор переривання. Цей прапор встановлюється в "1" у момент, коли мало відбутися переривання, навіть якщо переривання глобально заборонені і відповідна програма обробки переривання не викликається. Можна, наприклад, усередині якого-небудь обробника переривання по цьому прапору перевіряти було якесь переривання чи ні. Прапори зовнішніх переривань є 7-м і 6-м бітами регістра GIFR. Прапори переривань скидаються записом у них "1".
Регістр GIFR
Біт 7 - INTF1: Прапор зовнішнього переривання 1.
Біт 6 - INTF0: Прапор зовнішнього переривання 0.
Розглянемо приклад роботи з перериванням. На рис.1 наведена принципова схема пристрою. У нормальному режимі світлодіод D2 світиться, а світлодіод D1 – ні. Якщо натиснути кнопку то навпаки, світлодіод D2 не буде світитися, а світлодіод D1 – буде. Розглянемо програму зроблену у середовищі CodeVisionAVR, що реалізує даний пристрій.
Рисунок 1. – Принципова схема пристрою.
-
1
#include <mega8.h>
2
#include <delay.h>
3
// External Interrupt 0 service routine
4
interrupt [EXT_INT0] void ext_int0_isr(void) // підпрограма обробки
//переривань (якщо натиснута кнопка)
5
6
{
// Place your code here
7
PORTC.0=0; // якщо кнопка натиснута діод D2 не світиться
8
PORTB.0=1; // якщо кнопка натиснута діод D1 світиться
9
delay_ms(100); // чекаємо 100 мс
10
}
11
// Declare your global variables here
12
void main(void)
13
{
14
DDRB.0=1; // 0 біт порту В налаштовуємо на вихід
15
PORTB.0=0; // подаємо логічний «0» на 0 біт порту В
16
DDRD.2=0; // налаштовуємо 2 біт порту D
17
PORTD.2=1; // як вхід з «підтяжкою»
18
DDRC.0=1; // 0 біт порту С налаштовуємо на вихід
19
PORTC.0=0; // подаємо логічний «0» на 0 біт порту С
20
// External Interrupt(s) initialization
21
// INT0: On
22
23
// INT0 Mode: Low level
// INT1: Off
24
GICR|=0x40; // записуємо у регістр GICR число 0100 0000 та дозволяємо
// переривання за INT0
25
MCUCR=0x00; // налаштовуємо вхід INT0 на умову спрацювання
//переривання за низьким рівнем
26
27
GIFR=0x40; // скидаємо прапор переривань за INT0
// Global enable interrupts
28
#asm("sei") // дозволяємо обробку переривань
29
while (1)
30
{
31
// Place your code here
32
PORTB.0=0; // поки кнопка не натиснута діод D1 не світиться
33
PORTC.0=1; // поки кнопка не натиснута діод D2 світиться ;)
34
}
35
}
