Přerušení
Programy které jsme dělali doposud měly jednu velkou nevýhodu. Děje, které se tam odehrávaly, byly časovány pomocí zpožďování procesoru a to nám velmi ubíralo potřebný čas pro užitečnou práci. Tomu se dá zabránit použitím tzv. přerušení, což je schopnost procesoru, umožňující přerušit běh programu a přesměrovat jej na určitou oblužnou rutinu (funkci). Po jejím vykonání se program vrátí zpět na místo, odkud byl přerušen. Událostí, jež vedou k takovému stavu, může být několik, záleží na tom, kolik zdrojů přerušení má daný procesor.
adresa přerušení
0x0002 vněší přerušení (INT0)
0x0004 vnější přerušení (INT1)
0x0006 č/č 2, output compare
0x0007 č/č 2, přetečení č/č
0x000a č/č 1, input capture
0x000c č/č 1, output capture A
0x000e č/č 1, output capture B
0x0010 č/č 1 přetečení
0x0012 č/č 0 přetečení
0x0014 SPI kanál, přenos dokončen
0x0016 USART, příjem dokončen
0x0018 USART, vysílací buf. je prázdný
0x001a USART, vysílání dokončeno
0x001c A/D převod dokončen
0x001e EEPROM je připravena
0x0020 analogový komparátor
0x0022 TWI (I2C)
0x0024 vnější přerušení (INT2)
0x0026 č/č 0, output compare
0x0028 zápis do FLASH možný
Na tyto adresy se zapisují instrukce pro skok do obslužné rutiny a v obslužných rutinách je na konci instrukce RETI, která vrátí běh programu zpět tam, kde byl.
My si dnes ukážeme jak využít přerušení INT0 - INT2. Tato přerušení jsou spouštěna vstupy INT0 - INT2 a to jak při nastavení jako vstupní, tak i při nastavení jako výstupní port. Přerušení může být generováno na změnu úrovně (sestupnou nebo náběžnou hranu) a nebo při zjištění nastavené úrovně - úrovňově citlivé.
Nastavení přerušení INT0 - INT2 se provádí ve dvou registrech. V registru GICR se přerušení od INT0 - INT2 povolují a v registru MCUCR se nastavuje zda má být přerušení citlivé na hranu nebo úroveň. V případě úrovňově citlivého přerušení musíme počítat s tím, že pokud neobsloužíme přerušení ihned a podmínka pro jeho vyvolání zmizí, přerušení nebude vykonáno.

Bity INT0 - INT2 povolují přerušení od daného zdroje

Bity ISC01 a ISC00 nastavují citlivost vstupu INT0:
0 0 přerušení akt. log. 0
0 1 přerušení akt. jakoukoliv změnou
1 0 aktivováno sestupnou hranou
1 1 aktivuje se náběžnou hranou
stejný význam mají pro vstup INT1 bity ISC10 a ISC11.
Pro nastavení INT2 slouží jediný bit a to ISC2 registru MCUCSR
1 citlivý na vzestupnou hranu
0 citlivý na sestupnou hranu

Příklad
Příklad pro využití přerušení v jazyce C, jste mohli vidět v minulém díle. Dnes si ukážeme, jak využít vnějšího přerušení v assembleru.
Program je možné stáhnout v PDF nebo celý projekt
Při sestupné hraně na INT0 se invertují stavy portu C. Jak si jistě při krokování programu všimnete, procesor vlastně do doby než příjde přerušení nedělá, je možné ho zaměstnat nějakou užitečnou činností (například výpočty)...
Zdroje přerušení pro ATMEGA16
Mikrokontrolér ATMEGA16 disponuje několika zdroji přerušení. Každý z nich má jinou proritu:- přerušení od vnějších vstupů INT0 až INT2.
- přerušení od čítače/časovače 0, 1, 2
- přerušení od kanálu SPI
- přerušení od USART
- přerušení od AD převodníku
- přerušení od TWI (I2C)
- přeušení od EEPROM
- a jiné
adresa přerušení
0x0002 vněší přerušení (INT0)
0x0004 vnější přerušení (INT1)
0x0006 č/č 2, output compare
0x0007 č/č 2, přetečení č/č
0x000a č/č 1, input capture
0x000c č/č 1, output capture A
0x000e č/č 1, output capture B
0x0010 č/č 1 přetečení
0x0012 č/č 0 přetečení
0x0014 SPI kanál, přenos dokončen
0x0016 USART, příjem dokončen
0x0018 USART, vysílací buf. je prázdný
0x001a USART, vysílání dokončeno
0x001c A/D převod dokončen
0x001e EEPROM je připravena
0x0020 analogový komparátor
0x0022 TWI (I2C)
0x0024 vnější přerušení (INT2)
0x0026 č/č 0, output compare
0x0028 zápis do FLASH možný
Na tyto adresy se zapisují instrukce pro skok do obslužné rutiny a v obslužných rutinách je na konci instrukce RETI, která vrátí běh programu zpět tam, kde byl.
My si dnes ukážeme jak využít přerušení INT0 - INT2. Tato přerušení jsou spouštěna vstupy INT0 - INT2 a to jak při nastavení jako vstupní, tak i při nastavení jako výstupní port. Přerušení může být generováno na změnu úrovně (sestupnou nebo náběžnou hranu) a nebo při zjištění nastavené úrovně - úrovňově citlivé.
Nastavení přerušení INT0 - INT2 se provádí ve dvou registrech. V registru GICR se přerušení od INT0 - INT2 povolují a v registru MCUCR se nastavuje zda má být přerušení citlivé na hranu nebo úroveň. V případě úrovňově citlivého přerušení musíme počítat s tím, že pokud neobsloužíme přerušení ihned a podmínka pro jeho vyvolání zmizí, přerušení nebude vykonáno.
Registr GICR
Bity INT0 - INT2 povolují přerušení od daného zdroje
Registr MCUCR
Bity ISC01 a ISC00 nastavují citlivost vstupu INT0:
0 0 přerušení akt. log. 0
0 1 přerušení akt. jakoukoliv změnou
1 0 aktivováno sestupnou hranou
1 1 aktivuje se náběžnou hranou
stejný význam mají pro vstup INT1 bity ISC10 a ISC11.
Pro nastavení INT2 slouží jediný bit a to ISC2 registru MCUCSR
1 citlivý na vzestupnou hranu
0 citlivý na sestupnou hranu
Příklad
Příklad pro využití přerušení v jazyce C, jste mohli vidět v minulém díle. Dnes si ukážeme, jak využít vnějšího přerušení v assembleru.Program je možné stáhnout v PDF nebo celý projekt
Při sestupné hraně na INT0 se invertují stavy portu C. Jak si jistě při krokování programu všimnete, procesor vlastně do doby než příjde přerušení nedělá, je možné ho zaměstnat nějakou užitečnou činností (například výpočty)...
Komentovat článek
Komentáře k článku
článek zatím nikdo nekomentoval