Pertraukimas AVR valdiklyje „Atmel AVR Studio“. Mokymo kursai. Pertraukimo samprata. Suteikiame balsą mikrovaldikliui _______________________________ Pertraukimas ___________________________

AVR mikrovaldikliai apima daugybę išorinių įrenginių (ADC, Timer/Counters, EXTI, Analog Comparator, EEPROM, USART, SPI, I2C ir kt.), kurių kiekvienas gali atlikti tam tikrus veiksmus su duomenimis/signalais ir kita informacija. Šie įrenginiai yra integruoti į mikrovaldiklį, siekiant pagerinti taikymo efektyvumą ir sumažinti išlaidas kuriant visų tipų įrenginius, pagrįstus AVR mikrovaldikliais.

Procesorius bendrauja / valdo periferinius įrenginius per įvesties / išvesties registrus, esančius duomenų atmintyje, todėl juos galima naudoti kaip įprastus kintamuosius. Kiekvienas įrenginys turi savo I/O registrus.

Visus I/O registrus galima suskirstyti į tris grupes: duomenų registrus, valdymo registrus ir būsenos registrus.

Naudojant valdymo registrus įrenginys sukonfigūruojamas veikti vienu ar kitu režimu, tam tikru dažniu, tikslumu ir pan., o naudojant Duomenų registrus nuskaitomas šio įrenginio veikimo rezultatas (analoginis konvertavimas į skaitmeninį, gaunamas). duomenis, laikmačio / skaitiklio vertę ir pan.). Atrodytų, nieko čia sudėtingo (tiesą sakant, čia tikrai nėra nieko sudėtingo :)), įjungė įrenginį, nurodė norimą darbo režimą, o tada belieka karpyti kuponus, perskaityti paruoštus duomenis ir naudoti juos skaičiavimuose. Visas klausimas yra „kada“ skaityti būtent šiuos duomenis (ar įrenginys baigė savo darbą ar vis dar apdoroja duomenis), nes visi periferiniai įrenginiai veikia lygiagrečiai su mikrovaldiklio šerdimi ir netgi skirtingais dažniais. Kyla klausimas dėl komunikacijos diegimo ir sinchronizavimas tarp procesoriaus ir išorinių įrenginių.

Kaip tikriausiai jau spėjote, ryšiui ir sinchronizavimui tarp įrenginio ir procesoriaus įgyvendinti naudojami „Būsenos registrai“, kuriuose saugoma esama konkretaus įrenginio veikimo būsena. Kiekviena būsena, kurioje įrenginys gali būti, atitinka „bitą“. registro būsenoje“ (vėliava), kurios esama reikšmė „kalba“ apie esamą šio įrenginio būseną ar atskirą jo funkciją (darbas atliktas/nebaigtas, klaida apdorojant duomenis, registras tuščias ir pan.).

Ryšio mechanizmas tarp procesoriaus ir išorinio įrenginio yra įgyvendinamas vėliavėlių apklausa, kuri yra atsakinga už tam tikrą šio įrenginio funkciją. Priklausomai nuo konkrečios vėliavėlės reikšmės (įrenginio būsenos), galite keisti programos vykdymo eigą (išsišakojimą). Pvz.:

Tikrinama, ar nustatyta tam tikra vėliavėlė (įvyko koks nors įvykis):

if (RegX & (1<< Flag) ) // jei nustatyta vėliavėlė RegX registre
{
// ką nors padaryti
}

Laukiama, kol bus baigtas koks nors veiksmas (įvykis):

while(!(RegX & (1<

Užklausos vėliavėlės yra gana daug išteklių reikalaujanti užduotis tiek programos dydžio, tiek programos greičio atžvilgiu. Kadangi bendras vėliavėlių skaičius AVR mikrovaldikliuose yra gana didelis (privalumas), ryšio tarp procesoriaus ir įrenginio įgyvendinimas užklausant vėliavėles sumažina jūsų rašomos programos efektyvumą (kodo greitį / kodo dydį), be to, programa tampa labai paini, o tai prisideda prie klaidų, kurias sunku aptikti net ir atliekant išsamų kodo derinimą.

Siekdami padidinti AVR mikrovaldiklių programų efektyvumą, taip pat palengvinti šių programų kūrimo ir derinimo procesą, kūrėjai visus išorinius įrenginius aprūpino „pertraukimo šaltiniais“ ( Pertraukimo šaltiniai), kai kuriuose įrenginiuose gali būti keli pertraukimo šaltiniai.

Naudojant pertraukimo šaltinius, jis įgyvendinamas sinchronizacijos mechanizmas, tarp procesoriaus ir išorinio įrenginio, tai yra, procesorius pradės priimti duomenis, užklausų vėliavėles ir kitus veiksmus periferiniame įrenginyje tik tada, kai įrenginys bus tam pasirengęs (praneš apie duomenų apdorojimo pabaigą, klaidą duomenų apdorojimas, registras tuščias ir pan.) ir pan.), generuojant „pertraukti prašymą“ ( Pertraukimo užklausa), priklausomai nuo kokios nors vėliavėlės reikšmės (įrenginio/funkcijos/įvykio būsenos).

Literatūroje labai dažnai visa įvykių grandinė nuo „pertraukimo užklausos“ (IRQ) iki „pertraukimo paslaugos procedūros“ (ISR) trumpinama kaip pertraukimas. Pertraukite).

Kas yra pertraukimas?


Pertraukimas yra signalas, pranešantis procesoriui apie įvykį. Šiuo atveju esamos komandų sekos vykdymas sustabdomas ir valdymas perkeliamas į šį įvykį atitinkančią pertraukimų tvarkymo procedūrą, po kurios kodo vykdymas tęsiamas tiksliai nuo tos vietos, kur buvo nutrauktas (valdymo grąžinimas). (Wiki)

Pertraukite rutiną(Tarnybos nutraukimo rutina) yra ne kas kita, kaip funkcija / paprogramė, kuri turėtų būti vykdoma įvykus tam tikram įvykiui. Žodį „procedūra“ naudosime norėdami pabrėžti jo skirtumą nuo visų kitų funkcijų.

Pagrindinis skirtumas tarp procedūros ir paprastų funkcijų yra tas, kad vietoj įprastos „grįžimo iš funkcijos“ (surinkimo komanda RET), turėtumėte naudoti „grįžti iš pertraukimo“ (surinkimo komanda RETI) - " Grįžti iš pertraukimo".

AVR pertraukimo savybės:

  • Kiekvienas periferinis įrenginys, kuris yra AVR mikrovaldiklių dalis, turi bent vieną pertraukimo šaltinį. Tarp visų šių pertraukimų reikėtų įtraukti ir atstatymo pertraukimą, kurio paskirtis skiriasi nuo visų kitų.
  • Kiekvienas pertraukimas turi griežtai priskirtą vektorių (nuorodą), nukreipiantį į pertraukimo tarnybos rutiną. Visi pertraukimo vektoriai yra pačioje programos atminties pradžioje ir kartu sudaro „pertraukimų vektorių lentelę“.
  • Kiekvienas pertraukimas yra susietas su konkrečiu „Interrupt Enable bit“, todėl norėdami naudoti konkretų pertraukimą, turite įrašyti į jo „Interrupt Enable bit“ - žurnalą. vienetas. Be to, nepaisant to, ar įjungėte tam tikrus pertraukimus, ar ne, mikrovaldiklis nepradės šių pertraukimų apdoroti tol, kol SREG būsenos registre į „Global Interrupt Enable bit“ nebus įrašytas loginis. neapibrėžtą laiką), loginis nulis turėtų būti įrašytas į bendrąjį pertraukimo įjungimo bitą.

