Лабораторна робота №10 «Вивчення використання переривань мікроконтролера AVR» 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторна робота №10 «Вивчення використання переривань мікроконтролера AVR»



Ціль роботи

- вивчити принципів роботи переривань AVR мікроконтролера

- закріпити знання попередніх лабораторних роботах

Програма виконання роботи

- проініціалізувати таймер на фіксацію проміжку часу у 2 мс (період можна змінити) з генерацією переривань, коли таймер-лічильник зафіксує вказаний період

- дозволити роботу переривань

- при написати обробник переривань від таймера

- у симуляторі переконатися, що період між подіями справді становить вказану величину (2 мс по замовчуванню)[54]

 

Додатковий теоретичний матеріал необхідний для виконання лабораторної роботи

Переривання (Interrupt – англ.) – це сигнал, що повідомляє процесор про настання якої-небудь події. При цьому виконання поточної послідовності команд призупиняється і керування передається обробнику переривання, який реагує на подію та обслуговує її, після чого повертає управління в перерваний код.

Залежно від джерела виникнення сигналу переривання поділяються на:

Асинхронні або зовнішні (апаратні) — події, які створені зовнішніми джерелами (наприклад, периферійними пристроями) та можуть відбутися в довільний момент, наприклад, сигнал від таймера;

Синхронні або внутрішні — події в самому процесорі як результат порушення якихось умов при виконанні машинного коду: поділ на нуль або переповнення, звернення до неприпустимих адрес або неприпустимий код операції;

Програмні (частковий випадок внутрішнього переривання) — ініціюються виконанням спеціальної інструкції в коді програми. Програмні переривання, як правило використовуються для звернення до функцій вбудованого програмного забезпечення (firmware), драйверів й операційної системи.

Маскування переривань

Залежно від можливості заборони зовнішні переривання поділяються на:

ті, що можна маскувати — переривання, які можна забороняти установкою відповідних бітів у регістрі маскування переривань

ті, що не можна маскувати (англ. Non maskable interrupt, NMI) — обробляються завжди, незалежно від заборон на інші переривання.

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

Вектор переривання — закріплений за джерелом переривання номер, який ідентифікує відповідний обробник переривань. Вектори переривань об'єднуються в таблицю векторів переривань, що містить адреси обробників переривань. Розташування таблиці залежить від типу та режиму роботи процесора.

Пріоритет переривань вказує яке переривання відбудеться першим (або чи обробник текучого переривання буде перерваним іншим перериванням) за умови перебування обох (обо більше) у черзі на обробку. зазвичай пріоритет переривань визначається номером і по його порядковому номеру визначається яке переривання є більш чи менш пріоритетним.

Вкладеність переривань – дозвіл більш пріоритетному перериванню переривами обробник переривань менш пріоритетного переривання.

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

Гнучкий модуль переривань містить свої керуючі регістри в просторі вводу-виводу і має додатковий біт загального дозволу роботи системи переривань у регістрі статусу (I -біт). У всіх переривань є свій вектор переривання відповідно до таблиці векторів переривань. Переривання мають пріоритет відповідно до позиції їх вектора. Переривання з меншою адресою переривання мають більш високий пріоритет.

 

Скидання й обробка переривань

AVR-мікроконтролери підтримують декілька різних джерел переривань. Всі переривання, а також скидання мають свій індивідуальний вектор в пам'яті програм. Для кожного переривання є власний біт дозволу. Крім того, є можливість загального дозволу роботи переривань за допомогою управління відповідним бітом в регістрі статусу (I -біт).

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

Після виникнення переривання біт I загального дозволу переривань апаратно скидається і всі переривання забороняються. Користувач може програмно записати лог. 1 в біт I для дозволу вкладених переривань. В цьому випадку всі дозволені переривання можуть перервати поточну процедуру обробки переривань. Біт I автоматично встановлюється після виконання інструкції виходу з переривання RETI.

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

Другий тип переривань активізується відразу після виконання умови переривання. Дані переривання не обов'язково мають мітки переривань. Якщо умова переривання зникає до його дозволу, то даний запит ігнорується.

Після виходу з переривання AVR-мікроконтроллер повертається до виконання основної програми.

Зверніть увагу, що регістр статусу автоматично не запам'ятовується при виклику процедури обробки переривання і не відновлюється при виході з цієї процедури. Дані дії необхідно виконати програмно.

Приклад обробника переривань у Асамблелі з запам’ятовуванням регістру статусу

/*Збереження регістру статусу у стек*/

in r16, SREG

push r16

корисні дії обробника переривань

/*Відновлення регістру статусу із стеку*/

pop r16

out SREG, r16

 

