Cvičení s mikrokontrolery 8051 Mikrokontrolery řady 8051 Cvičení s mikrokontrolery 8051
Při zadávání dat lze použít kód: binární - B, dekadický – D (označení nepovinné), hexadecimální – H. Kódy jsou si rovnocenné, jen je třeba odlišit označením. Je jen potřeba si uvědomit rozsah použitelných hodnot : pro binární kód je to 00000000B až 11111111B, pro dekadický kód je to 0D až 255D, pro hexadecimální kód je to 00H až FFH
Příklad Přeneste do střadače (akumulátoru) konstantu s dekadickou hodnotou 67. binárně MOV A,#01000011B dekadicky MOV A,#67D nebo MOV A,#67 hexadecimálně MOV A,#43H Pokud se používá hexadecimální kód, pak při použití čísel 0 – 9 je normální zápis. Začíná-li operand, tj. je-li prvé číslo písmenem (A,B,C,D,E,F), pak by použitý překladač (CASS51) nerozuměl a je nutno před písmeno vždy přidat nulu!
Příklad správně 05H, 0AH, 2CH, 48H, 0FFH špatně FFH, A0H, atd.
Direktivy překladače Direktivy překladače, tzv. pseudoinstrukce - jsou určeny překladači, v překladu se nezobrazí. Je výhodné mít jako první nastavení konstant (jedné či více) pro potřeby odlaďování programu. Proto se před použitím v programu přiřazuje direktivou EQU jméno k hodnotě názvu. Je obdobou operaci deklarace konstant ve vyšších programovacích jazycích.
Příklad HOP EQU 05H KONST1 EQU 0FH atd. MOV R1,#HOP : MOV 06H,#KONST1 MOV R5,#HOP
Takovéto přiřazení je velmi vhodné při krokování programem, kdy nemusíme hledat konstanty (například počty cyklů pro čekání, které pro urychlení potřebujeme zkrátit na minimum). Po odladění programu pak přehledně nastavíme hodnoty na původní velikosti.
Rozlišení instrukcí a komentářů Komentář se liší od instrukcí odliší tím, že před komentářem napíšeme středník. Pokud nechceme v daném programu rovnou některé instrukce vypustit, protože si nejsme jisti zda jsou vhodné, pak též místo odstranění lze napsat před instrukci středník a ta bude považována za komentář. Příklady MOV A,#05H ;zapsání konstanty do střadače (komentář je zde textovou částí) ; CPL A (instrukce je brána jako komentář a bude ignorována)
Práce s porty Přenos dat na port O činnosti se lze se přesvědčit tak, že budeme rozsvěcet či zhášet diody LED. To lze realizovat jen před oddělovací obvod například 74LS245. Výstupy z procesoru ani tento obvod však nemají schopnost přivést dostatek energie při úrovni H na diodu LED aby se rozsvítila (výstup má možnost dát cca 0,16 mA). Toto lze obejít, protože obvod má možnost při úrovni L sepnout až 15 mA. Proto se používá zapojení dle následujícího obrázku. Pro rozsvícení diody LED je však potřebná úroveň L.
MOV P3,#01100010B tam kde je 0 bude svítit dioda a naopak Čtení portu Příklad MOV P1,#0F0H 1111 0000 nesvítí svítí nebo MOV P3,#01100010B tam kde je 0 bude svítit dioda a naopak
Tato činnost se skládá z několika kroků Tato činnost se skládá z několika kroků. Nejprve je třeba zajistit úroveň H na vývodech snímaného portu. To se realizuje instrukcí : MOV P3,#0FFH. Poté vnějšími spínači na výstupu portu můžeme zajišťovat úroveň L (zkratováním výstupu portu – port se nezničí, je na to konstruován!). Zapojení viz následující obrázek.
zápis do portu Následně se provede čtení stavu portu instrukcí a přenos sejmutých dat například do střadače. MOV A,P3
Čtení a zápis na portech Čtení stavu portu P3 a přenos dat na výstup P1. Na port P1 se dle výše uvedeného příkladu připojí diody LED, na port P3 se připojí spínače. Zapojení viz na následujícím obrázku. Čtení a zápis na portech
Proto, aby bylo možno sledovat data v neinverzním režimu (aby platilo P3.x = H a P1.x svítí LED a naopak) je nezbytné data invertovat a teprve pak poslat na port P1. Celý sled instrukcí je následující : MOV P3,#0FFH ; zajištění úrovně H na portu P3 MOV A,P3 ; přenos dat z P3 do střadače CPL A ; invertování dat z portu P3 MOV P1,A ; přenos dat ze střadače na port P1
V případě, že potřebujeme průběžně sledovat děje na portu P3, pak musíme zajistit opakování pomocí smyčky : MOV P3,#0FFH NAV: MOV A,P3 CPL A MOV P1,A JMP NAV ; skok na nový cyklus testu P3
Vytvoření časového intervalu Časový interval lze vytvořit podle okolností několika způsoby : vnitřní : vložením prázdných instrukcí (NOP) jen pro velmi malá zpoždění pomocí jednoduché či vícenásobné smyčky a instrukce DJNZ pomocí časovače vnější časování – pomocí externích hodinek
Vložením prázdných instrukcí MOV A,#05H NOP NOP zpoždění pro každé NOP je cca (12/11,059) ms, dáno frekvencí oscilátoru CPL A
Pomocí jednoduché smyčky MOV R3,#08H ; přednastavení počtu cyklů : TIME: DJNZ R3,TIME ; smyčka skáče sama na sebe MOV R3,#08H ; hodnota v R3 se obnovuje jen v případě, že bude tento cyklus ještě použit JMP ZPET ; skok zpět na pokračování programu
MOV R3,#05H ; přednastavení počtu cyklů (5x160=800 cyklů) maximálně Pomocí 2 smyček nebo vícenásobné smyčky (zde se časy jednotlivých pulsů násobí) MOV R3,#05H ; přednastavení počtu cyklů (5x160=800 cyklů) maximálně MOV R4,#0A0H ; v tomto případě 65536 cyklů, pro větší počet, pak ještě další zacyklení TIME: DJNZ R3,TIME MOV R3,#05H DJNZ R4,TIME MOV R4,#0A0H JMP ZPET
POZOR. Skoky pomocí DJNZ lze provádět jen v omezeném rozsahu (rel), tj POZOR! Skoky pomocí DJNZ lze provádět jen v omezeném rozsahu (rel), tj. ±127 adres! Poznámka. Po dobu takovéhoto čekání je procesor nevyužitelný!
Pomocí časovače Zde je nezbytné si uvědomit, že je třeba : musí se povolit přerušení vybrat který čítač/časovač (0 nebo 1) se bude používat a v jakém režimu bude pracovat (pro delší časy pak jen mód 1) – nastaví se v TMOD, ale nelze to provést bitově! provést přednastavení délky času nastavením doplňku (délka se odvozuje od přetečení čítače/časovače) spuštění čítání je potřebný podprogram pro obsluhu přerušení od časovačů (pro mód 1 obsluha T0,T1)
Povolení přerušení Je třeba nastavit registr IE (Interrupt Enable) pro čítač/časovač 0 je nastavení MOV IE,#82H pro čítač/časovač 1 je nastavení MOV IE,#88H pro oba čítače/časovače je nastavení MOV IE,#8AH
Volba módu a volba čítače nebo časovače pokud se nastaví x = 0, pak je navolen časovač x = 1, pak je navolen čítač (vnější události) G – závisí na dalších podmínkách, většinou stačí nastavit signál 0 (po RESETu)
Příklad Nastavit časovač 0 v módu 1 MOV TMOD,#01H nastavit čítač 1 v módu 1 MOV TMOD,#50H nastavit čítač 0 v módu 1 a časovač 0 v módu 2 MOV TMOD,#25H
Přednastavení délky čítání Lze buď vypočítat pracně doplněk a naplnit oba registry Příklad Zapište do registrů čítače/časovače takovou hodnotu, aby načítal 300 pulsů a poté došlo k vyvolání přerušení MOV TL0,#0D3H MOV TH0,#0FEH Nebo se lze spolehnout na překladač, který toto dopočítá sám a bez problémů pomocí direktiv.
Příklad Stejné zadání jako v předchozím případě MOV TL0,#LOW (0FFFFH- 300D) MOV TH0,#HIGH (0FFFFH-300D) Překlad do hexaformátu dopadne v obou případech stejně
Spuštění čítání Čítání lze spustit tak, že budeme vypisovat buď celý byte, nebo použijeme bitové operace. Pomocí registru TCON lze spustit oba čítače/časovače pokud je to nezbytně nutné naráz a též naráz zastavit. Podle toho, který čítač časovač chceme spustit, nastavíme na příslušný bit 1. Okamžitě po nastavení se spustí příslušný čítač/časovač, případně oba dva.
Pro spuštění čítače/časovače 0 je to instrukce MOV TCON,#10H pro spuštění obou čítačů/časovačů je to instrukce MOV TCON,#50H Místo MOV lze použít v řadě případů výhodněji ORL Bitové operace pro spuštění čítače/časovače spustit čítač/časovač 0 SETB TR0 spustit čítač/časovač 1 SETB TR1 Spustit oba čítače/časovače naráz pomocí bitových operací nelze!
Běh časového intervalu Pokud má běžet čas při běhu programu, pak není nutná žádná další přídavná část programu. Program běží a po vypršení určeného počtu pulsů dojde k přerušení, kde se vykoná potřebná činnost. Pokud však program čeká na ukončení intervalu, pak je třeba vytvořit čekací smyčku. Příklad Příklad čekací smyčky TIME: JMP TIME V tomto případě skáče příkaz sám na sebe.
Po přetečení čítače (v obou případech musí být připravena obsluha přerušení čítače/časovače. Obslužný program pro přerušení čítačem/časovačem V okamžiku přerušení provede program skok na adresu 0BH (čítač/časovač0) nebo 1BH (čítač/časovač1)Na této adrese bude pak ležet první instrukce obsluhy přerušení. Zřejmě jako první instrukce by mělo být zastavení čítačů/časovačů a to buď pomocí registru TCON (obou naráz), nebo pomocí bitových operací.
Příklad zastavení obou čítačů/časovačů naráz MOV TCON,#00H zastavení čítače/časovače 0 bitovou operací CLR TR0 zastavení čítače/časovače 1 bitovou operací CLR TR1 Na místo MOV TCON,#00H lze použít ANL TCON,#0AFH
Další instrukcí se musí zajistit činnost po uplynutí času a následně opustit tento obslužný podprogram instrukcí RETI, která obnovuje SFR IE. V tom okamžiku dojde k návratu PC na adresu na které došlo k přerušení (adresa je totiž uložena v SP většinou na adresách 08H (nižší řády adresy) a 09H (vyšší řády adresy). V případě, že nutno začít na jiné adrese, než má zdroj přerušení, pak je třeba přepsat obsah zásobníku (tj. obsah adres 08H a 09H) a teprve pak napsat instrukci RETI.
Příklad Návratová adresa je 1234H (je to například čekací smyčka). Na adrese 08H jsou uloženy NŘ adresy t.j 34H Na adrese 09H jsou uloženy VŘ adresy t.j 12H. Potřebujete však pokračovat po ukončení obslužného podprogramu na adrese 92H.
Proto je třeba ukončit obslužný podprogram následovně : MOV 08H,#92H MOV 09H,#00H RETI Pokud by totiž nedošlo k přesměrování, pak by program po návratu pokračoval znovu na adrese 1234H a skočil by zpět do čekací smyčky TIME: JMP TIME.
Direktivy překladače Použití direktivy překladače (pseudoinstrukce) SET Podobně jako direktiva (pseudoinstrukce) EQU realizuje přiřazení hodnoty názvu, navíc lze k objektu deklarovaného SET přičítat až do hodnoty FFH.
Program TEXT.ASM
Čtení konstant uložených v paměti ROM – s použitím instrukce MOVC A,@A+DPTR Naprogramování konstant do ROM pomocí direktivy (pseudoinstrukce) DB pro generování kombinací v programu HAD. Do tabulky vytvořené v části paměti ROM při psaní programu se zapíší za direktivu DB jednotlivé byty oddělené čárkou podle potřeby, maximálně po 8-mi bytech na řádek (za DB). Příklad Použití direktivy překladače (pseudoinstrukce) DB. Vytvořte světelného hada jehož jednotlivé kroky se budou vyčítat z tabulky konstant v ROM.
Program HAD.ASM
Uvedená tabulka je ilustrační a neodpovídá vlastnímu zápisu ve zdrojovém programu s příponou .ASMH. Tam se zapisují z uvedené tabulky jen „návěští“ a „instrukce“ ale navíc ještě komentáře !!! Překladač po přeložení vytvoří soubor s příponou .PRN, ve kterém pak k uvedeným sloupcům ještě zobrazí sloupce „adresa“ a „strojní kód“ Poznámka : Standardní překladače vyžadují soubor s příponou . SRC a vytvářejí soubory s příponou .OBJ a LST. Finální soubor s příponou .HEX pak vytvářejí programy typu LINKER.
Příklad Jiné použití direktivy překladače (pseudoinstrukce) DB. Generujte text v ASCII kódu a vypisujte ho z tabulky konstant uložené („vypálené“) v ROM.
Použití direktivy překladače (pseudoinstrukce) BIT pro bitové operace. Podobně jako direktiva (pseudoinstrukce) EQU se realizuje přiřazení tentokráte názvu bitu. Hodnoty 0 – 127 jsou určeny pro bity adres 20H až 2FH, bity 30H až F0H pro registry SFR, viz mapa vnitřní paměti RWM.