Pertrauktis iš naujo, skirtingai nei visi kiti, negali būti išjungta. Tokie pertraukimai dar vadinami nemaskuojamaisiais pertraukimais.

  • Kiekvienas pertraukimas turi griežtai apibrėžtą prioritetą. Pertraukimo prioritetas priklauso nuo jo vietos „pertraukimo vektorių lentelėje“. Kuo mažesnis vektoriaus skaičius lentelėje, tuo didesnis pertraukimo prioritetas. Tai yra, didžiausias prioritetas yra atstatymo pertraukimas, kuris yra pirmas lentelėje, ir atitinkamai atminties programose.Išorinis pertraukimas INT0, einantis po Reset pertraukimo „pertraukimo vektorių lentelėje“, turi žemesnį prioritetą nei Reset, bet aukštesnį nei visų kitų pertraukimų ir t.t.

Pertraukimo vektorių lentelę, išskyrus vektorių Reset, galima perkelti į Flash atminties įkrovos skyriaus pradžią, nustatant IVSEL bitą GICR registre. Atstatymo vektorių taip pat galima perkelti į „Flash“ atminties įkrovos skyriaus pradžią, užprogramavus saugiklio bitą – BOOTRST.



Fig.1 ATmega16 pertraukimo vektorių lentelė

Nutraukti įprastą prototipą


Norėdami paskelbti funkciją kaip pertraukimo apdorojimo tvarką, turite laikytis tam tikrų prototipų kūrimo taisyklių, kad kompiliatorius / susiejimo priemonė galėtų teisingai identifikuoti ir susieti jums reikalingą pertraukimą su savo tvarkymo rutina.

Pirma, paslaugų nutraukimo rutina negali nieko priimti kaip argumento (negalioja), taip pat nieko negali grąžinti (negalioja). Taip yra dėl to, kad visi pertraukimai AVR yra asinchroniniai, todėl nėra žinoma, kur bus nutrauktas programos vykdymas, iš ko gauti ir kam grąžinti vertę, taip pat sumažinti įėjimo laiką ir išeiti iš pertraukos.

negalioja isr (tuščia)

Antra, prieš funkcijos prototipą turėtumėte nurodyti, kad tai yra pertraukimo tvarkymo procedūra. Kaip žinote, C kalba vykdomas tik pagrindinėje funkcijoje naudojamas kodas. Kadangi pagrindinėje funkcijoje pertraukimų tvarkymo procedūra niekur nenaudojama, kad kompiliatorius jos „neišmestų“ kaip nereikalingą, prieš procedūros prototipą reikia nurodyti, kad ši funkcija yra pertraukimų tvarkymo procedūra.

Pertraukimų valdymo procedūros AVR Studio aplinkoje prototipas

#įtraukti

ISR (XXX_vect)
{

}

AVR Studio (AVR GCC) kiekviena pertraukimo tvarka prasideda ISR makrokomandos apibrėžimu, po kurio skliausteliuose pateikiama tokia konstrukcija:

XXX_vect

kur „XXX“ yra pertraukimo vektoriaus pavadinimas.Visus konkretaus AVR mikrovaldiklio vektorių pavadinimus galima rasti mikrovaldiklio duomenų lapo „pertraukimo vektorių lentelėje“ arba jo antraštės faile. Pavyzdžiui, ATmega16 mikrovaldiklio „pertraukimo vektorių lentelė“ parodyta 1 pav., kur šaltinio stulpelyje surašyti visi pertraukimo vektorių pavadinimai.Pavadinimus taip pat galima rasti šio mikrovaldiklio antraštės faile (C :\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\avr\iom16.h), žr. 2 pav. Viskas, ką mums reikia padaryti, tai rasti lentelėje mums reikalingo vektoriaus pavadinimą ir pridėti priesagą „_vec“ prie jo.


2 pav. ATmega16 antraštės failas, skirtas AVR Studio

Pavyzdžiui, parašykime pertraukimų apdorojimo procedūrą, skirtą baitui gauti per USART (USART, Rx Complete):

ISR (USART_RXC_vect)
{
// Pertraukimo tvarkyklės korpusas
}

Beje: prieš naudodami bet kokį pertraukimą AVR Studio, į projektą turėtumėte įtraukti antraščių failus io.h ir interrupt.h:

#įtraukti
#įtraukti

Daugiau apie pertraukimų tvarkykles galite perskaityti AVR Studio (AVR GCC) skyriuje Įvadas į avr-libc pertraukimų apdorojimą.

Pertraukimų apdorojimo procedūros ImageCraft aplinkoje prototipas

#pragma interrupt_handler : iv_XXX
tuštuma< handler_name>(tuštuma)
{
// Pertraukimo tvarkyklės korpusas
}

„ImageCraft“ aplinkoje prototipo pertraukimo rutina atrodo taip:

tuštuma< handler_name>(tuštuma)

Kur , tai yra koks nors pavadinimas, kurį norite suteikti šiai pertraukimų tvarkyklei. Vienas iš reikalavimų deklaruojant pertraukimų tvarkymo procedūras yra tai, kad prieš funkcijos prototipą turi būti nurodyta, kad tai yra pertraukimų tvarkytuvas. Tai atliekama naudojant pragma direktyvą pertraukimo_tvarkytojas :

#pragma interrupt_handler : iv_XXX

Kur tai funkcijos, kuri bus naudojama kaip pertraukimų tvarkytoja, pavadinimas, o konstrukcija „iv_XXX“ yra pertraukimo vektoriaus (XXX) su priešdėliu „iv_“ pavadinimas. Kaip ir AVR Studio atveju, visi vektorių pavadinimai konkrečiam AVR mikrovaldikliui galima rasti tam tikro mikrovaldiklio duomenų lapo "pertraukimo vektorių lentelėje" arba jo antraštės faile (žr. 3 pav.).


3 pav. ATmega16 antraštės failas, skirtas ImageCraft IDE