/*Вихід з обробника переривань і перехід на програму, виконання якої було перерване*/

Reti

 

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

Для дозволу переривань використовується інструкція SEI, а наступна за SEI інструкція буде виконана перед відпрацюванням будь-якого відкладеного переривання.

 

Час реакції на переривання

Реакція на відпрацювання запиту на переривання триває мінімум 4 машинних цикли. Після закінчення цього часу програма продовжує своє виконання з вектора відповідного переривання. Протягом 4 машинних циклів стан програмного лічильника поміщається в стек. Як правило, за адресою вектора переривань зберігається команда переходу на процедуру обробку переривань, а на даний перехід витрачається ще 3 машинних цикли. Якщо запит на переривання виникає в процесі виконання інструкції, що вимагає більш 1 машинних цикли на виконання, то переривання буде оброблено тільки після виконання цієї інструкції. Якщо переривання виникає під час перебування мікроконтролера в режимі сну (SLEEP MODE), то реакція на переривання збільшиться ще на 4 цикли. Дана затримка пов'язана з часом старту з обраного режиму сну.

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

 

Таблиця векторів переривань для мікроконтролера ATMEGA128

N вектора Адреса пам'яті програм Джерело Умова виникнення переривання
  $0000 Скидання (RESET) Зовнішнє скидання, скидання при подачі живлення, скидання при неприпустимому зниженні живлення, скидання сторожовим таймером і скидання через JTAG-інтерфейс
  $0002 IINT0 Запит на зовнішнє переривання 0
  $0004 INT1 Запит на зовнішнє переривання 1
  $0006 INT2 Запит на зовнішнє переривання 2
  $0008 INT3 Запит на зовнішнє переривання 3
  $000A INT4 Запит на зовнішнє переривання 4
  $000C INT5 Запит на зовнішнє переривання 5
  $000E INT6 Запит на зовнішнє переривання 6
  $0010 INT7 Запит на зовнішнє переривання 7
  $0012 TIMER2 COMP Спрацювання компаратора таймера-лічильника 2
  $0014 TIMER2 OVF Переповнення таймера-лічильника 2
  $0016 Timer1 CAPT Захоплення фронту таймером-лічильником 1
  $0018 Timer1 COMPA Спрацювання компаратора А таймера-лічильника 1
  $001A Timer1 COMPB Спрацювання компаратора В таймера-лічильника 1
  $001C Timer1 OVF Переповнення таймера-лічильника 1
  $001E TIMER0 COMP Спрацювання компаратора таймера-лічильника 0
  $0020 TIMER0 OVF Переповнення таймера-лічильника 0
  $0022 SPI, STC Завершення послідовної передачі інтерфейсом SPI
  $0024 USART0, RX Завершення прийому УСАПП 0
  $0026 USART0, UDRE Регістр даних УСАПП0 вільний
  $0028 USART0, TX Завершення передачі УСАПП 0
  $002A АЦП Завершення перетворення АЦП
  $002C EE READY Готовність ЕСППЗУ
  $002E ANALOG COMP Аналоговий компаратор
  $0030 TIMER1 COMPC Спрацювання компаратора З таймера-лічильника 1
  $0032 TIMER3 CAPT Захоплення фронту таймером лічильником 3
  $0034 TIMER3 COMPA Спрацювання компаратора А таймера-лічильника 3
  $0036 TIMER3 COMPB Спрацювання компаратора В таймера-лічильника 3
  $0038 TIMER3 COMPC Спрацювання компаратора З таймера-лічильника 3
  $003A TIMER3 OVF Переповнення таймера лічильника 3
  $003C USART1, RX Завершення прийому УСАПП 1
  $003E SART1, UDRE УСАПП1 вільний
  $0040 USART1, TX Завершення передачі УСАПП1
  $0042 TWI Двопровідний послідовний інтерфейс
  $0044 SPM READY Готовність запису в пам'ять програм

У таблиці 24 показано розташування векторів скидання і переривань в залежності від різних установок BOOTRST і IVSEL. Якщо програма не використовує переривання, то вона може бути розміщена рівномірно, використовуючи комірки з адресами векторів переривань для зберігання програмного коду. Можливий також випадок, коли вектор скидання розташовується в секторі прикладної програми, а вектори переривань - в завантажувальному секторі або навпаки.

 

Таблиця розміщення векторів скидання і переривань

BOOTRST IVSEL Адреса скидання Початкова адресу векторів переривань
    $0000 $0002
    $0000 Адреса скидання в завантажувальному секторі + $0002
    Адреса скидання в завантажувальному секторі $ 0002
    Адреса скидання в завантажувальному секторі Адреса скидання в завантажувальному секторі + $0002

 

