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.

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ů INT0INT2.
  • 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é
Popisy jednotlivých přerušení a periferií se budeme zabývat v průběhu celého seriálu. Je nutné si ale říci, zvláště pro práci s přerušením v assembleru, že každé přerušení má svůj tzv. vektor přerušení. To je adresa programu, kam je běh programu přesměrován při vyvolání konkrétního přerušení. Následující tabulka ukazuje vektory přerušení pro procesor ATMEGA16

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

Jméno:  
Zpráva:

Komentáře k článku

článek zatím nikdo nekomentoval