Pavyzdžiui, baito gavimo per USART (USART, Rx Complete) pertraukimo apdorojimo procedūra ImageCraft aplinkoje atrodys taip:

#pragma interrupt_handler usart_rxc_isr: iv_USART_RXC
void usart_rxc_isr(void)
{
// Pertraukimo tvarkyklės korpusas
}

Daugiau informacijos apie pertraukimų apdorojimo procedūras ImageCraft IDE rasite kūrimo aplinkos meniu Žinynas->AVR programavimas->Interrupt Handlers.

Kartais, jei keli pertraukimų tvarkytojai turi atlikti tą patį veiksmą, norėdami išsaugoti programos atmintį, galite nukreipti kelis pertraukimų vektorius į tą pačią pertraukimo tvarką.

AVR studijoje tai atrodo taip:

ISR (INT0_vect)
{
// Daryk ką nors
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect) );

Pirmiausia atliekama konkretaus vektoriaus, šiuo atveju INT0, pertraukimo apdorojimo procedūra. Visos kitos procedūros gali būti susijusios su bet kokiu pertraukimų tvarkytuvu, naudojančiu konstrukciją:

ISR (YYY_vect, ISR_ALIASOF(XXX_vect) ) ;

kur YYY yra pertraukimo vektoriaus, nurodančio anksčiau deklaruotą vektoriaus XXX pertraukimo tvarkytuvą, pavadinimas.

„ImageCraft“ tai atrodo taip:

#pragma interrupt_handler : iv_XXX : iv_YYY
tuštuma< handler_name>(tuštuma)
{
// Pertraukimo tvarkyklės korpusas
}

#pragma interrupt_handler : iv_XXX
#pragma interrupt_handler : iv_YYY
tuštuma< handler_name>(tuštuma)
{
// Pertraukimo tvarkyklės korpusas
}

kur vektoriai XXX ir YYY nurodo tą patį pertraukimų tvarkytuvą .

Kaip pertraukimas veikia AVR mikrovaldikliuose?

1. Tarkime, kad " pertraukimo prašymas“(IRQ).

Beje: jei vienu metu pateikiami keli prašymai dėl pertraukimo apdorojimo, pirmiausia bus apdorojamas didžiausio prioriteto pertraukimas, visos kitos užklausos bus apdorojamos pasibaigus aukšto prioriteto pertraukimui.

2. Apžiūra.

Jei nustatytas šio pertraukimo įjungimo bitas (pertraukimo įjungimo bitas) ir nustatytas procesoriaus būsenos registro (SREG) I bitas (bendras pertraukimo įgalinimo bitas), procesorius pradeda ruošti pertraukimo tarnybos rutiną, o bendrasis pertraukimo įgalinimo bitas (registro SREG I bitas) nustatomas iš naujo, taip išjungiant visus kitus pertraukimus. Taip nutinka taip, kad joks kitas įvykis negalėtų nutraukti esamo pertraukimo apdorojimo.

Beje: jei pertraukimų tvarkymo procedūroje I bitą nustatote į žurnalo būseną. vienetų, bet koks aktyvuotas pertraukimas savo ruožtu gali nutraukti esamo pertraukimo apdorojimą. Tokie pertraukimai vadinami įdėtaisiais pertraukimais.

3. Paruošimas.

Procesorius užbaigia dabartinės surinkimo instrukcijos vykdymą ir įkelia kitos komandos adresą į krūvą (PC->STACK). Tada procesorius patikrina, kuris pertraukimo šaltinis pateikė „pertraukimo užklausą“ (IRQ), po to, naudodamas šio šaltinio (nuorodos) vektorių iš vektorių lentelės (kuri yra tvirtai priskirta kiekvienam pertraukimo šaltiniui), pereina į pertraukimo apdorojimo procedura (JMP instrukcija).Tai va, procesorius praleidžia bent 4 laikrodžio ciklus (priklausomai nuo užklausos atsiradimo momento ir esamos komandos vykdymo trukmės).Tai labai geras atsako laikas į IRQ, lyginant su kitų gamintojų mikrovaldikliai.

Beje: jei IRQ atsiranda, kai mikrovaldiklis veikia miego režimu, atsako į IRQ laikas padidėja dar keturiais laikrodžio ciklais, pridėjus laiką, saugomą saugiklių bituose SUT1 ir SUT0 (Start-Up Time).

Stackas yra atminties sritis, kurią CPU naudoja grąžinimo adresams iš paprogramių saugoti ir atkurti.
Beveik visi AVR mikrovaldikliai turi SRAM krūvą. Norint adresuoti esamą elementą (dėklo viršuje), naudojamas dėklo rodyklė SP (Stack Pointer). Tai vieno baito RVV SPL modeliams, kurių duomenų atminties talpa iki 256 baitų, arba dviejų baitų SPH:SPL (SPH – didelis baitas, SPL – mažas baitas).

Kai mikroprocesorius susiduria su viena iš iškvietimo instrukcijų rcall/call/ecall/icall/eicall, kito žodžio adresas programos atmintyje nukopijuojamas į krūvą techninės įrangos. Kai komanda ret išeina iš paprogramės, grąžinimo adresas atkuriamas iš kamino į programos skaitiklį. Modeliuose, kurių programos atminties talpa yra 128 ir 256 kwords, norint išsaugoti kompiuterį krūvoje, reikės 3 baitų, visiems kitiems - 2 baitų. Išsaugant kiekvieną baitą, SP turinys sumažinamas vienu, o atstačius atitinkamai padidinamas.

9 pav. Krūvos vieta duomenų atmintyje

Programuotojas turi savarankiškai nustatyti kamino vietą pačioje programos pradžioje. Didžiausio gylio požiūriu krūvos viršus turėtų būti pačiame SRAM gale, kaip parodyta 9 pav.:

Įtraukti "m8def.inc" ldi temp,low (RAMEND) ;nustatyti SP = RAMEND out SPL,temp ;skirta ATmega8 SP = 0x045F ldi temp,aukšta (RAMEND) iš SPH,temp

RAMEND konstanta iš standartinio m8def.inc antraštės failo turi paskutinio SRAM langelio adreso reikšmę.

Taikomosios programos kintamieji yra SRAM adresų diapazone tarp RBB ir dabartinės SP padėties. Todėl labai svarbu pirmiausia įvertinti maksimalų krūvos dydį (rietuvės gylį). Gali atsitikti taip, kad kamino viršus pakyla per aukštai ir pradeda „perrašyti“ vartotojo duomenis, ir tai yra viena sunkiausiai aptinkamų klaidų!

