8051 - Přerušení
Úvod
Máme několik druhů přerušení, které jsou závislé, na událostech, jež je vyvolávají. Máme přerušení vyvolávané vnitřními obvody procesoru (časovače/čítače), vnějším prostředím (externí přerušení), a periferními obvody (UART - sériová linka). Všechna tato přerušení lze s výhodou použit k řízení toku programu. (ukážeme si na příkladu blikače, který naprogramujeme bez, i s přerušením)
Nejlépe si ukážeme funkci přerušení na jednoduchém příkladě. Mějme program, který koluje v hlavní smyčce :
cykl:
JMP cykl
cykl:
CPL P1.7 ; negovani bitu
JMP cykl
Zkusili jste? Ani nezkoušejte - Pamatujte, že procesor prochází instrukce tak rychle, že bychom rychlost změny stavu na výstupu a potažno i svícení a "nesvícení" LED ani nepostřehli. S krystalem 9,216 MHz, který je ve vývojovém kitu, totiž procesor jednu instrukci proletí za rychlostí 9,216 / 12 = 768 kHz, takže jedna instrukce nám bude trvat něco před 1,3 uS, což je opravdu málo :o)
Musíme tedy zařadit zpoždění...
cykl:
CPL P1.7 ; negovani bitu
MOV R0,#250
c1: MOV R1,#40
c2: MOV R2,#50
c3: DJNZ R2,c3 ; opakuje 50 x 40 x 250
DJNZ R1,c2 ; opakuje 40 x 250
DJNZ R0,c1 ; opakuje 250
JMP cykl
Víme, že procesoru je schopen vykonávat instrukce (zjednodušeně) rychlostí
vi = frekvence krystalu / 12 to znamená že ti = 1/vi je doba, kterou trvá vykonání instrukce. A právě této doby my využíváme. Do registru R0 jsme přiřadili 250 a instrukce DJNZ R0,c1 nám zajistí její snížení o 1 a když je nenulový, skočí na c1 (celkem tedy 250x). Mezi c1 a touto instrukcí jsou však další instrukce zpoždění a tak celkové zpoždění je 250x40x50 = 500 000 instrukcí, které sice nic nedělají, ale trvají 500 000 * 1,3 uS, což je něco přes půl sekundy. Tuto dobu bude také trvat svit, popřípadě zhasnutí LED. Ale jde to i jinak
Přerušení
Jistě si vzpomínáte na minulý díl, kdy jsme hovořili o čítačích/časovačích. Pro náš účel by se hodil časovač v režimu 1 (16-bitový). Využijeme tedy přerušení od přetečení tohoto čítače. Spočítáme-li (9 216 000 / 12) / 65536 = 11,7 , pak víme, že budeme mít necelých 12 přerušení / sekundu. To je na svit blikání led ještě docela dost a tak to softwarově, podobně jako v minulém případě zpomalíme. Celý program pak bude vypadat takto:
ORG 0
jmp start
org 0BH
jmp prerus
org 30H
start:
mov IE,#10000010B
mov TMOD,#00000001B
mov TCON,#00010000B
mov R0,#10
cykl:
nop
jmp cykl
prerus:
djnz R0,ko
cpl p1.7
mov R0,#10
ko: reti
nop
END
EA
Enable all - bit globalne povoluje - 1 (zakazuje - 0) všechna přerušení
ES
Přerušení od sériové linky (vysvětleno někdy později
ET1
Přerušení od časovače 1
EX1
Přerušení ze vstupu INT1 (sestupná hrana nebo nízká úrověň)
ET0
Přerušení od časovače 0
EX0
Přerušení ze vstupu INT0 (sestupná hrana nebo nízká úrověň)
Priorita přerušení
Dalším registrem, jež nastavuje přerušení je IP
S touto znalostí už není těžké jak program funguje. Na adrese 0 (to adresa kam se program dostane po RESETU) je skok na začátek programu. Tam se nastaví čítače a spustí přerušení. Poté již program koluje v nekonečné smyčce, odkud je "přerušován" přerušením od časovače 0. Program skočí na adresu 0BH a odtud jej skok vede na obslužnoou rutinu (podprogram). Návrat zpět do cyklu (a zároveň hlavního programu je způsoben instrukcí RETI.
Komentovat článek
Komentáře k článku
Bohužel jsem z dotazu nepochopil co potřebuješ udělat, ale podívej se do konstrukcí, je tam časomíra pro hasiče, možná to bude něco podobnýho, co potřebuješ
JK VYUŽIJU TOHLE PŘERUŠENÍ KE stopnutí stopek? potřeboval bych to celkem dost nutně diky
JAKO PŘEDNASTAVENÍ Č/Č TREBA 0 SE POUZIVA TH0 (PRO HORNÍCH 8 bitu) A TL0 PRO SPODNICH,JINAK JE ZBYTECNE PSAT PRO SPUSTENI CASOVACE MOV TCON,#... STACI NAPSAT SETB TR0 KAŽDOPÁDNĚ JE PRO 8051 A TYPY JÍ PODOBNÉ LEPŠÍ POUŽÍVAT KRYSTAL 12 MHz NEBO PŘI POUŽITÍ SÉRIOVÝ LINKY 11,0592 MHz...
Zdravím, jako hodnotu přednastavení nelze použít přímo R0. Musí být kopírován přímo do příslušního registru čítače / časovače. Ohledně odkazu. Je pravda, že zde není uvedeno všechno, 8051 je tu tak okrajově. Můžu doporučit http://www.volny.cz/fuksam/ Jinak pak samozřejmě knihu od Skalického.
Dobry den. Je to trosku trapne ale ja mam z neceho takovyho za 14 maturovat... No zajimalo by me jestli casovac 0 bere jako hodnotu prednastaveni registr R0. A jeste bych chtel poprosit jestli nekdo nevite www stranky kde se clovek o tady tech vecech dozvi vic... Predem diky
Zřejmě někdo nečte text, pouze zdrojáky. Program se zacyklí, to ano, ale není pravda, že nic neudělá. Přerušení, které bude vyvoláváno, bude blikat LED, což byl učel :-) Prosím příště nejdříve přemýšlet (a nebo vyzkoušet) a potom psát, že to nebude fungovat: včechny programy co jsou tady jsou vyzkoušeny...
prosím vás hlavně to někdo nepište: Už na první pohled je vidět že se program zacyklí a nic neudělá