Прекин на контролерот AVR во Atmel AVR Studio. Прекинува - проучување AVR - Каталог на написи - Микроконтролери - лесно е! Во која средина да се програмира микроконтролерот прекинува

Системите за прекин се важен дел од секој контролен систем.

Колку ефикасно микропроцесорскиот систем ги извршува своите функции во голема мера зависи од неговата работа. Општата структура на системот за прекини MK-51 е прикажана на сл. 14.3.

Микроконтролерите на семејството МК-51 обезбедуваат поддршка за пет извори на прекини:

* два надворешни прекини кои пристигнуваат преку влезовите INT0 и INT1 (порта линии P3: P3.2 и P3.3, соодветно);

* два прекини од тајмери/бројачи T/C0 и T/C1;

* прекин на сериската порта.

Барањата за прекин се запишуваат во специјалните функционални регистри на микроконтролерот: ознаките IE0, IE1, TF0, TF1 барањата за прекин од INT0, INT1, T/C0 и T/C1 се содржани во контролниот регистар TCON (Табела 14.4), а ознаките RI и TI барања за прекин од сериската порта - во SCON регистарот за контрола на сериската порта.

Табела 14.4. Формат на регистрација на TCON

0 IT0 Поставување на типот на прекин INT0

1 IE0 Знаме за барање за прекин INT0

2 IT1 Поставување на типот на прекин INT1

3 IE1 Знаме за барање за прекин INT1

4 TR0 Овозможи тајмер/бројач 0

5 TF0 Знаме за прелевање (барање за прекин) тајмер/бројач 0

6 TR1 Овозможи тајмер/бројач 1

7 TF1 Знаме за прелевање (барање за прекин) на тајмерот/бројачот 1

Знамињата TF0 и TF1 се поставени од страна на хардверот кога соодветниот тајмер/бројач се прелева (поточно, кога T/Cx преминува од состојбата „сите едни“ во состојбата „сите нули“).

Знамињата IE0 и IE1 се поставени со хардвер од надворешни прекини IT0 и IT1, соодветно. Надворешното барање може да предизвика поставување на знамето или кога нивото на сигналот на соодветниот влез е ниско, или кога овој сигнал се префрла од високо на ниско ниво (со фреквенција што не надминува половина од фреквенцијата на надворешниот часовник на МК).

Типот на барање е конфигуриран со софтвер кој ги поставува битовите IT0 и IT1 во контролниот регистар TCON. Поставувањето ITx = 0 го конфигурира системот за прекин да бара ниско ниво на сигнал, ITx = 1 - го поставува прекинот да бара ниско ниво на сигнал.

Знамењата TI и RI се поставени од хардверот на серискиот интерфејс по завршувањето на преносот или по завршувањето на приемот, соодветно.

Сите наведени знаменца за барање за прекин се програмски достапни за поставување и ресетирање. Поставувањето на знамето за барање прекин во софтверот резултира со истиот одговор од микроконтролерот како и поставувањето на истото знаменце во хардверот.

Знамењата TF0 и TF1 се ресетираат од хардверот кога контролата се префрла на соодветната рутина за прекин.

Ресетирањето на знаменцата IEx се врши во хардвер кога се сервисира прекинот само ако прекинот е конфигуриран да го чувствува падот на сигналот INTx. Ако прекинот е конфигуриран да го чувствува нивото на сигналот за барање, тогаш ресетирањето на знамето IEx мора да го изврши програмата за услуга за прекин, дејствувајќи на изворот на прекин за да го отстрани барањето.

Знамењата TI и RI може да се ресетираат само со софтвер.

Секој тип на прекин е индивидуално овозможен или оневозможен со поставување или бришење на соодветните битови од регистарот за овозможување прекини на IE. Овој регистар содржи и општ бит за оневозможување за сите прекини. Форматот на IE регистарот е даден во табела. 14.5.

Табела 14.5. Доделување на битови за IE регистар

Регистрирајте ја позицијата

Бит мнемоник

Функција

Оневозможи прекини од сите извори

Не се користи

Не се користи

Оневозможи прекин од сериска порта

Оневозможи прекин на тајмерот/бројачот T/C1

Оневозможи прекин од надворешен изворИНТ1

Оневозможи прекин на тајмер/бројач T/C0

Оневозможи прекин од надворешен извор INT0

На секој тип на прекин може програмски да му се додели еден од двата можни приоритети: 0 - најнизок или 1 - највисок.

Приоритетите се конфигурираат со поставување или бришење на соодветниот бит во регистарот за приоритетни прекини на IP. Форматот на овој регистар е даден во табела. 14.6.

Кога барањата за прекин се примаат истовремено од извори кои имаат различни приоритети, прво се обработува барањето од изворот со повисок приоритет.

Во случај на истовремено примање на неколку барања за прекин со ист приоритет, редоследот на нивна обработка го одредува хардверот на микроконтролерот и не може да се менува со софтвер. Овој редослед одговара на редоследот на ознаки за барање за прекин на гласањето, што изгледа вака:

IT0 -> TF0 -> IT1 -> TF1 -> (RI, TI)

Табела 14.6. Доделување на битови за IP регистар

Регистрирајте ја позицијата Битна мнемоничка функција

7 - Не се користи

6 - Не се користи

5 - Не се користи

Приоритет на прекин на сериската порта 4 PS

3 PT1 Приоритет на прекин на тајмер/бројач T/C1

2 PX1 Приоритет на прекин од надворешен извор INT1

1 PT0 тајмер/бројач Приоритет на прекин T/C0

0 PX0 Приоритет на прекин од надворешен извор INT0

Хардверски имплементиран повик за ракувач со прекини се состои од следниве дејства:

* зачувување на вредноста на програмскиот бројач на стекот;

Влезните точки на управувачот со прекини за секој извор на прекин се фиксирани во хардверот. Нивните вредности се дадени во табелата. 14.7.