AVR kaminas, be grąžinimo adresų saugojimo, turi dar vieną labai svarbų tikslą. Tai leidžia išsaugoti bet kokius duomenis naudojant specialiai šiam tikslui sukurtas komandas push Rr (įkelti į steką) ir pop Rd (iškrauti iš kamino). Kiekvieną kartą, kai vykdomas paspaudimas Rr, Rr turinys nukopijuojamas į krūvą, o po to SP sumažinamas vienu. Kai vykdomas pop Rr, dėklo langelio, į kurį nurodė SP, turinys atkuriamas į Rr, o paties SP reikšmė padidinama. Tokio tipo kamino struktūra „Last In First Out“: registras, išsaugotas paskutine „push“ komanda, bus atkurtas pirmąja pop komanda:

; SP Stack lygis po stūmimo komandos R16 ;išsaugoti R16 0x045F R16 ? ? stumti R17 ;išsaugoti R17 0x045E R16 R17 ? stumti R18 ;išsaugoti R18 0x045D R16 R17 R18 ̣̣̣̣̣̣̣ pop R18 ;atkurti R18 0x045D R16 R17 ? pop R17 ;atkurti R17 0x045E R16 ? ? pop R16 ;atkurti R16 0x045F ? ? ?

Naudodami krūvą galite labai lengvai pakeisti registrų turinį:

; Keistis R16<->R17 SP Krūvos lygis po paspaudimo komandos R16 ;išsaugoti R16 0x045F R16 ? stumti R17 ;išsaugoti R17 0x045E R16 R17 pop R16 ;atkurti R16 0x045E R16 ? pop R17 ;atkurti R17 0x045F ? ?


10 pav. Krūvos veikimo pavyzdys

10 paveiksle parodyta nedidelė kodo dalis, kurioje parodytas žingsnis po žingsnio dėklo keitimo įeinant ir išeinant iš perjungimo paprogramės ir įrašant bei atkuriant registrą R17. Tai yra tipiškas pavyzdys, kai gali prireikti „push/pop“ instrukcijų. Perjungimo paprogramė savo poreikiams naudoja RON R17, tačiau tą patį registrą galima naudoti ir pagrindinėje programoje. Todėl, siekiant išvengti duomenų sugadinimo, R17 įkeliamas į krūvą prieš modifikavimą ir atkuriamas iš jo prieš komandą ret.


Pakalbėkime apie trukdžius.Žodis pertraukti kalba pats už save, procesas kuriam laikui sustabdomas, kad būtų atlikti papildomi veiksmai. Pertraukimai gali būti išoriniai arba vidiniai. Pateiksiu paprastą pavyzdį, kurį išgirdau iš savo draugo...

Jis susiruošė plauti indus virtuvėje, pradėjo su jauduliu, pasiraitojo rankoves... bet indai pasirodė riebūs ir buvo priverstas stabtelėti, kad vienoje iš lentynų rastų ploviklio riebiems indams plauti. virtuvės bloką, po kurio vėl tęsė savo užduotį. Bet kažkuriuo momentu suskambo telefonas ir jis vėl pristabdė darbą, pakėlė ragelį, uošvė paskambino ir pasakė, kad atvažiuoja į svečius, todėl jam reikia nueiti į parduotuvę nusipirkti maisto produktų, kol ji. atvyko. Nuėjau į parduotuvę ir tik tada išploviau indus.

Šiame pavyzdyje pateikiami dviejų tipų trukdžiai, pirmasis susijęs su pagrindinio darbo atlikimu – ploviklio riebiems indams paieška – vidinis pertraukimas, antrasis – telefono skambutis – išorinis pertraukimas.
Mikrovaldiklyje išoriniai pertraukimai atsiranda dėl signalų, ateinančių iš kitų šaltinių, vidiniai – dėl įrenginių, įmontuotų pačiame mikrovaldiklyje. Kodėl pertraukos yra tokios patrauklios?
Pirma, mes galime sustabdyti pagrindinį procesą, kad atliktume kokią nors kitą funkciją, ir tada tęsti šį procesą.
Antrasis ir tikriausiai daugeliu atvejų pagrindinis – visų funkcijų atlikimo proceso pagreitis, dėl vidinių papildomų įrenginių. Grįžkime prie mūsų pavyzdžio. Tarkime, mano draugas pradėjo plauti indus, kai jo žmona jau buvo grįžusi namo. Pamatęs riebius indus, prašo jos surasti indų ploviklio, o kol jis plaus, jau atneš jam šio skysčio. Bet tada suskambo telefonas, žmona pakėlė ragelį, pasikalbėjo su mama ir nuėjo į parduotuvę. Kartu viskas buvo atlikta labai greitai!
O užstrigti dar lengviau – t.y. pagrindinės programos nėra.
Mano draugė sėdi ant sofos ir nieko nedaro, namų tvarkytoja pamato nešvarius indus, pasakoja apie tai, o gavusi leidimą pradeda skalbti. Kai suskamba telefonas, jis liepia žmonai pakelti ragelį, žmona kalba telefonu, o pokalbis nukeliauja į parduotuvę... Grožis! Tokiu atveju mikrovaldiklyje vienu metu veikia keli I/O įrenginiai (šiuolaikiniuose mikrovaldikliuose jų gali būti gana daug) ir bendras procesoriaus našumas išauga daug kartų, tačiau pertraukimai iš įrenginių apdorojami nuosekliai vienas po kito (ne vienu metu). ), priklausomai nuo prioriteto (mūsų pavyzdyje žmona turi didesnį prioritetą nei namų tvarkytoja).

Už pertraukimų valdymą atsakingi keli registrai
SREG – būsenos registras(valstybės). Mes žiūrime į įvesties / išvesties įrenginių lentelę. Septintasis SREG registro bitas yra I (pertraukimo) vėliavėlė, kuri vadinama visuotine pertraukimo įjungimo vėliava. Jei vėliavėlė praleista (septintas bitas yra nulis), tada visi pertraukimai yra išjungti. Jei vėliavėlė pakelta (nustatyti I į 1), įjungiame pertraukimus.

I vėliavėlė nustatoma ir iš naujo nustatoma komandomis:
SEI – įjungti pertraukimus
CLI – išjungti pertraukimus
Kurie pertraukimai veiks, nustatomi naudojant registrus, vadinamus - pertraukti kaukes.
Pertraukimo kaukės žymimos taip:
TIMSK,..,..,.. – laikmačių ir kitų įmontuotų įrenginių trikdžių valdymas.
GIMSK (GIKR Mega šeimoje) - visų išorinių pertraukimų valdymas.
Pertraukimų kaukės savo ruožtu priklauso nuo pertraukimo vėliavėlių:
TIFR ir GIFR atitinkamai(nepainioti su visuotinio pertraukimo įjungimo vėliava).