Нижче наведено більшість типових і спільних програмних установок адрес скидання і векторів переривань у ATmega128:

Адреса Інструкція Коментар

jmp RESET; Перехід на обробку скидання

jmp EXT_INT0; Перехід на обробку запиту IRQ0

jmp EXT_INT1; Перехід на обробку запиту IRQ1

jmp EXT_INT2; Перехід на обробку запиту IRQ2

jmp EXT_INT3; Перехід на обробку запиту IRQ3

jmp EXT_INT4; Перехід на обробку запиту IRQ4

jmp EXT_INT5; Перехід на обробку запиту IRQ5

jmp EXT_INT6; Перехід на обробку запиту IRQ6

jmp EXT_INT7; Перехід на обробку запиту IRQ7

jmp TIM2_COMP; Перехід на обробку при виконанні умови порівняння таймера 2

jmp TIM2_OVF; Перехід на обробку при переповненні таймера 2

jmp TIM1_CAPT; Перехід на обробку при захопленні фронту таймером 1

jmp TIM1_COMPA; Перехід на обробку при спрацьовуванні компаратора А таймера 1

jmp TIM1_COMPB; Перехід на обробку при спрацьовуванні компаратора В таймера 1

jmp TIM1_OVF; Перехід на обробку при переповненні таймера 1

jmp TIM0_COMP; Перехід на обробку при виконання умови порівняння таймера 0

jmp TIM0_OVF; Перехід на обробку при переповненні таймера 0

jmp SPI_STC; Перехід на обробку при завершенні передачі SPI

jmp USART0_RXC; Перехід на обробку при завершенні прийому УСАПП0

jmp USART0_DRE; Перехід на обробку при звільненні регістра даних UDR УСАПП0

jmp USART0_TXC; Перехід на обробку при завершенні передачі УСАПП0

jmp ADC; Перехід на обробку при завершенні перетворення АЦП

jmp EE_RDY; Перехід на обробку при готовності ЕСППЗУ

jmp ANA_COMP; Перехід на обробку при спрацьовуванні аналогового компаратора

jmp TIM1_COMPC; Перехід на обробку при спрацьовуванні компаратора З таймера 1

jmp TIM3_CAPT; Перехід на обробку при захопленні фронту таймером 3

jmp TIM3_COMPA; Перехід на обробку при спрацьовуванні компаратора А таймера 3

jmp TIM3_COMPB; Перехід на обробку при спрацьовуванні компаратора В таймера 3

jmp TIM3_COMPC; Перехід на обробку при спрацьовуванні компаратора З таймера 3

jmp TIM3_OVF; Перехід на обробку при переповненні таймера 3

jmp USART1_RXC; Перехід на обробку по завершенні прийому УСАПП1

jmp USART1_DRE; Перехід на обробку при звільненні регістра даних UDR УСАПП1

jmp USART1_TXC; Перехід на обробку при завершенні передачі УСАПП1

jmp TWI; Перехід на обробку переривання по двопровідному послідовному інтерфейсу

jmp SPM_RDY; Перехід на обробку переривання при готовності виконання команди SPM

;

RESET:

ldir16, high (RAMEND); Початок основної програми

out SPH, r16; Установка покажчика стека в кінці ОЗУ

Ldi r16, low (RAMEND)

Out SPL, r16

sei; Дозвіл переривань

 

............

 

(!) Це може бути вам корисно

У випадку, коли використовуються тільки деякі переривання, але прийьому перехід на обробник переривань треба встановити у свій вектор переривань (наперед визначену комірку), то зручно використати такий шаблон:

/**********************************************************************************/

jmp RESET; Перехід на обробку скидання

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp TIM0_COMP; Перехід на обробку при виконання умови порівняння таймера 0

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

jmp NO_INT

;

RESET:

ldir16, high (RAMEND); Початок основної програми

out SPH, r16; Установка покажчика стека в кінці ОЗУ

Ldi r16, low (RAMEND)

Out SPL, r16

sei; Дозвіл переривань

 

............

CONTINUE:

............

Jmp CONTINUE

/*Обробник неіснуючого переривання*/

NO_INT: reti

/*Обробник переривання від таймеру-лічильнику 0 при досягненні умови порівняння*/

TIM0_COMP:

In r16, SREG

Push r16

корисні дії обробника переривань

/*Відновлення регістру статусу із стеку*/

Pop r16

out SREG, r16

 

/*Вихід з обробника переривань і перехід на програму, виконання якої було перерване*/

Reti

............

/**********************************************************************************/

Загальний регістр управління перериваннями задає розміщення таблиці векторів переривань.



Поделиться:


Последнее изменение этой страницы: 2016-04-18; просмотров: 393; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.130.13 (0.078 с.)