Přerušovací systém mikrokontroléru ATMEGA a přerušovací systém PLC WAGO Flashcards
Přerušení Arduino
Přerušení (anglicky interrupt) je v informatice metoda pro asynchronní obsluhu událostí, kdy procesor přeruší vykonávání sledu instrukcí, vykoná obsluhu přerušení, a pak pokračuje v předchozí činnosti.
Obsluha přerušení (zkratka ISR, anglicky interrupt handler nebo též interrupt service routine), je v informatice speciální procedura, která je v CPU / MCU vyvolána při obsluze přerušení. Přerušení je asynchronní událost, při jejímž příchodu je přerušena činnost procesoru, je vyvolána obsluha přerušení, a poté činnost procesoru pokračuje na místě, kde bylo přerušení vyvoláno.
Pokud potřebujeme obsloužit nějakou připojenou periférii, máme dvě možnosti:
opakovaně v programu tuto periférii kontrolovat a případně reagovat spuštěním nějakého kódu.
využít tzv. systému přerušení
Systém přerušení Arduino
je HW, který dokáže detekovat událost způsobenou nějakou periférií a oznámit to procesoru.
Procesor může toto oznámení:
ignorovat
spustit tzv. “obsluhu přerušení” - typicky metoda, která říká, co se má stát, když dané přerušení nastalo
Jednoduše řečeno, přerušení může “pozastavit” provádění hlavní smyčky programu, “odskočit” si provést nějaký kód do obsluhy přerušení a pak se opět vrátit zpět do hlavní smyčky.
Zdrojem přerušení u mikročipu ATmega328P může být:
Externí přerušení 0/1 Změna hodnoty na pinu 0/1/2 Čítač / časovač 0/1/2 Sériová linka UART Sériová sběrnice SPI Sériová sběrnice I2C a další
Arduino - přerušení externí
Programování pod přerušením je ve Wiringu značně omezující. V podstatě si můžeme nastavit pouze externí přerušení 0 a 1.
Tato přerušení jsou vyvedena na piny:
2 pro přerušení EXT0
3 pro přerušení EXT1
Pro tyto potřeby máme ve Wiringu tyto funkce:
Nastavení obsluhy přerušení provedeme funkcí:
attachInterrupt(digitalPinToInterrupt(pin), isr, mode)
parametr: pin - číslo pinu, na kterém nastavujeme přerušení
parametr: isr - void funkce, která se bude spouštět, když přerušení nastane
parametr: mode - kdy nastane přerušení, přípustné hodnoty jsou:
* LOW - když je na pinu LOW
* RISING - když nastala na pinu změna z LOW do HIGH
* FALLING - když nastatla na pinu změna z HIGH do LOW
* CHANGE - když nastala na pinu změna (jakákoliv)
návratová hodnota: není
Pro zrušení spouštění obsluhy přerušení použijeme funkci:
detachInterrupt(digitalPinToInterrupt(pin))
Dále máme ještě funkce:
interrupts()
zapne přerušovací systém
noInterrupts()
vypne přerušovací systém
Přerušení PLC
:)
Schopnost zpracovat přerušení
Ne všechny CPU v řadě různých PLC nemusí umožňovat zpracování přerušení, tedy je potřeba zvolit vhodné CPU, které je systémově vybaveno pro zpracování přerušení. Obecně, zpracování přerušení musí být v PLC povoleno, události musí být přiřazena obslužná rutina a musí být stanovena priorita přerušení.
Zásobník přerušení
Počet zpracovávaných přerušení je u různých PLC různý a závisí na velikosti zásobníku přerušení, do kterého se ukládají příchozí požadavky na přerušení. Jednoduché CPU poskytují možnost zpracování 2-4 přerušení, střední CPU 8 přerušení a výkonné CPU mohou zpracovat až 16 přerušení. K tomu je potřeba vzít v úvahu hloubku vnoření programu v okamžiku zpracování přerušení pokud nemá systém CPU oddělený zásobník hloubky vnoření právě pro přerušení.
Priorita přerušení
Každé přerušení má přiřazenu určitou prioritu s kterou se přerušení zpracuje v případě, že jednom konkrétním okamžiku dojde k výskytu více požadavků na přerušení. Jako první se zpracuje přerušení s nejvyšší prioritou, obvykle označována jako 0 (nula, tedy nesnese žádného odkladu). Ostatní přerušení s nižší prioritou jsou zpracována až po dokončení zpracování přerušení s vyšší prioritou. Pokud již probíhá zpracování nějakého přerušení, může být toto samo přerušeno požadavkem zpracování přerušení s vyšší prioritou, přerušení s nižší prioritou jsou obsloužena nebo dokončena po dokončení zpracování přerušení s vyšší prioritou.
Poznámka
Přerušení, která nemohou být zpracována z důvodu probíhajícího zpracování přerušení s vyšší prioritou nebo jsou sama přerušena zpracováním přerušení s vyšší prioritou, jsou ukládána do zásobníku přerušení, odkud jsou potom zpětně volána po dokončení přerušení s vyšší prioritou.
Zpracování přerušení
Zpracování přerušení má na starosti systém CPU, který zpracovává požadavky na přerušení od různých zdrojů a podle pořadí (více přerušení se stejnou prioritou) a nebo podle priority vyvolává zpracování obslužných rutin.
Rutina obsluhy přerušení
Rutina obsluhy libovolného přerušení by měla být co možná nejkratší a nejjednodušší. Žádné zpětné skoky, žádné cykly, žádné nadbytečné volání podprogramů z přerušení. Pokud je rutina obsluhy přerušení zbytečně dlouhá, může dojít k situaci, kdy by nastala stejná událost, která by požadovala vyvolání již prováděné rutiny obsluhy přerušení. Rekurzivní volání těchto rutin není povoleno (na rozdíl od podprogramů) a tento stav skončí chybou, tj. STOP stavem CPU. Taktéž může dojít k přetížení systému příliš častým voláním přerušení, byť různých priorit, kdy systém tuto zátěž již nestačí zpracovat nebo dojde k nadměrnému prodloužení doby cyklu, obojí může mít za následek STOP stav CPU.
Zákaz přerušení
Zákaz přerušení zdánlivě popírá význam a důvody použití přerušení. Mohou však nastat případy, kdy se zpracovává úsek programu, například výpočet hodnoty, která může být v přerušení použita a nebo přerušení může naopak změnit hodnoty proměnných použitých pro výpočet. V takovém případě by byl výsledek výpočtu různý podle toho, proběhlo-li přerušení či nikoliv. Pro takový případ je možno reakci na přerušení potlačit (odložit), eventuelně upravit používání proměnných tak, aby k této situaci nedošlo.
Samostatné přerušení PLC
Jednoduchý případ samostatných přerušení je zobrazen na obrázku 1, kdy je při přijmutí požadavku přerušení přerušeno zpracování hlavního programu anebo podprogramu. Následně je vyvolána obsluha přerušení INT 1 nebo INT 2, podle zdroje požadavku přerušení … procesní, uživatelské, diagnostické.
Pokud se požadavky na přerušení vzájemně nepřekrývají, jsou přerušení zpracovány v pořadí, v jakém vznikly. Po zpracování přerušení se činnosti CPU, vrátí ke zpracování hlavního programu, konkrétně za poslední instrukci, která ještě byla zpracována.
Postupné přerušení PLC
Příklad postupného zpracování přerušení je zobrazen na obrázku 2. V podstatě nezáleží na tom, je-li zpracováván hlavní program nebo podprogram. Při přijetí požadavku přerušení je vyvolána obslužná rutina INT 1, protože požadavek na toto přerušení byl přijat jako první.
V době zpracování přerušení INT 1 je ale přijat požadavek přerušení s vyšší prioritou, INT 0. Zpracování přerušení INT 1 je samo přerušeno a je vyvolána rutina pro obsluhu přerušení INT 0, které má vyšší prioritu. Po dokončení INT 0 je zpracování předáno k dokončení rutiny přerušení INT 1 a po jejím dokončení zpět programu, respektive podprogramu.
Současné přerušení PLC
Současné přerušení je zobrazeno na obrázku 3. Tento příklad ukazuje řešení situace, kdy se v témž okamžiku vyskytnou dva nebo více požadavků na přerušení ale s různou prioritou.
Zpracování hlavního programu nebo podprogramu je přerušeno a řízení je předáno rutině, která obsluhuje přerušení s vyšší prioritou, konkrétně INT 0. Teprve po dokončení obsluhy přerušení s vyšší prioritou je řízení předáno rutině pro obsluhu přerušení s nižší prioritou INT 1. Po jejím dokončení se zpracování vrátí k hlavnímu programu, respektive podprogramu.
Poznámka
Některé typy CPU dovolují definovat, jestli je možno zahájit rutinu přerušení po libovolné dokončené instrukci programu (na hraně instrukce) nebo přerušení může být provedeno až po zpracování segmentu (sítě) programu (na hraně segmentu).
Povolení zpracování přerušení až po dokončení programového bloku nemá smysl, protože v případě, kdy by program obsahoval pouze hlavní program, přerušení by se realizovalo až na konci programu, což by popíralo výhodu rychlé reakce. Taktéž, pokud by bylo možno přerušení zpracovat až po dokončení programového bloku vyjma přerušení samého.