Pertraukimo vykdymo seka:
Įjungus mikrovaldiklį, visos pertraukimų vėliavėlės nustatomos į 0. Kad įjungtų pertraukimus, programa turi nustatyti SREG registro I vėliavėlę į 1. Po to užregistruokite kaukių registrus su nustatytais vietiniais pertraukimais (mums reikalingiems pertraukimams) .
Kai gaunamas pertraukimo prašymas (signalas), jis pakelia pertraukimo vėliavėlę (net jei pertraukimas išjungtas, kad būtų organizuoti įdėtieji pertraukimai ir prioritetas tarp skirtingų pertraukimų). Jei pertraukimai nėra išjungti, valdiklis susisieks su atitinkama institucija (Interrupt Vectors) – pertraukimo vektorius, pristabdydami dabartinę programą.
Pertraukimo vektorius yra fiksuota eilutė programos srityje, kur programa eina, kai įvyksta pertraukimas.
Visas pertraukimo vektorių sąrašas vadinamas pertraukimo vektorių lentelė, kuris yra programos kodo pradžioje.
Taigi tuo metu, kai pasiekiamas pertraukimo vektorius, SREG registro I vėliavėlė ir pertraukimą sukėlusi vėliavėlė iš naujo nustatomos į 0, išjungiant kitus pertraukimus. Jei vykstant pertraukimui atsiranda kitų pertraukimo užklausų, tų pertraukimų vėliavėlės lieka iškeltos. Pasibaigus dabartiniam pertraukimui, pakeliama SREG registro I vėliavėlė, leidžianti vykdyti kitą. Jei gaunamos kelios užklausos ir iškeliamos jų vėliavėlės, tada pirmiausia bus vykdomas pertraukimas, kurio vektorius yra mažesnis lentelėje esančiame adresu, arčiau atminties pradžios. Toliau seka antrasis ir t.t. Be to, programuotojas gali organizuoti vadinamąjį įdėtą pertraukimą, kai vykdant pertraukimo programą įvyksta kitas pertraukimas. Tada esamo pertraukimo vykdymas sustabdomas ir vykdomas naujas, po kurio atnaujinamas sustabdyto pertraukimo vykdymas.

Kaip pavyzdys pateikta ATtiny2313 pertraukimų vektorių lentelė

Atmega16 pertraukimo vektorių lentelė yra tokia:

Palyginus, lentelės visiškai nesutampa.
ATtiny šeimoje pertraukimo vektoriaus eilutė užima 16 bitų, o Mega šeimoje - 32 bitus (atkreipkite dėmesį į pertraukimo vektorių adresus; priminsiu, kad adreso eilutė programos srityje yra vaizduojama 16 - bitas žodis).

ATtiny2313 programos kodas gali atrodyti taip:
.cseg .org 0 rjmp Nustatyti iš naujo rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp_time ANAINT_COMPP0 jmp Timer0_compB rjmp USI_START rjmp USI_OVERFLOW rjmp EE_READY rjmp WDT_ OVERFLOW

Kaip matote, pertraukimo vektorius sukuria santykinį šuolį į pertraukimo programos etiketes. Žemiau esančioje lentelėje pateikiamos parinktys; 1. Kai nėra trukdžių; 2, 3. su išoriniu pertraukimu įėjime INT_1.
Jei etiketės yra „tuščios“ (po etikete nėra programos), tada nieko neįvyksta ir programa nuosekliai „pereina“ likusias etiketes ir saugiai pasiekia komandą RETI- Interrupt return – išėjimas iš pertraukimų tvarkyklės kaip parodyta pirmajame lentelės stulpelyje.

Norėdami vykdyti pertraukimo programą, pavyzdžiui, INT_1 įvestyje, turite pašalinti INT_1: etiketę iš sąrašo. Tai schematiškai parodyta antrame lentelės stulpelyje.
Tačiau programuotojui nepatogu kiekvieną kartą rašyti visas pertraukas ir atskiras jų etiketes, ypač naujausiuose modeliuose, kur lentelė yra gana didelė, lengviau iškart parašyti RETI komandą pertraukimo vektoriaus eilutėje, jei pertraukimas nenaudojamas. Tada programa atrodys taip, kaip parodyta trečiame lentelės stulpelyje.

AVR valdikliai, priklausomai nuo modelio, gali turėti nuo 1 iki 8 įėjimų išoriniai pertraukimai.
Panagrinėkime išorinę pertraukų valdymo sistemą. Šiuo tikslu, priklausomai nuo modelio, pateikiami šie I/O registrų deriniai (žr. atitinkamą duomenų lapą):
- GIMSK, EIFR, PCMSK, MCUCR;
- GIKR, GIFR, MCUCR;
- EIMSK, EICR, EIFR;
GIMSK, GIKR, EIMSK - pertraukimo kaukės,
EIFR, PCMSK, GIFR, EIFR – pertraukimo vėliavėlės
Dėl leidimo ar draudimo išoriniai pertraukimai Valdymo registrai yra skirti: GIMSK-(General Interrupt Mask Register) (Tiny), GICR- (General Interrupt Control Register) (Mega), MCUCR – (MCU Control Register)




EIFR – Išorinio pertraukimo vėliavėlės registras: 1 – įjungtas, 0 – išjungtas. Kiekvienas bitas (vėliava) leidžia atitinkamam kaiščiui veikti kaip pertraukimo šaltinis.

GIMSK registro valdymo bitai:
7 bitas – INT1: External Interrupt Request 1 Enable – INT1 pertraukimo įjungimo bitas: 1 – įjungtas, 0 – išjungtas. Pertraukimas bus sugeneruotas net jei INT1 kaištis sukonfigūruotas kaip išvestis. INT1 bitas nustatytas pertraukti EIFR vėliavėlės registre. INT1 kaištis yra sinchronizuojamas su laikrodžio generatoriumi.

6 bitas – INT0: External Interrupt Request 0 Enable – pertraukimo įjungimo bitas INT0: 1 – įjungtas, 0 – išjungtas. Pertraukimas bus sugeneruotas net jei INT0 kaištis sukonfigūruotas kaip išvestis. INT0 bitas nustatytas pertraukti EIFR vėliavėlės registre. INT10 kaištis yra sinchronizuojamas su laikrodžio generatoriumi.

5 bitas – PCIE: Pin Change Interrupt Enable – pertraukimo įjungimo bitas PCINT0…7 kontaktuose: 1 – įjungtas, 0 – išjungtas. Bet koks PCINT0...7 kontaktų pakeitimas sukels pertraukimą. Smeigtukai PCINT0...7 sukonfigūruoti pertraukimui atskirai, pagal bitus PCMSK vėliavėlės registre.

PCMSK- Kaiščių keitimo kaukės registratorius - vėliavų registras PCMSK: 1 – leidžiama, 0 – išjungta. Kiekvienas bitas (vėliava) leidžia atitinkamam kaiščiui veikti kaip pertraukimo šaltinis. PCINT0...7 kontaktai nėra sinchronizuojami su laikrodžio generatoriumi, t.y. pertraukimas įvyksta, kai pasikeičia bet kuris kaištis.

