Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная курсовой.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
935.94 Кб
Скачать
  1. Приклади реалізації елементів мікропроцесорної

системи керування.

    1. Робота із зовнішніми перериваннями мк 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

}