Табела 14.7. Адреси на влезни точки за прекинување на ракувачите

Прекини извор

Адреси на влезни точки за прекинување на ракувачите

Надворешен прекин ( ITO)

Тајмер-бројач (TFO)

Надворешен прекин (IT1)

Тајмер-бројач (TF1)

Сериска порта (R1 или T1)

Првата команда на управувачот со прекини треба да се наоѓа на наведената адреса. Како по правило, таквата команда е команда за безусловно скокање до местото во програмата каде што всушност се наоѓа управувачот.

При префрлување на рутината за справување со прекини, автоматски, без оглед на состојбата на регистарот IE, сите прекини кои имаат приоритетно ниво еднакво на нивото на приоритет на сервисираниот прекин се оневозможени - односно вгнездените прекини со еднакво ниво на приоритет се оневозможени . Така, прекинот со низок приоритет (има „0“ во соодветниот бит на IP-регистерот) може да биде прекинат со прекин со висок приоритет (има „1“ во соодветниот бит на IP регистарот), но не еден со низок приоритет. Сервисирањето на прекин со висок приоритет не може да биде прекинато од друг извор.

Враќањето од управувачот со прекини се постигнува со помош на инструкцијата RETI, која ја враќа од оџакот вредноста на бројачот на програмата за компјутер зачуван таму во моментот кога бил повикан управувачот со прекини и логиката за приоритет на прекин.


Ајде да зборуваме за прекини.Зборот прекин зборува сам за себе, еден процес е запрен некое време за да се извршат дополнителни дејства. Прекините можат да бидат надворешни или внатрешни. Дозволете ми да ви дадам едноставен пример што го слушнав од мојот пријател...

Се спреми да ги измие садовите во кујната, почна со возбуда, ги засука ракавите... но садовите се покажаа мрсни и тој беше принуден да паузира за да најде детергент за миење мрсни садови на една од полиците на кујната, по што повторно ја продолжил својата задача. Но, во одреден момент заѕвони телефонот и тој повторно застана од работа, го зеде телефонот, се јави неговата свекрва и рече дека доаѓа на гости, па тој требаше да оди во продавница за да купи намирници пред таа пристигна. Отидов до продавница и дури потоа ги измив садовите.

Овој пример покажува два вида прекини, првиот е поврзан со извршувањето на главната работа - барање детергент за мрсни садови - внатрешен прекин, вториот - телефонски повик– надворешен прекин.
Во микроконтролерот, надворешните прекини се јавуваат поради сигнали кои доаѓаат од други извори, внатрешните прекини се јавуваат поради уредите вградени во самиот микроконтролер. Зошто прекините се толку привлечни?
Првата е дека можеме да го запреме главниот процес за да извршиме некоја друга функција, а потоа да продолжиме со овој процес.
Втората, а веројатно во многу случаи и главната, се смета за забрзување на процесот на извршување на сите функции, поради внатрешните дополнителни уреди. Да се ​​вратиме на нашиот пример. Да речеме, мојот пријател почна да ги мие садовите кога неговата сопруга веќе пристигна дома. Гледајќи ги мрсните садови бара од неа да најде течност за миење садови, а додека се мие таа веќе ќе му ја донесе оваа течност. Но, тогаш заѕвони телефонот, мојата сопруга го зеде телефонот, разговараше со нејзината мајка и отиде во продавница. Заедно, сè беше направено многу брзо!
И уште полесно е да се заглавите - т.е. нема главна програма.
Мојата пријателка седи на софата и не прави ништо, домашната помошничка ги гледа валканите садови, му кажува за тоа и откако добила дозвола, почнува да се мие. Кога ќе заѕвони телефонот и вели на сопругата да ја крене, сопругата зборува на телефон, а разговорот оди до бакалница... Убавица! Во овој случај, неколку В/И уреди работат истовремено во микроконтролерот (во современите микроконтролери може да има доста од нив) и севкупните перформанси на процесорот се зголемуваат многу пати, но прекините од уредите се обработуваат секвенцијално еден по друг (не истовремено ), во зависност од приоритетот (во нашиот пример, сопругата има поголем приоритет од домашната помошничка).

Неколку регистри се одговорни за управување со прекини
SREG – статусен регистар(содржи). Ја разгледуваме табелата на влезно/излезни уреди. Седмиот бит од регистарот SREG е знамето I (прекин), кое се нарекува знаменце за овозможување на глобален прекин.Ако знамето е испуштено (седмиот бит е нула), тогаш сите прекини се оневозможени. Ако знамето е подигнато (поставете I на 1), овозможуваме прекини.

Знамето I се поставува и се ресетира со командите:
SEI - овозможи прекини
CLI - оневозможи прекини
Кои прекини ќе работат се поставуваат со помош на регистри наречени - прекини маски.
Прекините маски се назначени на следниов начин:
TIMSK,..,..,.. – управување со прекини од тајмери ​​и други вградени уреди.
ГИМСК (ГИКР во семејството Мега) - управување со сите надворешни прекини.
Маските за прекин пак зависат од ознаките за прекини:
TIFR и GIFR соодветно(да не се меша со знамето за овозможување на глобалниот прекин).

