Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:avr:interrupts [2010/02/11 11:01] toimetajaet:avr:interrupts [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 5: Line 5:
 AVR mikrokontrolleris on iga katkestus seotud kindla sündmusega. Igal sündmusel on olekuregistris lipubitt, mis tähistab sündmuse juhtumist. Lisaks on sündmustega seotud katkestuste maskeerimise registrid ja vastavad bitid. Kui sündmuse katkestuse bitt on maskeerimata ja tekib sündmus, jätab protsessor mõne(kümne) töötakti jooksul käimasoleva programmi täitmise pooleli ning alustab katkestuse programmi täitmist. Pärast katkestuse programmi täitmist jätkab protsessor poolelijäänud programmi täitmist. AVR mikrokontrolleris on iga katkestus seotud kindla sündmusega. Igal sündmusel on olekuregistris lipubitt, mis tähistab sündmuse juhtumist. Lisaks on sündmustega seotud katkestuste maskeerimise registrid ja vastavad bitid. Kui sündmuse katkestuse bitt on maskeerimata ja tekib sündmus, jätab protsessor mõne(kümne) töötakti jooksul käimasoleva programmi täitmise pooleli ning alustab katkestuse programmi täitmist. Pärast katkestuse programmi täitmist jätkab protsessor poolelijäänud programmi täitmist.
  
-===== Näide =====+<box 100% round #EEEEEE|Näide>
  
 Katkestuste kasutamiseks AVR LibC teegiga tuleb kasutusele võtta //interrupt.h// fail. Katkestusel täitmisele minev programmikood lisatakse pärast "ISR"-i nimelist võtmesõna. "ISR" järele sulgudesse kirjutatakse katkestuse nimi. C-keele koodinäide: Katkestuste kasutamiseks AVR LibC teegiga tuleb kasutusele võtta //interrupt.h// fail. Katkestusel täitmisele minev programmikood lisatakse pärast "ISR"-i nimelist võtmesõna. "ISR" järele sulgudesse kirjutatakse katkestuse nimi. C-keele koodinäide:
Line 17: Line 17:
 } }
 </code> </code>
 +
 +</box>
  
 Globaalne, kõigi katkestuste toimumise lubamine, määratakse ära juht- ja olekuregistris SREG. Võimaluse kõiki katkestusi keelata või lubada tingib andmete kaitse vajadus. Kuna katkestused katkestavad käimasoleva programmi täitmise, võivad nad segada või rikkuda andmeid, mida põhiprogramm katkestamise hetkel kasutas. Sellist olukorda saab vältida kõikide katkestuste keelamisega enne tundlike andmetega tegelemist. Globaalne katkestuste keelamine on lihtne, kui seda saab teha ühe registri (SREG) muutmisega. Pärast kriitilise programmiosa lõppu saab katkestused uuesti lubada ja kõik katkestused, mille lipuke vahepeal ära märgiti, lähevad täitmisele. Globaalne, kõigi katkestuste toimumise lubamine, määratakse ära juht- ja olekuregistris SREG. Võimaluse kõiki katkestusi keelata või lubada tingib andmete kaitse vajadus. Kuna katkestused katkestavad käimasoleva programmi täitmise, võivad nad segada või rikkuda andmeid, mida põhiprogramm katkestamise hetkel kasutas. Sellist olukorda saab vältida kõikide katkestuste keelamisega enne tundlike andmetega tegelemist. Globaalne katkestuste keelamine on lihtne, kui seda saab teha ühe registri (SREG) muutmisega. Pärast kriitilise programmiosa lõppu saab katkestused uuesti lubada ja kõik katkestused, mille lipuke vahepeal ära märgiti, lähevad täitmisele.
  
-==== Näide ====+<box 100% round #EEEEEE|Näide>
  
 Oletame, et programmis on kasutusel 16-bitine muutuja, mille väärtust muudab nii põhiprogramm kui ka katkestuse programmilõik, ja selle muutuja väärtus omistatakse hiljem teisele muutujale: Oletame, et programmis on kasutusel 16-bitine muutuja, mille väärtust muudab nii põhiprogramm kui ka katkestuse programmilõik, ja selle muutuja väärtus omistatakse hiljem teisele muutujale:
- 
 <code c> <code c>
 #include <avr/interrupt.h> #include <avr/interrupt.h>
Line 36: Line 37:
 } }
  
-int main()+// Põhiprogramm 
 +int main(void)
 { {
  // Muutujale x väärtuse omistamine  // Muutujale x väärtuse omistamine
  x = 0x1111;  x = 0x1111;
  
- // Mingi katkestuse tööle seadistamine + // Globaalne katkestuste lubamine
- +
- // Globaalne katkestuste lubamine +
-        //   võrdub SREG registris I biti märkimisega+
  sei();  sei();
  
Line 67: Line 66:
 </code> </code>
  
 +</box>
 +
 +Atmeli xmega seeria kontrolleritel on katkestused jaotatud kolme prioriteedi klassi:
 +  - Madala prioriteediga katkestused
 +  - Keskmise prioriteediga katkestused
 +  - Kõrge prioriteediga katkestused
 +See tähendab, et kõrgema prioriteediga katkestus võib katkestada madalama prioriteediga katkestuse koodi. Seoses sellega tuleb katkestusi kasutades vastava prioriteediga katkestused ka kõigepealt lubada.
 +
 +<code c>
 + //Luba madala prioriteediga katkestused
 + PMIC.CTRL |= PMIC_LOLVLEN_bm;
 + //Luba keskmise prioriteediga katkestused
 + PMIC.CTRL |= PMIC_MEDLVLEN_bm;
 + //Luba kõrge prioriteediga katkestused
 + PMIC.CTRL |= PMIC_HILVLEN_bm;
 +
 + // Globaalne katkestuste lubamine
 + sei();
 +</code>
 +
 +Illustratsioonilt on näha, kuidas kõrgema tasemega katkestus peatab madalama tasemega katkestuse ning madalama tasemega katkestuse programm jätkab tööd pärast kõrgema tasemega katkestuse töö lõppu.
 +[{{:et:avr:katkestused_1.png?580|Erineva taseme katkestuste käivitamise järjekord}}]
 +
 +~~CL~~
 +
 +Kui järjest tuleb mitu samatasemelist katkestust, siis oodatakse eelneva katkestuse töö lõppu ning alles siis alustab samatasemeline katkestus tööd. Juhul, kui vahepeal tuleb mõni kõrgema tasemega katkestus lükkub edasi mõlema katkestuse programmi töö.
 +[{{:et:avr:katkestused_2.png?580|Sama taseme katkestuste käivitamise järjekord}}]
et/avr/interrupts.1265886105.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0