Mega8

ir atitinkamas vėliavėlių registras


7 bitas

6 bitas – INT0: External Interrupt Request 0 Enable – pertraukimo įjungimo bitas INT0: 1 – įjungtas, 0 – išjungtas. Pertraukimas bus sugeneruotas net jei INT0 kaištis sukonfigūruotas kaip išvestis. INT0 bitas nustatytas pertraukti GIFR vėliavėlių registre



GIFR – General Interrupt Flag Register: 1 – įjungta, 0 – išjungta. Kiekvienas bitas (vėliava) leidžia atitinkamam kaiščiui veikti kaip pertraukimo šaltinis.

GICR registro valdymo bitai:
7 bitas– : 1 išorinės pertraukimo užklausos įjungimas – pertraukimo įjungimo bitas INT1: 1 – leidžiama, 0 – draudžiama. Pertraukimas bus sugeneruotas net jei INT1 kaištis sukonfigūruotas kaip išvestis. INT1 bitas nustatytas pertraukti GIFR vėliavėlių registre

6 bitas – INT0: Išorinio pertraukimo užklausa 0 įgalinti – pertraukimo įjungimo bitas INT0: 1 – leidžiama, 0 – draudžiama. Pertraukimas bus sugeneruotas net jei INT0 kaištis sukonfigūruotas kaip išvestis. INT0 bitas nustatytas pertraukti GIFR vėliavėlių registre

5 bitas – INT2: 2 išorinio pertraukimo užklausos įgalinimas – pertraukimo įjungimo bitas INT2: 1 – leidžiama, 0 – draudžiama. Pertraukimas bus sugeneruotas net jei INT2 kaištis sukonfigūruotas kaip išvestis. INT2 bitas nustatytas pertraukti GIFR vėliavėlių registre

Visų valdiklių INT0 ir INT1 įėjimų funkcijos valdomos žemos eilės MCUCR registro bitais.

MCUCR – MCU valdymo registras
Valdymo bitai:
1, 0 bitai – ISC01, ISC00 (pertraukimo jutimo valdymas 0, 1 bitas ir 0 bitas) – šių bitų būsena lemia įvykį INT0 kaištyje, kuris generuoja INT0 pertraukimą:
ISC01=0, ISC00=0 – loginio nulio lygis;
ISC01=0, ISC00=1 – bet koks loginės būsenos pasikeitimas;
ISC01=1, ISC00=0 – ant krentančios briaunos;
ISC01=1, ISC00=1 – ant kylančios briaunos.

3, 2 bitai – ISC11, ISC10 (Interrupt Sense Control 1 Bit 1 and Bit 0) – šių bitų būsena lemia signalo lygį INT1 kaištyje, kuris generuoja INT1 pertraukimą:
ISC11=0, ISC10=0 – loginio nulio lygis;
ISC11=0, ISC10=1 – bet koks loginės būsenos pasikeitimas;
ISC11=1, ISC10=0 – ant krentančios briaunos;
ISC11=1, ISC10=1 – ant kylančios briaunos.

Na, panašu, kad apie išorinius trukdžius kalbėjome iki minimumo.
Aišku, kad trukdžiai veiktų, juos reikia atitinkamai registruoti.
Pridėkime pertraukimo inicijavimą INT1, pradėtą ​​mažyčiui kylančiame signalo krašte:

Ldi r16.0x80 ; Įrašykite r16 skaičių 0b10000000 ldi r17.0x0C ; Įrašykite r17 skaičių 0b00001100 iš MCUCR,r17 ; pertraukimas bus generuojamas kylančioje briaunoje ISC11=1, ISC10=1 iš GIMSK,r16 ; nustatykite kaukę INT0 sei
Beje, galite sugeneruoti pertrauką „tiny2313“. ant bet kokių PCINT0…7 kontaktų, „Mega“ iki 48 serijos šios funkcijos nepasiekiamos...
Yra operacijų, kurių metu gali atsirasti pertraukų, dėl kurių programa gali sugesti. Tokiais atvejais prieš pradedant operaciją rašome CLI, o po SEI. Tokios operacijos vadinamos - atominis.
Pageidautina, kad pertraukimo programos būtų kompaktiškos ir vykdomos maksimaliu greičiu, nes bet kokio pertraukimo tikslas yra užfiksuoti įvykį. Jei dėl įvairių priežasčių programa veikia lėtai, užtenka užfiksuoti įvykį ir jį apdoroti kiek vėliau.

Kad pateikta medžiaga nebūtų perkrauta nereikalinga informacija, rekomenduoju skaitytojams naudoti duomenų lapus, o jei viskas neaišku, dažniau užduoti klausimus forumuose.
Toliau mes išsamiai apsvarstysime vidinius pertraukimus, pagrįstus įmontuotais laikmačiais. skaitytojai. Norėdami dalyvauti balsavime, užsiregistruokite ir prisijunkite prie svetainės naudodami savo vartotojo vardą ir slaptažodį.

Pertraukimo sistemos yra svarbi bet kurios valdymo sistemos dalis.

Kaip efektyviai mikroprocesorinė sistema atlieka savo funkcijas, labai priklauso nuo jos veikimo. Bendra MK-51 pertraukimo sistemos struktūra parodyta fig. 14.3.

MK-51 šeimos mikrovaldikliai palaiko penkis pertraukimo šaltinius:

* du išoriniai pertraukimai, ateinantys per įėjimus INT0 ir INT1 (prievado linijos P3: atitinkamai P3.2 ir P3.3);

* du pertraukimai iš laikmačių/skaitiklių T/C0 ir T/C1;

* nuosekliojo prievado pertraukimas.

Pertraukimų užklausos registruojamos specialiuose mikrovaldiklio funkcijų registruose: vėliavėlės IE0, IE1, TF0, TF1 pertraukimų užklausos iš INT0, INT1, T/C0 ir T/C1 yra TCON valdymo registre (14.4 lentelė), o vėliavėlės RI. ir TI prašo nutraukti nuoseklųjį prievadą – SCON registre nuosekliajam prievadui valdyti.

14.4 lentelė. TCON registro formatas

0 IT0 Pertraukimo tipo nustatymas INT0

1 IE0 pertraukimo užklausos vėliavėlė INT0

2 IT1 Pertraukimo tipo nustatymas INT1

3 IE1 pertraukimo užklausos vėliavėlė INT1

4 TR0 Įjungti laikmatį / skaitiklį 0

5 TF0 Perpildymo vėliavėlė (pertraukimo užklausa) laikmatis/skaitiklis 0

6 TR1 Įjungti laikmatį / skaitiklį 1

7 1 laikmačio / skaitiklio TF1 perpildymo vėliavėlė (pertraukimo užklausa).