Секвенца на извршување на прекини:
Кога микроконтролерот е вклучен, сите знаменца за прекини се ресетираат на 0. За да овозможи прекини, програмата мора да го постави знамето I на регистарот SREG на 1. После ова, регистрирајте ги регистрите за маски со поставени локални прекини (прекините што ни се потребни) .
Кога ќе пристигне барање за прекин (сигнал), го крева знамето за прекин (дури и ако прекинот е оневозможен, за да се организираат вгнездени прекини и приоритет помеѓу различни прекини). Ако прекините не се оневозможени, контролорот ќе го контактира соодветниот (Вектори на прекин) - вектор на прекини, паузирање на тековната програма.
Вектор на прекиние фиксна линија во програмската област каде што оди програмата кога ќе дојде до прекин.
Се повикува целата листа на вектори на прекини прекини векторска табела, кој се наоѓа на почетокот на програмскиот код.
Значи, во моментот кога се пристапува до векторот на прекини, знамето I на регистарот SREG и знамето што го предизвикало прекинот се ресетираат на 0, оневозможувајќи ги другите прекини. Ако се појават други барања за прекин додека прекинот се извршува, знаменцата за тие прекини остануваат подигнати. По завршувањето на тековниот прекин, знамето I на регистарот SREG се подигнува, дозволувајќи му на следниот да се изврши. Ако пристигнат неколку барања и нивните знаменца се подигнат, тогаш прво ќе се изврши прекинот чиј вектор е помал на адресата во табелата, поблиску до почетокот на меморијата. Следува второто итн. Дополнително, програмерот може да организира таканаречен вгнезден прекин, кога ќе се појави друг прекин за време на извршувањето на програмата за прекин. Потоа се прекинува извршувањето на тековниот прекин и се извршува нов, по што се продолжува со извршувањето на стопираниот прекин.

Како пример, дадена е табела на вектори на прекини за ATtiny2313

Векторската табела за прекини за Atmega16 е следна:

Кога се споредуваат, табелите воопшто не се совпаѓаат.
Во семејството ATtiny, векторската линија за прекин зафаќа 16 бита, а во семејството Мега потребни се 32 бита (обрнете внимание на адресите на векторите на прекини; да ве потсетам дека адресната линија во програмската област е претставена со 16 -бит збор).

Програмскиот код за ATtiny2313 може да изгледа вака:
. mp Timer0_compA rjmp Timer0_compB rjmp USI_START rjmp USI_OVERFLOW rjmp EE_READY rjmp WDT_ OVERFLOW

Како што можете да видите, векторот на прекин создава релативен скок до етикетите на програмата за прекини. Табелата подолу ги прикажува опциите; 1. Кога нема прекини; 2, 3. со надворешен прекин на влезот INT_1.
Ако етикетите се „празни“ (нема програма под етикетата), тогаш ништо не се случува, а програмата последователно „поминува“ низ преостанатите етикети и безбедно ја достигнува командата RETI- Враќање на прекини - излез од управувачот со прекиникако што е прикажано во првата колона од табелата.

За да извршите програма за прекин, на пример, на влезот INT_1, треба да ја отстраните ознаката INT_1: од списокот. Ова е шематски прикажано во втората колона од табелата.
Но, за програмерот е незгодно секој пат да ги пишува сите прекини и да ги одвои етикетите за нив, особено во најновите модели, каде табелата е доста голема; полесно е веднаш да се напише командата RETI во векторската линија за прекин ако прекин не се користи. Тогаш програмата ќе изгледа како што е прикажано во третата колона од табелата.

AVR контролерите, во зависност од моделот, може да имаат од 1 до 8 влезови надворешни прекини.
Да го разгледаме системот за управување со надворешни прекини. За таа цел, се обезбедени следните комбинации на I/O регистри во зависност од моделот (видете го соодветниот Data Sheet):
- GIMSK, EIFR, PCMSK, MCUCR;
- GIKR, GIFR, MCUCR;
- EIMSK, EICR, EIFR;
GIMSK, GIKR, EIMSK - маски за прекин,
EIFR, PCMSK, GIFR, EIFR – ознаки за прекин
За дозвола или забрана надворешни прекиниКонтролните регистри се наменети: GIMSK-(Генерален регистар за маски за прекини) (Tiny), GICR- (Генерален регистар за контрола на прекини) (Mega), MCUCR – (MCU контролен регистар)




EIFR- Регистар на знаменце за надворешен прекин: 1 - овозможено, 0 - оневозможено. Секој бит (знаме) дозволува соодветниот пин да дејствува како извор на прекин.

Контролни битови за регистрација на GIMSK:
Бит 7 – INT1: Барање за надворешен прекин 1 Овозможи – INT1 бит за овозможување прекин: 1 – овозможено, 0 – оневозможено. Прекинот ќе се генерира дури и ако пинот INT1 е конфигуриран како излез. INT1 битот е поставен да прекинува во регистарот со знаменце EIFR. Пинот INT1 е синхронизиран со генераторот на часовникот.

Бит 6 – INT0: Барање за надворешен прекин 0 Овозможи - бит за овозможување прекин INT0: 1 – овозможено, 0 – оневозможено. Прекинот ќе се генерира дури и ако пинот INT0 е конфигуриран како излез. Битот INT0 е поставен да прекинува во регистарот со знаменце EIFR. Пинот INT10 е синхронизиран со генераторот на часовникот.

Бит 5 - PCIE: Пин Промена на прекин Enable – бит за овозможување прекин на PCINT0…7 пинови: 1 – овозможено, 0 – оневозможено. Секоја промена на која било од пиновите PCINT0...7 ќе генерира прекин. Пиновите PCINT0...7 се конфигурирани за прекин поединечно, по битови во регистарот со знаменце PCMSK.

PCMSK- Регистратор за промена на маската на пиновите - регистер за знаме PCMSK: 1 - дозволено, 0 - оневозможено. Секој бит (знаме) дозволува соодветниот пин да дејствува како извор на прекин. Пиновите PCINT0...7 не се синхронизирани со генераторот на часовникот, т.е. се јавува прекин кога ќе дојде до промена на некој од пиновите.

Мега8

и соодветниот регистар на знаменце


Бит 7

Бит 6 – INT0: Барање за надворешен прекин 0 Овозможи - бит за овозможување прекин INT0: 1 – овозможено, 0 – оневозможено. Прекинот ќе се генерира дури и ако пинот INT0 е конфигуриран како излез. INT0 битот е поставен да прекинува во регистарот со знаменца GIFR



