пʼятниця, 27 вересня 2013 р.

Переривання в МК AVR. Теорія

   

     У попередніх статтях я розглядав програми, які виконувалися "в один потік", тобто усі дії знаходилися так чи інакше в одній послідовності, наприклад під час часової затримки нічого більше не могло виконуватись, кожен цикл опитувалися порти з кнопками і так далі. Така архітектура програми хоч і проста але при вимогах до швидкодії і точності часових періодів, припустимо, не підходить. В таких випадках а також для реалізації багатьох функцій МК потрібно використовувати переривання.

Що таке переривання

     Як я уже згадував, переривання, це певна подія, яка  викликає зупинку виконання основної програми і перехід до виконання певного коду, який називають обробником переривання. Після завершення виконання обробника основна програма продовжує виконуватися з того місця, де її виконання було перерване.  Переривання можуть генеруватися як внутрішніми пристроями, що входять у склад МК, наприклад апаратними таймерами (внутрішні переривання), так і зовнішнім впливом на певні виводи МК (зовнішні переривання). 

Реалізація переривань в МК AVR

    В мікроконтролерах AVR переривання реалізовані наступним чином:
- при виникненні переривання значення програмного лічильника (що визначає адресу команди що буде виконана наступною в основній програмі) записується в стек.
- в програмний лічильник записується значення адреси "вектора переривання".
- по адресі вектора переривання зазвичай знаходиться команда безумовного переходу до обробника переривання (RJMP).
- виконується обробник переривання, причому під час його виконання переривання блокуються, хоча можна програмно розблокувати їх, забезпечивши так звані вкладені переривання.
- обробник переривання закінчується командою повернення до основної програми RETI.
- зі стеку дістається записане в нього значення програмного лічильника
- переривання розблоковуються
- продовжується виконання основної програми.

Що ж таке "вектор переривання"?
     Вектор переривання, це фактично адреса в програмній пам'яті, яка закріплена за тим чи іншим перериванням. В МК AVR вектори переривань знаходяться на початку програмної пам'яті і утворюють так звану таблицю векторів переривань.


Для кожного типу МК таблиця буде відрізнятися, так як МК мають різні набори периферійних пристроїв, що можуть генерувати переривання. Для нашого МК АТТiny 26 таблиця векторів переривань виглядає наступним чином:

За адресою $000 знаходиться вектор Reset, з якого починаэться виконання програми після подачі живлення на МК чи після припинення подачі сигналу на вхід RESET.

     Таким чином, якшо ми плануємо використовувати в програмі переривання асемблерний код повинен обов'язково містити директиву .ORG 0, яка вказує на те що програма починається з нульової адреси і далі розмістити наступні рядки:

    .ORG 0;  Наступний рядок з командою знаходиться за адресою $000
     RJMP Reset;
     RJMP INT0Interrupt;
     RJMP PCINTInterrupt;
     RJMP Tim1CompA;
     RJMP Tim1CompB;
     RJMP Tim1OVF;
     RJMP Tim0OVF;
     RJMP USIST;
     RJMP USIOVFL;
     RJMP EEPROMRED;
     RJMP ANCOMP;
     RJMP ADCREAD;

Reset:
     Команди основної програми
     
    Втім мітки обробників переривань можуть мати довільні імена. Як бачимо, при включенні живлення почнеться виконання програми з нульової адреси, і зразу буде здійснений перехід до мітки Reset: і виконання основної програми. При виникненні переривання буде здійснено перехід за відповідним вектором, після чого перехід по команді  RJMP до відповідного обробника.

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

    Слід відмітити, що положення векторів переривань в таблиці також визначає їх пріоритет при виникненні одночасно декількох переривань. Першим буде оброблене те, вектор якого знаходиться ближче до початку таблиці.

                                   Обробка переривань в МК AVR

    Розглянемо, як виконується обробка переривань при їх виникненні. По перше, для виконання переривань повинен бути встановлений флаг глобального дозволу переривань І в регістрі SREG.
Таким чином, якщо ми хочемо дозволити переривання, наша програма повинна містити команду SEI, після виконання якої переривання будуть дозволені, забороняються переривання командою СLI

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

     При виникненні переривання флаг І в регістрі SREG апаратно скидається, забороняючи виникнення інших переривань, проте можна при потребі в обробнику переривання примусово дозволити переривання командою SEI.
При виконанні команди виходу з обробника переривань RETI.флаг І в регістрі SREG встановлюється, дозволяючи подальшу обробку переривань.

     Слід відмітити, що в МК AVR існують два типи переривань по принципу їх роботи - одні переривання при виникненні встановлюють флаг у відповідних регістрах, при переході до вектора переривання цей флаг апаратно скидається, а інші не встановлюють флага а генеруються весь час поки діє умова виникнення переривання.

    Таким чином, якщо в нас переривання заборонені ( І в регістрі SREG = 0) а в цей час регістри налаштування переривань містять потрібні значення і виникає переривання,  то флаг переривання буде встановлено, а переходу на обробник не буде. При цьому після дозволу переривань командою SEI переривання першого типу виконається, навіть якщо умова, що його викликала вже не діє!!! Якщо виникло декілька переривань такого типу, вони усі будуть виконані в порядку пріоритета. Переривання другого типу виконане в такому випадку не буде.

     Також слід наголосити, що значення регістру SREG ніде не зберігається перед виконанням обробника переривань, тому, якщо це необхідно, слід зберігати його (наприклад в якісь регістр або в стек) на початку обробника переривань і відновлювати перед командою RETI.  Інакше, якщо, припустимо переривання виникло після команди порівняння і перед командою умовного переходу (яка виконується в залежності від стану флагів SREG ) і в обробнику переривання значення SREG змінюється, ми матимемо перехід зовсім не по тій гілці по якій планувалося.

     Мінімальний час виконання переходу до обробника переривання (час відгуку) складає 4 такти. Якщо переривання відбудеться під час виконання команди, яка займає декілька тактів (наприклад команда переходу), то спочатку відбудеться завершення цієї команди. Також час відгуку збільшується, коли МК знаходиться в "сплячому режимі" (режими енергозбереження будуть розглядатися пізніше)  Час повернення з обробника після виконання RETI також складає 4 такти.
Також слід відмітити, що після повернення до основної програми обов'язково виконається її одна команда перш ніж відбудеться обробка наступного переривання (наприклад "відкладеного", флаг якого встановився під час виконання обробника попереднього переривання).

     СЛІД НАМАГАТИСЯ робити обробники переривань якомога коротшими, інакше при частому виникненні переривань сильно знижується продуктивність виконання оновної програми!!!

     От в принципі і все по теорії переривань на МК AVR, докладніше кожне переривання будемо розглядати у практичних експериментах. До зустрічі!

Немає коментарів:

Дописати коментар