Žymes TF0 ir TF1 nustato aparatinė įranga, kai atitinkamas laikmatis/skaitiklis persipildo (tiksliau, kai T/Cx pereina iš būsenos „visi vienetai“ į būseną „visi nuliai“).

Žymes IE0 ir IE1 nustato aparatinė įranga atitinkamai iš išorinių pertraukimų IT0 ir IT1. Dėl išorinės užklausos vėliavėlė gali būti nustatyta, kai signalo lygis atitinkamoje įėjime yra žemas, arba kai šis signalas persijungia iš aukšto į žemą (dažnis neviršija pusės MK išorinio laikrodžio dažnio).

Užklausos tipas konfigūruojamas programine įranga, nustatant IT0 ir IT1 bitus TCON valdymo registre. Nustačius ITx = 0, pertraukimo sistema sukonfigūruojama taip, kad ji reikalautų žemo signalo lygio, ITx = 1 – nustato pertraukimą, kad būtų reikalaujama žemo signalo lygio.

TI ir RI vėliavėlės nustatomos nuosekliosios sąsajos aparatūros, atitinkamai pasibaigus siuntimui arba pasibaigus priėmimui.

Visos nurodytos pertraukimo užklausos vėliavėlės yra programiškai prieinamos nustatymui ir atstatymui. Nustačius pertraukimo užklausos vėliavėlę programinėje įrangoje, gaunamas toks pat mikrovaldiklio atsakas, kaip ir aparatinėje įrangoje.

Žymes TF0 ir TF1 iš naujo nustato aparatinė įranga, kai valdymas perkeliamas į atitinkamą pertraukimo tvarką.

IEx vėliavėlės iš naujo nustatomos aparatinėje įrangoje, kai aptarnaujamas pertraukimas, tik jei pertraukimas buvo sukonfigūruotas taip, kad pajustų INTx signalo kritimą. Jei pertraukimas buvo sukonfigūruotas taip, kad pajustų užklausos signalo lygį, IEx vėliavėlę turi iš naujo nustatyti pertraukimo tarnybos programa, veikdama pertraukimo šaltinį, kad pašalintų užklausą.

TI ir RI vėliavėles iš naujo nustatyti galima tik naudojant programinę įrangą.

Kiekvienas pertraukimo tipas įjungiamas arba išjungiamas atskirai, nustatant arba išvalant atitinkamus IE pertraukimų įjungimo registro bitus. Šiame registre taip pat yra bendras visų pertraukimų išjungimo bitas. IE registro formatas pateiktas lentelėje. 14.5.

14.5 lentelė. IE registro bitų priskyrimas

Užregistruoti pareigas

Mažoji mnemonika

Funkcija

Išjungti visų šaltinių trikdžius

Nėra naudojamas

Nėra naudojamas

Išjungti pertraukimą iš nuoseklusis prievadas

Išjungti T/C1 laikmatį/skaitiklio pertraukimą

Išjungti pertraukimą iš išorinio šaltinio INT1

Išjungti laikmačio / skaitiklio pertraukimą T/C0

Išjungti pertraukimą iš išorinio šaltinio INT0

Kiekvienam pertraukimo tipui programiškai galima priskirti vieną iš dviejų galimų prioritetų: 0 – žemiausias arba 1 – didžiausias.

Prioritetai konfigūruojami nustatant arba išvalant atitinkamą bitą IP pertraukimo prioritetų registre. Šio registro formatas pateiktas lentelėje. 14.6.

Kai vienu metu gaunami pertraukimo užklausos iš skirtingų prioritetų šaltinių, pirmiausia apdorojama užklausa iš aukštesnio prioriteto šaltinio.

Tuo atveju, kai vienu metu gaunamos kelios vienodo prioriteto nutraukimo užklausos, jų apdorojimo tvarką nustato mikrovaldiklio aparatinė įranga ir programinė įranga negali pakeisti. Ši tvarka atitinka apklausos nutraukimo užklausų vėliavėlių seką, kuri atrodo taip:

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

14.6 lentelė. IP registro bitų priskyrimas

Registro padėtis Bitų mnemoninė funkcija

7 – nenaudota

6 – nenaudota

5 – nenaudota

4 PS nuosekliojo prievado pertraukimo prioritetas

3 PT1 laikmačio/skaitiklio pertraukimo prioritetas T/C1

2 PX1 Pertraukimo prioritetas iš išorinio šaltinio INT1

1 PT0 laikmačio/skaitiklio pertraukimo prioritetas T/C0

0 PX0 Pertraukimo prioritetas iš išorinio šaltinio INT0

Aparatinės įrangos įdiegtas pertraukimų apdorojimo iškvietimas susideda iš šių veiksmų:

* programos skaitiklio vertės išsaugojimas ant krūvos;

Kiekvieno pertraukimo šaltinio pertraukimų tvarkyklės įėjimo taškai yra fiksuoti aparatinėje įrangoje. Jų vertės pateiktos lentelėje. 14.7.

14.7 lentelė. Pertraukimų tvarkytojų įėjimo taškų adresai

Pertraukimo šaltinis

Pertraukimų tvarkytojų įėjimo taškų adresai

Išorinis pertraukimas ( ITO)

Laikmačio skaitiklis (TFO)

Išorinis pertraukimas (IT1)

Laikmatis-skaitiklis (TF1)

Nuoseklus prievadas (R1 arba T1)

Pirmoji pertraukimų tvarkyklės komanda turėtų būti nurodyta nurodytu adresu. Paprastai tokia komanda yra komanda besąlygiškai pereiti į tą programos vietą, kurioje iš tikrųjų yra tvarkytojas.

Perjungiant į pertraukimų apdorojimo tvarką, automatiškai, neatsižvelgiant į IE registro būseną, išjungiami visi pertraukimai, kurių prioriteto lygis lygus aptarnaujamo pertraukimo prioriteto lygiui – tai yra išjungiami vienodo prioriteto lygio įdėtieji pertraukimai. . Taigi žemo prioriteto pertraukimas (turintis „0“ atitinkamame IP registro bite) gali būti nutrauktas aukšto prioriteto pertraukimu (turintis „1“ atitinkamame IP registro bite), bet ne žemo prioriteto. Aukšto prioriteto pertraukimo aptarnavimo negali nutraukti kitas šaltinis.

Grįžimas iš pertraukimų tvarkyklės vykdomas naudojant RETI instrukciją, kuri iš krūvos atkuria kompiuterio programų skaitiklio, saugomo ten tuo metu, kai buvo iškviesta pertraukimų tvarkyklė, reikšmę ir pertraukimo prioriteto logiką.

Kam naudojami išoriniai pertraukimai?