GIFR – Општ регистер за знаменце за прекин: 1 – овозможен, 0 – оневозможен. Секој бит (знаме) дозволува соодветниот пин да дејствува како извор на прекин.

Контролни битови за регистар на GICR:
Бит 7– : Барање за надворешен прекин 1 Овозможи – бит за овозможување прекин INT1: 1 – дозволено, 0 – забрането. Прекинот ќе се генерира дури и ако пинот INT1 е конфигуриран како излез. INT1 битот е поставен да прекинува во регистарот со знаменца GIFR

Бит 6 – INT0: Барање за надворешен прекин 0 Овозможи - бит за овозможување прекин INT0: 1 – дозволено, 0 – забрането. Прекинот ќе се генерира дури и ако пинот INT0 е конфигуриран како излез. INT0 битот е поставен да прекинува во регистарот со знаменца GIFR

Бит 5 – INT2: Барање за надворешен прекин 2 Овозможи - бит за овозможување прекини INT2: 1 – дозволено, 0 – забрането. Прекинот ќе се генерира дури и ако пинот INT2 е конфигуриран како излез. INT2 битот е поставен да прекинува во регистарот со знаменца GIFR

Функциите на влезовите INT0 и INT1 во сите контролери се контролирани од битовите од низок ред на регистарот MCUCR

MCUCR– Контролен регистар на MCU
Контролни битови:
Битови 1, 0 – ISC01, ISC00 (Контрола на сетилата за прекин 0 бит 1 и бит 0) – состојбата на овие битови го одредува настанот на пинот INT0, кој генерира INT0 прекин:
ISC01=0, ISC00=0 – логичко нулто ниво;
ISC01=0, ISC00=1 – секоја промена на логичката состојба;
ISC01=1, ISC00=0 – на раб што паѓа;
ISC01=1, ISC00=1 – на раб што расте.

Битови 3, 2 – ISC11, ISC10 (Контрола на сетилата за прекин 1 бит 1 и бит 0) – состојбата на овие битови го одредува нивото на сигналот на пинот INT1, кој го генерира прекинот INT1:
ISC11=0, ISC10=0 – логичко нулто ниво;
ISC11=0, ISC10=1 – секоја промена на логичката состојба;
ISC11=1, ISC10=0 – на раб што паѓа;
ISC11=1, ISC10=1 – на раб што расте.

Па, се чини дека разговаравме на минимум за надворешни прекини.
Јасно е дека за да функционираат прекините, треба соодветно да се регистрираат.
Ајде да ја додадеме иницијализацијата на прекинот на INT1 започната за мал на растечкиот раб на сигналот:

Ldi r16.0x80; напишете го во r16 бројот 0b10000000 ldi r17.0x0C ; напишете го во r17 бројот 0b00001100 надвор MCUCR,r17; прекинот ќе се генерира на растечкиот раб ISC11=1, ISC10=1 надвор GIMSK,r16 ; поставете ја маската INT0 sei
Патем, можете да генерирате прекин на tiny2313 на кој било PCINT0…7 пинови, на Мега до серијата 48 овие функции не се достапни...
Постојат операции за време на кои може да се појават прекини што може да предизвикаат паѓање на програмата. Во такви случаи, пред да започне операцијата пишуваме CLI, а по SEI. Ваквите операции се нарекуваат - атомски.
Пожелно е програмите за прекини да бидат компактни и да се извршуваат со максимална брзина, бидејќи целта на секој прекин е снимање на настан. Доколку според различни причинипрограмата работи бавно, доволно е да го снимите настанот и да го обработите малку подоцна.

За да не се натрупува презентираниот материјал со непотребни информации, препорачувам читателите да користат листови со податоци, а ако сè не е јасно, тогаш почесто поставувајте прашања на форумите.
Следно, детално ќе ги разгледаме внатрешните прекини врз основа на вградените тајмери. читателите. За да учествувате во гласањето, регистрирајте се и најавете се на страницата со вашето корисничко име и лозинка.

Една од предностите на микроконтролерот ATmega8 е неговиот широк опсег на различни прекини.

Прекиние настан по чиешто настанување се прекинува извршувањето на главната програма и се повикува функција која се справува со прекин од одреден тип.

Прекините се поделени на внатрешни и надворешни. Изворите на внатрешни прекини вклучуваат вградени модули за микроконтролер (тајмери, USART трансивер, итн.). Надворешните прекини се случуваат кога надворешните сигнали пристигнуваат до пиновите на микроконтролерот (на пример, сигналите на пиновите RESET и INT). Природата на сигналите кои водат до појава на прекин е поставена во контролниот регистар MCUCR, особено во битовите - ISC00 (бит 0) и ISC01 (бит 1) за влез INT 0; ISC10 (bit2) и ISC11 (bit3) за влез INT1.

Во микроконтролерот ATmega8, секој прекин има свој вектор на прекини(адреса на почетокот на програмската мемориска област во која е зачувана командата за прескокнување до наведената рутина за прекин). Во мега8, сите прекини имаат ист приоритет. Ако се случат неколку прекини истовремено, прво ќе се обработи прекинот со долниот векторски број.

Вектори на прекини во Atmega8

Адреса Прекини извор Опис
0x0000 РЕСЕТИРАЈ Сигнал за ресетирање
0x0001 ИНТ0 Барање за надворешен прекин на влезот INT0
0x0002 ИНТ1 Барање за надворешен прекин на влезот INT1
0x0003 T/C1 Снимање со тајмер T/C1
0x0004 T/C1 Натпревар T/C1 Тајмер Регистар за споредба А
0x0005 T/C1 Поврзете се со споредете го регистарот Б на тајмерот T/C1
0x0006 T/C1 T/C1 бројач прелевање
0x0007 T/C0 Прелевање на бројачот T/C0
0x0008 СПИ Преносот на податоци на SPI е завршен
0x0009 УАРТ Трансиверот UART заврши со примање податоци.
0x000A УАРТ Регистарот на податоци UART е празен
0x000B УАРТ Преносот на податоци со UART примопредавател е завршен
0x000C ANA_COMP Прекин од аналоген компаратор

Управување со прекини

4 регистри се одговорни за управување со прекини во ATmega8:

GIMSK(познато како GICR) - забрани/овозможува прекини врз основа на сигнали на влезовите INT0, INT1

GIFR- управување со сите надворешни прекини

ТИМСК, TIFR- управување со прекини од тајмери/бројачи

Регистрирајте се GIMSK (GICR)

INTFx=1: се случи прекин на влезот INTx. Кога влегувате во рутината за справување со прекини, INTFx автоматски се ресетира во состојба на евиденција. 0

Регистрирајте се ТИМСК

7 6 5 4 3 2 1 0
TOIE1
OCIE1A
OCIE1B
-
TICIE
-
TOIE0
-

TOIE1=1: Овозможен е прекин на прелевање T/C1

OCIE1A=1: прекин кога споредбениот регистар А се совпаѓа со содржината на овозможениот бројач T/C1

OCIE1B=1: прекин кога споредбениот регистар Б се совпаѓа со содржината на вклучен бројач T/C1

TICIE=1: прекинот е овозможен кога е исполнет условот за снимање

TOIE0=1: Овозможен е прекин на прелевање T/C0

Регистрирајте се TIFR

7 6 5 4 3 2 1 0
TOV1
OCF1A
OCF1B
-
ICF1
-
TOV0
-

TOV1=1: Се случи прелевање на T/C1

OCF1A=1: спореден регистар А се совпадна со дозволената содржина на бројачот T/C1

OCF1B=1: споредбениот регистар Б одговара на содржината на дозволеното бројач T/C1

МКФ=1: исполнети услови за фаќање

TOV0=1: Се случи прелевање на T/C0

Кога влегувате во потпрограмата за справување со прекини, знамето на регистарот TIFR што одговара на прекинот автоматски се ресетира во состојба на евиденција. 0

Прекините работат само кога општите прекини се овозможени во регистарот за статус SREG (бит 7 = 1). Кога ќе дојде до прекин, овој бит автоматски се ресетира на 0, оневозможувајќи ги последователните прекини.

Во овој пример, пинот INT0 е овозможен во режимот за внесување повлекување. Кога пинот е скратен до заземјувањето со помош на копче, на него се поставува логиката 0 (работ на сигналот паѓа од напонот на напојување на 0) и се активира управувачот со прекини, вклучувајќи ја сијалицата поврзана со нула пин на приклучокот Б

празнина ламбаON()
{
ПОРТБ.0=1;
DDRB.0=1;
}

прекини void ext_int0_isr(void)
{
lampON();
}

ДДРД.2=0;
PORTD.2=1;