Pertraukimas – tai įvykis, kai nutraukiamas pagrindinio programos kodo (pavyzdžiui, pagrindinės funkcijos) vykdymas ir valdymas perduodamas funkcijos pertraukimų tvarkyklei. Atitinkamai išoriniai pertraukimai yra tam tikri išoriniai įvykiai, kurie nutraukia pagrindinio programos kodo vykdymą.

Išoriniai pertraukimai leidžia greitai ir garantuotai reaguoti į išorinius įvykius. Todėl dažniausiai išorinių pertraukimų naudojimas yra impulsų skaitiklių diegimas, dažnio ar impulsų trukmės matavimas, uart, vieno laido, i2c, spi programinė įranga, taip pat išorinių periferinių įrenginių signalų apdorojimas.

Išorinių pertraukimų veikimo principas AVR

Tam, kad mikrovaldiklis sužinotų apie išorinius įvykius, naudojami diskretūs įėjimai INT0 INT1 ir kt. Diskretus reiškia, kad jie dirba su loginiais lygiais: 0 ir 1.
0 nėra įtampos įėjime
1 - įtampos buvimas įvestyje, kuri yra lygi mikrovaldiklio maitinimo įtampai.

Išorinius pertraukimus galima suskirstyti į du tipus:

  • išoriniai pertraukimai pagal lygį
  • išorinis kraštas pertraukia

Išoriniai pertraukimai pagal lygį

Išorinis pertraukimo trigeris gali būti sukonfigūruotas kaip žemas arba aukštas. Pavyzdžiui, jei pertraukimas nustatytas į logiškai žemą, tai įvyksta, kai įtampa INT įėjime yra lygi nuliui. Jei pertraukimas nustatytas į aukštą lygį, jis įvyksta, kai įvestis yra loginė 1.
Dirbdami su lygiais pagrįstais pertraukimais, turite atsiminti, kad tol, kol INT įvestis turi atitinkamą lygį, pertraukimas vyks nuolat. Tie. jei įvyksta pertraukimas, pavyzdžiui, esant žemam lygiui, ir programa jį apdoroja, bet jei išeinant iš pertraukimų tvarkyklės įvestis lieka žema, pertraukimas vėl įsijungs ir vėl bus iškviesta pertraukimo tvarkyklė, ir tai veiks tol, kol pasirodys aukštas įvesties lygis. Kad taip nenutiktų, turite išjungti tokio tipo pertraukimą tvarkyklėje arba iš naujo sukonfigūruoti į kitą lygį.

Išorinio krašto pertraukimas

Pertraukimas kylančioje briaunoje arba, kaip kartais sakoma, kylantis signalas, įvyksta, kai signalo lygis INT įėjime pasikeičia nuo 0 iki 1. Nutrūkimas krintančiame krašte (krentantis signalas) įvyksta, kai signalo lygis INT įvestis keičiasi nuo 1 iki 0.
Taip pat galima sukonfigūruoti pertraukimą taip, kad jis reaguotų į bet kokį pasikeitimą INT įėjime, t.y. jis įvyks tiek priekiniame, tiek gale.

Išorinių pertraukimų konfigūravimas AVR

Išoriniai pertraukimai avr atmega8 sukonfigūruotas naudojant bitus ISCxx Registruotis MCUCR .

Išorinio pertraukimo INT0 suveikimo sąlygos priklausomybė nuo MCUCR registro ISC0x bito avr atmega8

Išoriniam pertraukimui INT1 , sąranka atliekama taip pat, naudojami tik bitai ISC11 ISC10 .

Pavyzdysavr atmega8 išorinių pertraukimų nustatymai:

//atstatyti visus ISCxx bitus MCUCR &= ~( (1 <<ISC11) | (1<<ISC10) | (1<< ISC01) | (1<< ISC00) ) MCUCR |= (1 << ISC01) | (1 << ISC00) ;

//iš naujo nustatyti visus bitus ISCxx MCUCR &= ~((1<

Įgalinti išorinius pertraukimus avr atmega

Kad išoriniai pertraukimai veiktų, juos reikia įjungti nustatant atitinkamus registro bitus į 1 GICR .

Bit INT0 atsakingas už išorinių pertraukimų įjungimą / išjungimą INT0 , ir šiek tiek INT1 , atitinkamai, išoriniam pertraukimui INT1 .

Taip pat būtina, kad būtų nustatyta visuotinio pertraukimo įjungimo vėliavėlė.

Kodo pavyzdys, skirtas išoriniam pertraukimui INT0 įjungti avr atmega8:

//įgalinti išorinį pertraukimą INT0 GICR |= (1<

Išorinių pertraukimų naudojimo AVR atmega pavyzdys

Kaip pavyzdį pateiksiu pulso skaitiklio programą. Programa skaičiuoja impulsų skaičių INT0 įėjime ir kartą per sekundę parodo skaičiavimo rezultatą uart.

#įtraukti #įtraukti #įtraukti #įtraukti //skaitiklio kintamasis nepastovus nepasirašytas ilgas int0_cnt = 0 ; //konfigūruoti išorinį pertraukimą INT0 void int0_init( void ) ( //nustatyti, kad suaktyvintų INT0 kylančiame krašte MCUCR |= (1 << ISC01) | (1 << ISC00) ; //įgalinti išorinį pertraukimą INT0 GICR |= (1 <<INT0) ; ) //funkcija išorinis pertraukimų tvarkytuvas INT0 ISR( INT0_vect ) ( int0_cnt++; ) //UART sąranka void uart_init( void ) ( //keitimo greičio nustatymas UBRRH = 0; UBRRL = 3; //115200 kvarciniu 7,3728 MHz dažniu //8 duomenų bitai, 1 stop bitas, nėra pariteto UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ) ; //leisti priimti ir perduoti duomenis UCSRB = ( 1 << TXEN ) | ( 1 << RXEN ) ; ) //baitų perkėlimas per UART int uart_putc( char c, FILE * failas ) ( //laukti ankstesnio baito perdavimo pabaigos while ( ( UCSRA & ( 1 << UDRE ) ) == 0 ) ; UDR = c; grąžinti 0; ) FAILAS uart_stream = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE ) ; int main ( ) ( //laikinas kintamasis nepasirašytas ilgas tmp; stdout = & uart_stream; int0_init() ; uart_init() ; sei() ; kol (1) ( //išjungti pertraukimus, kol skaitiklio reikšmė kopijuojama cli() ; tmp = int0_cnt; //įgalinti pertraukimus sei() ; printf("int0_cnt = %lu \r\n", tmp ) ; //pauzė 1 sekundė _delay_ms( 1000 ) ; ) grąžinti 0 ; )

#įtraukti #įtraukti #įtraukti #įtraukti //skaitiklio kintamasis nepastovus nepasirašytas ilgas int0_cnt = 0; //išorinio pertraukimo INT0 konfigūravimas void int0_init(void) ( //INT0 konfigūravimas, kad suaktyvintų kylančiame krašte MCUCR |= (1<