SREG|= (1 додека (1) (

Примерот погоре, исто така, покажува како векторите за прекин се поставени во Code Vision AVR (interrupt void ext_int0_isr(void)). Векторите за прекин се поставени слично за други случаи:

EXT_INT0 2
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC 11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
TWI 18
SPM_READY 19

Дел AVR микроконтролеривклучува голем број на периферни уреди (ADC, Timer/Counters, EXTI, Analog Comparator, EEPROM, USART, SPI, I2C итн.), од кои секоја може да изврши одредени дејства на податоци/сигнали и други информации. Овие уреди се интегрирани во микроконтролерот за да се подобри ефикасноста на апликацијата и да се намалат трошоците кога се развиваат сите видови уреди базирани на микроконтролери AVR.

Процесорот комуницира/контролира периферни уреди преку В/И регистри, кои се наоѓаат во меморијата на податоци, овозможувајќи им да се користат како обични променливи. Секој уред има свои I/O регистри.

Сите В/И регистри може да се поделат во три групи: регистри на податоци, контролни регистри и регистри за статус.

Користејќи контролни регистри, уредот е конфигуриран да работи во еден или друг режим, со одредена фреквенција, точност итн., а со помош на регистри на податоци се чита резултатот од работата на овој уред(конверзија од аналогно во дигитално, примени податоци, вредност на тајмер/бројач итн.). Се чини дека тука нема ништо комплицирано (всушност, тука навистина нема ништо комплицирано :)), го вклучи уредот, го означи саканиот режим на работа, а потоа останува само да се исечат купоните, да се прочитаат готовите податоци и ги користат во пресметките. Целото прашање е „кога“ да се прочитаат токму овие податоци (дали уредот ја завршил својата работа или сè уште обработува податоци), бидејќи сите периферни уреди работат паралелно со јадрото на микроконтролерот, па дури и на различни фреквенции. Се поставува прашањето за спроведување комуникација и синхронизација помеѓу процесорот и периферен уред.

Како што веројатно веќе погодивте, за спроведување на комуникација и синхронизација помеѓу уредот и процесорот, се користат „регистри на статус“ кои ја складираат моменталната работна состојба на одреден уред. Секоја состојба во која може да се наоѓа уредот одговара на „бит во состојба на регистар“ (знаме), чија моментална вредност „зборува“ за моменталната состојба на овој уред или неговата индивидуална функција (работа е завршена/незавршена, грешка при обработката на податоците, регистарот празен итн.).

Механизмот за комуникација помеѓу процесорот и периферниот уред се имплементира со избирање знаме, кои се одговорни за одредена функција на овој уред. Во зависност од вредноста на одредено знаменце (состојба на уредот), можете да го промените текот на извршувањето на програмата (разгранување). На пример:

Проверка дали е поставено одредено знаменце (се случи некој настан):

ако (RegX & (1<< Flag) ) // ако е поставено знамето во регистарот RegX
{
// направи нешто
}

Се чека завршување на некоја акција (настан):

додека(!(RegX и (1<

Барањето знаменца е прилично интензивна задача за ресурси, и во однос на големината и брзината на програмата. Бидејќи вкупниот број на знамиња во микроконтролерите AVR е доста голем (предност), спроведувањето на комуникацијата помеѓу процесорот и уредот со избирачки знаменца доведува до намалување на ефикасноста (брзина на код / ​​големина на код) на програмата што ја пишувате, покрај тоа, програмата станува многу збунувачка, што придонесува за појава на грешки кои тешко се откриваат дури и со детално дебагирање на кодот.

Со цел да се зголеми ефикасноста на програмите за микроконтролери AVR, како и да се олесни процесот на креирање и дебагирање на овие програми, програмерите ги опремија сите периферни уреди со „извори на прекини“ ( Прекини извори), некои уреди може да имаат повеќе извори на прекини.

Користејќи извори на прекини, тој се спроведува механизам за синхронизација, помеѓу процесорот и периферниот уред, односно процесорот ќе почне да прима податоци, знаменца за гласање и други дејства на периферниот уред само кога уредот е подготвен за ова (ќе пријави завршување на обработката на податоците, грешка при обработка на податоци, регистарот е празен, итн.) итн.), со генерирање „барање за прекин“ ( Барање за прекин), во зависност од вредноста на некое знаменце (уред/функција/состојба на настан).

Во литературата, многу често, целиот синџир на настани, од „барање за прекин“ (IRQ) до „процедура за прекин на услугата“ (ISR), е скратено како прекин ( Прекини).

Што е прекин?


Прекинот е сигнал кој го известува процесорот за настанување на настан. Во овој случај, извршувањето на тековната секвенца на команди е суспендирано и контролата се пренесува на процедурата за справување со прекини што одговара на овој настан, по што извршувањето на кодот продолжува точно од точката каде што бил прекинат (враќање на контролата). (Вики)

Прекинете ја рутината(Interrupt Service Routine) не е ништо повеќе од функција/потпрограма што треба да се изврши кога ќе се случи одреден настан. Ќе го користиме зборот „процедура“ за да ја нагласиме неговата разлика од сите други функции.

Главната разлика помеѓу процедурата и едноставните функции е тоа што наместо вообичаеното „враќање од функција“ (наредба за склопување RET), треба да користите „враќање од прекин“ (наредба на асемблер RETI) - " ВРАЌАЊЕ од Прекини".

Својства на прекин на AVR:

  • Секој периферен уред кој е дел од AVR микроконтролерите има најмалку еден извор на прекин. Меѓу сите овие прекини, треба да се вклучи и прекинот за ресетирање, чија цел е различна од сите други.
  • Секој прекин има строго доделен вектор (врска) што укажува на рутината на услугата Interrupt. Сите вектори на прекини се наоѓаат на самиот почеток на програмската меморија и заедно ја формираат „табела со вектори на прекини“.
  • Секој прекин е поврзан со специфичен „Бит за овозможување на прекини“ Така, за да користите одреден прекин, треба да напишете во неговиот „бит за овозможување прекини“ - дневник. единица. Понатаму, без разлика дали сте овозможиле одредени прекини или не, микроконтролерот нема да започне со обработка на овие прекини додека не се напише логичен во „битот за овозможување на глобален прекин“ во статусниот регистар SREG. Исто така, за да се оневозможат сите прекини (за неодредено време), треба да се запише логичка нула на бит за овозможување на општиот прекин.

Прекинот на Ресетирање, за разлика од сите други, не може да се оневозможи. Ваквите прекини се нарекуваат и прекини кои не можат да се маскираат.

  • Секој прекин има строго дефиниран приоритет. Приоритетот на прекинот зависи од неговата локација во „табелата за вектор на прекини“. Колку е помал векторскиот број во табелата, толку е поголем приоритетот на прекинот. Односно, највисок приоритет е прекинот за ресетирање, кој се наоѓа прво во табелата, и соодветно во мемориските програми Надворешниот прекин INT0, следејќи го прекинот Reset во „табелата за вектор на прекини“, има приоритет помал од оној на Reset, но повисок од оној на сите други прекини итн.

Векторската табела за прекини, освен векторот Reset, може да се премести на почетокот на делот Boot во Flash меморијата со поставување на битот IVSEL во GICR регистарот. Векторот за ресетирање, исто така, може да се премести на почетокот на делот за подигање на Flash меморијата со програмирање на осигурувачот - BOOTRST.



Сл.1 Векторска табела за прекини ATmega16

Прекинете го рутинскиот прототип


За да декларирате функција како рутина за ракување со прекини, мора да следите одредени правила за прототипирање за да може компајлерот/поврзувачот правилно да го идентификува и да го поврзе прекинот што ви треба со неговата рутина за ракување.

Прво, рутината на услугата за прекин не може да прифати ништо како аргумент (void), а исто така не може да врати ништо (void). Ова се должи на фактот што сите прекини во AVR се асинхрони, па не се знае каде ќе биде прекинато извршувањето на програмата, од кого да се добие и кому да се врати вредноста, а исто така да се минимизира времето на внесување и излез од прекинот.

празнина isr (празнина)

Второ, пред прототипот на функцијата, треба да наведете дека се работи за процедура за справување со прекини. Како што знаете, во јазикот C се извршува само кодот што се користи во главната функција. Бидејќи процедурата за справување со прекини во главната функција не се користи никаде, така што компајлерот не ја „исфрла“ како непотребна, пред прототипот на процедурата треба да се означи дека оваа функција е процедура за справување со прекини.

Прототип на процедура за справување со прекини во околината AVR Studio

#вклучи

ISR (XXX_vect)
{

}

Во AVR Studio (AVR GCC), секоја рутина за прекин започнува со макро дефиниција ISR, проследена со следнава конструкција во загради:

XXX_vect

каде што „XXX“ е името на векторот на прекини. Сите векторски имиња за специфичен AVR микроконтролер може да се најдат во „табелата за вектор на прекини“ на листот со податоци на микроконтролерот или во датотеката со заглавие. На пример, „табела за вектор на прекини“ за микроконтролерот ATmega16 е прикажана на слика 1, каде што во колоната Извор се наведени сите имиња на вектори на прекини. Имињата може да се најдат и во заглавието на овој микроконтролер (C :\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\avr\iom16.h), види слика 2. Сè што треба да направиме е да го најдеме името на векторот што ни треба во табелата и да ја додадеме наставката „_vect“ кон него.


Сл.2 ATmega16 заглавие датотека за AVR Studio

На пример, да напишеме процедура за ракување со прекини за примање бајт преку USART (USART, Rx Complete):

ISR (USART_RXC_vect)
{
// Телото на управувачот со прекини
}

Патем: пред да користите било каков прекин во AVR Studio, треба да ги вклучите датотеките за заглавие io.h и interrupt.h во проектот:

#вклучи
#вклучи

Можете да прочитате повеќе за ракувачите со прекини во AVR Studio (AVR GCC) во делот Вовед во ракување со прекини на avr-libc.

Прототип на процедура за справување со прекини во околината ImageCraft

#pragma interrupt_handler : iv_XXX
празнина< handler_name>(празнина)
{
// Телото на управувачот со прекини
}

Во околината ImageCraft, рутината за прекин на прототипот изгледа вака:

празнина< handler_name>(празнина)

Каде , ова е кое било име што сакате да го дадете на овој управувач со прекини. Едно од барањата за декларирање на процедури за ракување со прекини е дека пред прототипот на функцијата треба да се означи дека е управувач со прекини. Ова е направено со помош на прагма директива interrupt_handler :

#pragma interrupt_handler : iv_XXX

Каде ова е името на функцијата што ќе се користи како управувач со прекини, а конструкцијата „iv_XXX“ е името на векторот на прекини (XXX) со префиксот „iv_“. Како и во случајот со AVR Studio, сите имиња на вектори за специфичен AVR микроконтролер може да се најде во „табелата за вектор на прекини“ на листот со податоци на даден микроконтролер или во неговата датотека за заглавие (види Сл. 3).


Сл.3 ATmega16 заглавие датотека за ImageCraft IDE

На пример, постапката за справување со прекин за примање бајт преку USART (USART, Rx Complete) во околината ImageCraft ќе изгледа вака:

#pragma interrupt_handler usart_rxc_isr: iv_USART_RXC
void usart_rxc_isr(празнина)
{
// Телото на управувачот со прекини
}

Повеќе информации за процедурите за справување со прекини во ImageCraft IDE може да се најдат во менито Help->Programming the AVR->Interrupt Handlers на околината за развој.

Понекогаш, ако неколку ракувачи со прекини треба да го направат истото, тогаш за да ја зачувате програмската меморија, можете да насочите неколку вектори на прекини на истата рутина на прекини.

Во AVR Studio изгледа вака:

ISR (INT0_vect)
{
// Направи нешто
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect) );

Прво доаѓа процедурата за обработка на прекини за специфичен вектор, во овој случај INT0. Сите други процедури може да се однесуваат на кој било управувач со прекини користејќи ја конструкцијата:

ISR (YYY_vect, ISR_ALIASOF(XXX_vect) );

каде што YYY е името на векторот на прекин кој се однесува на претходно декларираниот управувач со прекини за векторот XXX.

Во ImageCraft изгледа вака:

#pragma interrupt_handler : iv_XXX : iv_YYY
празнина< handler_name>(празнина)
{
// Телото на управувачот со прекини
}

#pragma interrupt_handler : iv_XXX
#pragma interrupt_handler : iv_YYY
празнина< handler_name>(празнина)
{
// Телото на управувачот со прекини
}

каде што векторите XXX и YYY се однесуваат на истиот управувач со прекини .

Како функционира прекинот во AVR микроконтролерите?

1. Да претпоставиме дека „ барање за прекин“ (IRQ).

Патем: ако се случат неколку барања за обработка на прекини истовремено, прво ќе се обработи прекинот со највисок приоритет, а сите други барања ќе се обработат по завршувањето на прекинот со висок приоритет.

2. Испитување.

Ако битот за овозможување за овој прекин е поставен (бит за овозможување прекин), и е поставен I-бит (бит за овозможување општ прекин) на регистарот за статус на процесорот (SREG), тогаш процесорот започнува да ја подготвува рутината за услугата за прекин, додека општата битот за овозможување прекини (I-бит од регистарот SREG) се ресетира, со што се оневозможуваат сите други прекини. Ова се случува така што ниту еден друг настан не може да ја прекине обработката на тековниот прекин.

Патем: ако во процедурата за справување со прекини го поставите I-bit во состојба на евиденција. единици, тогаш секој активиран прекин може за возврат да ја прекине обработката на тековниот прекин. Ваквите прекини се нарекуваат вгнездени прекини.

3. Подготовка.

Процесорот го завршува извршувањето на тековната инструкција за склопување, а потоа ја става адресата на следната инструкција на стекот (PC->STACK). Следно, процесорот проверува кој извор на прекин има поднесено „барање за прекин“ (IRQ), по што, користејќи го векторот на овој извор (врска) од векторската табела (која е цврсто доделена на секој извор на прекин), продолжува кон процедура за обработка на прекини (JMP инструкција). Тоа е тоа, процесорот троши најмалку 4 такт циклуси (во зависност од моментот на појавување на барањето и времетраењето на извршувањето на тековната инструкција). Ова е многу добро време на одговор на IRQ, во споредба со микроконтролери од други производители.

Патем, ако се појави IRQ додека микроконтролерот е во режим на мирување, времето на одговор на IRQ се зголемува за уште четири циклуси на часовникот, плус времето зачувано во битовите за осигурувачи SUT1 и SUT0 (Време на стартување).

Прекин - настан кој бара итен одговор од процесорот. Одговорот е дека процесорот ја прекинува обработката на тековната програма ( прекината програма) и продолжува со извршување на некоја друга програма ( програма за прекинување), специјално дизајниран за овој настан. По завршувањето на оваа програма, процесорот се враќа на извршување на прекинатата програма.

Секој настан за кој е потребен прекин е придружен со сигнал за прекин, известувајќи го компјутерот за ова и повикан барање за прекин.

Статус на програматапретставува збир на состојби на сите елементи за складирање во соодветната временска точка (на пример, откако е извршена последната команда). Кога ќе дојде до прекин, микроконтролерот ја складира содржината на програмскиот бројач на стекот и ја вчитува адресата на соодветниот вектор за прекин во него. Последната команда од рутината на услугата за прекин мора да биде команда што се враќа во главната програма и го враќа претходно зачуваниот бројач на програмата. Додека управувачот со прекини се извршува, некои информации може да се променат. Затоа, кога се префрлате на управувачот со прекини, неопходно е да се зачуваат елементите што се менуваат. Множеството на такви елементи е вектор на програмска состојба. Во овој случај, другите информации за состојбата на мемориските ќелии не се значајни или може да се обноват програмски.

Вектор почетна состојба ги содржи сите потребни информации за првичното стартување на програмата. Во многу случаи, векторот на почетната состојба содржи само еден елемент - почетната адреса на програмата што се стартува.

Вектор на прекиние векторот на почетната состојба на програмата за прекинување (ракувач) и ги содржи сите потребни информации за преместување до управувачот, вклучувајќи ја и неговата почетна адреса. Секој тип на прекин има свој вектор за прекин, кој го иницира извршувањето на соодветниот управувач. Вообичаено, векторите на прекини се складираат во специјално распределени фиксни мемориски локации со кратки адреси, кои претставуваат прекини векторска табела. За да скокне до соодветната програма за прекини, процесорот мора да има вектор за прекин и адресата на овој вектор. На оваа адреса, по правило, има команда за безусловен скок до потпрограмата за справување со прекини.

Како по правило, контролата за складирање и враќање е доделена на управувачот со прекини. Во овој случај, управувачот се состои од три дела - подготвителен (пролог) и конечен (епилог), кои обезбедуваат префрлување на програмата и вистинската програма за прекинување, која ги извршува операциите што ги бара барањето. Времето на одговор е дефинирано како временски интервал од моментот кога е примено барањето за прекин до почетокот на извршувањето на програмата за прекинување.


tp– време на одговор на системот до прекин;
т з– време за зачувување на состојбата на прекинатата програма;
t ppr– време на вистинската програма за прекинување;
т во– време за враќање на состојбата на прекинатата програма

Доколку има повеќе извори на барања, мора да се воспостави одреден редослед на сервисирање на дојдовните барања, повикани приоритетни односиили услужна дисциплина. Множеството од сите можни типови на прекини на процесорот е систем за прекинимикроконтролер. Услужната дисциплина одредува кое од неколкуте барања примени истовремено прво треба да се обработи и дали ова барањепрекини еден или друг управувач со прекини.
Ако се прими барање за прекин со повисок приоритет додека се обработува прекинот, контролата се пренесува на управувачот со повисок приоритет и управувачот со прекини со понизок приоритет е суспендиран. Се јавува прекини гнездење. Се нарекува максималниот број на програми кои можат да се суспендираат една со друга длабочина на прекини.

Ако барањето за прекин не се сервисира до моментот кога пристигнува ново барање од истиот извор (ист приоритет), тогаш прекине заситеноста на системот. Во овој случај, дел од барањата за прекин ќе се изгубат, што за нормално функционирањемикроконтролерот не е дозволен.

Карактеристики на системот за прекинисе:

  • вкупен број барања за прекин број на извори на барања за прекин;
  • тип на претстава за прекин - по правило, барањето за прекин е претставено со логично ниво на сигнал;
  • приоритет на прекин – го одредува редоследот по кој се обработува секое барање за прекин; колку е поголем приоритетот, толку е пократко доцнењето во извршувањето на програмата за прекинување за него;
  • време на одговор – временскиот интервал помеѓу појавувањето на барањето за прекин и почетокот на извршувањето на програмата за прекинување;
  • доцнење на прекин – определено од вкупното време за складирање и враќање на програмата;
  • длабочина, обично се совпаѓа со бројот на приоритетни нивоа во системот за прекини;
  • прекини заситеноста на системот;
  • дозволени моменти на прекин на програмата (обично крајот на извршувањето на следната команда).

Прекини маскирањесе користи за да му каже на микроконтролерот да одговори на секој тип на прекин или да го игнорира. Маската за прекин претставува бинарен код чии битови се доделени на изворите на барањето за прекин. Еден бит во бинарниот код му кажува на микроконтролерот да се справи со овој тип на прекин. Нулта бит, напротив, не дозволува микроконтролерот да продолжи со обработка на прекини од наведениот тип.
Како по правило, покрај маскирањето на прекините, постои и бит за овозможување на глобален прекин, чија нулта вредност ги оневозможува сите управувачи со прекини (освен за хардверско ресетирање и скок на почетокот на програмата за извршување).
Покрај бинарниот код за маска за прекин, постои и бинарен код прекини знамиња, што му овозможува на управувачот со прекини да го постави изворот на прекинот ако има неколку извори со наведеното барање во микроконтролерот.




Врв