Mikrořadiče Ing. Jaroslav Bernkopf 18. září 2016
1. 2.
OBSAH Úvod .............................................................................................. 4 Architektura počítačů ................................................................. 5
2.1 Architektura Von Neumannova .................................................................5 2.2 Architektura Harvardská ............................................................................6 2.3 Soubory instrukcí .......................................................................................6 2.3.1 2.3.2
3. 4.
CISC .......................................................................................................................6 RISC .......................................................................................................................7
Mikrořadiče 16F84 a 16F883 ..................................................... 8 Blokové schéma ......................................................................... 10
4.1 Popis bloků...............................................................................................10 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.1.10
ALU – Arithmetic and Logic Unit .......................................................................10 W register .............................................................................................................10 RAM File Registers ..............................................................................................10 EEPROM ..............................................................................................................10 Flash Program Memory........................................................................................10 Program Counter ..................................................................................................10 Instruction Decode and Control ...........................................................................11 Timing Generation ...............................................................................................11 Timers...................................................................................................................11 Timer0 – Timer2 ...............................................................................................12
4.2 Rozložení vývodů ....................................................................................14 4.3 Popis vývodů............................................................................................14 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5
5.
Řídicí vývody .......................................................................................................14 Skupina RA ..........................................................................................................14 Skupina RB ..........................................................................................................14 Skupina RC ..........................................................................................................15 Napájecí vývody ...................................................................................................15
Organizace datové paměti RAM 16F883 ................................ 17
5.1 Rozdělení paměti RAM ...........................................................................17 5.1.1
Rozdělení paměti RAM podle účelu a použití .....................................................19
5.2 Význam některých registrů speciálních funkcí .......................................20
6.
Instrukční soubor ...................................................................... 25
6.1 Definice ....................................................................................................25 6.2 Syntaxe asembleru ...................................................................................26 6.2.1 6.2.2 6.2.3
Malá, velká písmena .............................................................................................26 Číselné formáty ....................................................................................................26 Komentáře ............................................................................................................27 2
6.2.4
Zkratky .................................................................................................................27
6.3 Instrukce aritmetických a logických operací ...........................................29 6.3.1 6.3.2
Operace s konstantou ...........................................................................................29 Operace s registrem RAM ....................................................................................29
6.4 Instrukce přesunů .....................................................................................31 6.5 Instrukce skoků ........................................................................................32 6.6 Instrukce nulování a nastavení.................................................................33 6.7 Instrukce pro podprogramy a přerušení ...................................................33 6.8 Zvláštní instrukce .....................................................................................34
7.
Úlohy ........................................................................................... 36
7.1 Drát...........................................................................................................36
3
1. Úvod Mikrořadič je integrovaný obvod, který na jednom čipu obsahuje všechny podstatné části počítače: • aritmeticko – logická jednotka • paměť ROM • paměť RAM • vstupy / výstupy Mikrořadič obvykle obsahuje i další části, např. • časovače • hlídací časovač (watchdog) • generátor taktovacího signálu
• • • •
Program mikrořadiče může být uložen v různých variantách paměti ROM: ROM EPROM EEPROM Flash ROM
Paměť ROM se hodí tam, kde se budou vyrábět velká množství řadičů vybavených stejným programem. Její obsah je vytvořen už při výrobě a je neměnný. EPROM vyžaduje speciální vybavení pro mazání starého obsahu ultrafialovým světlem, a programátor, kterým se naprogramuje nový obsah. EEPROM se hodí pro menší kapacity a nepříliš časté přepisování. Je pomalá a počet přepisovacích cyklů je omezený. Flash ROM se hodí pro velké kapacity. Je rychlejší než EEPROM a umožňuje větší počet přepisovacích cyklů.
4
2. Architektura počítačů 2.1 Architektura Von Neumannova Počítač s Von Neumannovou architekturou má jen jedinou sběrnici, která je společná jak paměti pro data, tak paměti pro program. Sběrnice je obousměrná, tj. umožňuje čtení z paměti i zápis do ní. Program i data dokonce mohou sídlit v jediné společné paměti. Takto jsou uspořádány např. osobní počítače.
Obrázek 1: Von Neumannova architektura počítače
5
2.2 Architektura Harvardská Počítač s Harvardskou architekturou má samostatné paměti jak pro program, tak pro data. Každá z těchto pamětí má samostatnou sběrnici. Sběrnice pro program je jen jednosměrná, tj. umožňuje jen čtení z paměti, ale ne zápis do ní. Tak jsou uspořádány nejznámější jednočipové mikropočítače (např. 8051) a mikrořadiče (např. 16F883).
Obrázek 2: Harvardská architektura počítače Von Neumannova Harvardská Umístění instrukcí a dat V jediné společné paměti Ve dvou oddělených pamětech Přepsání programu jeho vlastní Je možné Není možné činností Současné vyzvednutí instrukce a Není možné Je možné dat Rychlost Menší Větší Složitost, počet propojení Menší Větší Tabulka 1: Porovnání vlastností Von Neumannovy a Harvardské architektury
2.3 Soubory instrukcí Procesory a řadiče jsou řízeny programem, který se skládá z jednotlivých pokynů – instrukcí. Při tvorbě programu programátor používá instrukce k naprogramování činností, které má přístroj provádět.
2.3.1 CISC CISC = Complex Instruction Set Computer – počítač se složitým instrukčním souborem. Procesor disponuje mnoha desítkami instrukcí. Programátor musí tyto instrukce zvládnout, musí se je naučit, což je náročné. Na druhou stranu jsou ale mnohé instrukce velmi výkonné, takže jedna taková instrukce nahradí několik jednodušších. Instrukce bývají specializované tak, že některé pracují jen s určitými registry1, jiné zase s jinými registry.
1
Buňky paměti RAM uvnitř procesoru se často nazývají registry.
6
Při programování ve vyšších jazycích (např. C, Pascal) nejsou výkonné instrukce CISC příliš využity, protože překladač z vyššího jazyka do strojového kódu stejně pro složitější operace nepoužije výkonné, ale pomalé instrukce CISC, ale rozepíše tyto operace pomocí rychlých jednoduchých instrukcí. Procesor je složitý a má velkou spotřebu. Kvůli složitosti je obtížné dosáhnout velké rychlosti zpracování instrukcí. Procesory CISC obvykle používají Von Neumannovu architekturu. Ta procesoru umožňuje zapisovat jak do paměti dat, tak do paměti programu. To lze využít např. k tomu, aby program svojí činností změnil sám sebe.
2.3.2 RISC RISC = Reduced Instruction Set Computer – počítač s omezeným instrukčním souborem. Procesor disponuje malým souborem instrukcí. Programátor se je snadno naučí, proto je snadné s takovým procesorem začít pracovat. Soubor instrukcí je ortogonální (nebo také symetrický). To znamená, že je možné většinu instrukcí provádět na kterémkoliv registru. Instrukce nevyžadují žádné speciální podmínky, výjimky, omezení, nemají žádné vedlejší vlivy. Proto je práce s nimi snadná a nezáludná. Programy vzniklé ve vyšších programovacích jazycích (např. C) jsou s RISC rychlé a účinné. Procesor je jednoduchý. Čip má malou plochu, málo vývodů, proto je levný. Spotřeba je malá. Instrukce jsou sice méně „chytré“, ale zato se vykonávají rychle. Procesory RISC obvykle používají Harvardskou architekturu. Ta umožňuje současný přístup k programu i k datům a současné vykonávání některých operací (overlapping – překrývání).
7
3. Mikrořadiče 16F84 a 16F883 PIC 16F84 a 16F883 jsou typickými představiteli jednoduchých, ale výkonných mikrořadičů. Základní vlastnosti: Parametr 16F84 16F883 Technologie CMOS CMOS Počet vývodů 18 28 Počet instrukcí 35 35 Počet cyklů na instrukci (všechny kromě větvení) 1 1 Počet cyklů na instrukce větvení 2 2 Šířka instrukcí 14 bitů 14 Šířka datové sběrnice 8 bitů 8 Kapacita paměti programu [kB] 1,75 7 Kapacita paměti programu [kslov] 1 4 Kapacita paměti RAM [B] 68 256 Kapacita paměti EEPROM [B] 64 256 Počet speciálních funkčních registrů (SFR) 15 Víc, přibyly funkce Počet vstupů / výstupů 13 25 Počet vstupních analogových kanálů 0 11 Počet A/D převodníků 0 1 Možnost vlastního zápisu do paměti programu Ne Ano ICD – In-Circuit Debugger Ne Ano Programově nastavitelný kmitočet interního oscilátoru --32 kHz – 8MHz Hloubka HW sklípku 8 8 Programování Sériové přes dva vývody Napájecí proud (5 V, 4 MHz) < 2 mA < 1,4 mA (2 V, 32 kHz) 15 μA < 19 μA (2 V, standby) < 1μA 50 nA Cena (18. září 2016) 3,50 USD 2,20 USD
8
Oba řadiče dále obsahují tyto obvody: • Oscilátor nastavitelný do čtyř módů činnosti • Časovač s nastavitelnou předděličkou • Obvod pro resetování při náběhu napájení (Power – on Reset) • Časovač pro nabíhání oscilátoru (Oscillator Start-up Timer) • Časovač pro náběh napájení (Power-up Timer) • Hlídací časovač (Watchdog) Řadič 16F883 obsahuje tyto další obvody: • Vestavěný oscilátor • Komparátory • A/D převodník • Moduly pro sériovou komunikaci RS-485, RS-232 SPI, I2C
9
4. Blokové schéma Blokové schéma uvedené na obrázku dále je velmi zjednodušené. Sběrnice jsou naznačené šipkami, které jsou jednosměrné tam, kde je přenos jednosměrný (např. přenos adres), obousměrné tam, kde je přenos obousměrný (např. přenos dat). Skutečné sběrnice uvnitř mikrořadiče jsou mnohem komplikovanější a nedají se jednoznačně rozdělit na adresové, datové, řídicí.
4.1 Popis bloků 4.1.1 ALU – Arithmetic and Logic Unit Aritmeticko – logická jednotka. Je to obvod, ve kterém se provádějí aritmetické a logické operace. Do těchto operací mohou vstupovat data z registrů SFR a GPR, ze kterých se skládá paměť RAM (viz dále) a data z registru W. Výsledky operací se mohou uložit do SFR a GPR, nebo do registru W.
4.1.2 W register W register (Working register = pracovní registr) je osmibitový pracovní registr používaný pro operace v aritmeticko logické jednotce. Při operacích, do kterých vstupují dva operandy, obvykle jeden operand je v pracovním registru (W), druhý operand je v registru v paměti RAM. Druhý operand může také být konstanta, kterou do programu vložil už programátor. Výsledek aritmetické nebo logické operace může být vložen do pracovního registru (W) nebo do registru RAM.
4.1.3 RAM File Registers Registry, RAM. Blok zahrnuje speciální funkční registry (Special Function Registers – SFR) a registry pro všeobecné účely (General Purpose Registers – GPR). Registry mohou vstupovat jako operandy do aritmetických a logických operací, a výsledky těchto operací mohou do nich být uloženy. SFR slouží k nastavení různých módů činnosti. Ovlivňují stav a činnost ostatních částí řadiče. Např. registr TRISA určuje, zda jednotlivé vývody portu A budou vstupy nebo výstupy. SFR jsou na adresách 0 – 0BH, 80H – 8BH. GPR slouží ke krátkodobému uložení informací. Je jich 68 a jsou na adresách 0CH - 4FH.
4.1.4 EEPROM Je to paměť dat typu EEPROM. Obsahuje 64 paměťových buněk po 8 bitech na adresách 0 - 3FH. Tyto adresy nepatří do stejného prostoru jako adresy SFR a GPR. Buňky paměti dat nelze adresovat přímo, nelze ani přímo číst a přepisovat jejich obsah. Toto vše se musí dělat prostřednictvím pomocných registrů EEADR (přenáší adresu) a EEDATA (přenáší data). Druh operace je při tom určen registry EECON1, EECON2 (nejsou na blokovém schématu).
4.1.5 Flash Program Memory Přepisovatelná ROM paměť programu. Obsahuje 1024 míst po 14 bitech. Dá se naprogramovat pomocí jednoduchého programátoru, nebo přímo v zařízení, ve kterém je řadič použit.
4.1.6 Program Counter Čítač instrukcí programu. Po vykonání každé instrukce programu zvyšuje svůj stav o jedničku, a tak ukazuje na další instrukci programu, která se má vykonat. Výjimkou jsou 10
instrukce větvení, po kterých může dojít ke skokové změně stavu čítače, a tím ke skoku do jiného místa programu.
4.1.7 Instruction Decode and Control Dekódování instrukcí. Zde se každá instrukce rozepíše na podrobné pokyny pro jednotlivé bloky, jak mají instrukci provést.
4.1.8 Timing Generation Časování. Obsahuje obvody, které s pomocí vnějších součástí (R, C, krystal) mohou generovat taktovací kmitočet. Nebo lze bez použití vnějších součástí přivádět taktovací kmitočet do vstupu OSC1/CLKIN. Z vývodu OSC2/CLKOUT lze v obou případech taktovací signál odebírat.
4.1.9 Timers a) Power up Timer (PWRT) Časovač při zapnutí. Po zapnutí napájení drží po dobu 72 ms celý řadič ve stavu reset. Tím např. zabrání případnému nežádoucímu zápisu do datové paměti EEPROM.
b) Oscillator Start-up Timer (OST) Po zapnutí napájení drží řadič ve stavu reset, dokud nenaběhne oscilátor. Stav reset se zruší, až když se napočítá 1024 impulsů hodinového signálu. Pokud by napájecí napětí nabíhalo velmi pomalu, nemuselo by toto stačit. V takovém případě je vhodné použít vnější RC obvod, připojený k obvodu Power-on Reset přes vstup MCLR (viz dále).
c) Power-on Reset (POR) Obvod POR generuje resetovací signál vždy, když je na napájecím napětí vzestupná hrana. Připojíme-li vstup MCLR na napájecí napětí, generuje se reset při každém náběhu napájení. Pokud napájení nabíhá velmi pomalu, je vhodné doplnit na vstup MCLR následující RC obvod:
Obrázek 3: RC obvod zajišťující správný start i při pomalém náběhu napájení
d) Watchdog Timer (WDT) Hlídací časovač. (Watch-dog je hlídací pes.) WDT je obvod, který když je aktivován, provede po 18 ms reset řadiče, pokud není do té doby vynulován instrukcí CLRWDT. Umožní to předejít tomu, že by se řadič zaseknul a přestal pracovat. To se může stát např. tak, že program zůstane trčet v nějaké nekonečné smyčce (chyba programátora nebo rušivý impuls v napájecím napětí), nebo přestal fungovat oscilátor (chyba hardwaru). 11
Chceme-li WDT používat, zapneme ho nastavením konfiguračního bitu WDTE na 1. Pak programově vždy nejpozději do 18 ms provedeme instrukci CLRWDT. Pokud tato instrukce do 18 ms nepřijde, WDT provede reset řadiče. To umožní vzpamatování z nežádoucích stavů, po kterých by jinak řadič zůstával v nedefinovaném stavu. Pokud je doba 18 ms příliš krátká, můžeme před WDT programově zařadit předděličku (prescaler). WDT se tedy chová jako znovuspustitelný monostabilní obvod, který je spouštěn instrukcí CLRWDT. Není-li spuštěn včas (do 18 ms), vyvolá reset řadiče. WDT má svůj vlastní integrovaný oscilátor, jehož perioda je dána hodnotami R, C na čipu. Tím je WDT nezávislý na ostatních obvodech řadiče, především na jeho hodinovém kmitočtu. Na druhou stranu to znamená, že doba „18 ms“ nemusí být vždy přesně 18 ms, ale bude záviset např. na teplotě, napájecím napětí, výrobní sérii. Což ale nevadí, protože jde o to, aby se řadič vzpamatoval z havarijního stavu, a nezáleží příliš na tom, zda k tomu dojde o několik ms dříve nebo později. Příklad Mikrořadič má řídit pumpování vody do zásobníku tak, aby v zásobníku byl dostatek vody, ale zároveň aby zásobník nepřetekl. Mikrořadič může být při tom řízen např. takovýmto programem (některé jeho řádky jsou psány jazykem „lidským“, nikoliv tedy v asembleru): ZNOVU:
Hladina dosažena? Ne, zapni čerpadlo. Ano, vypni čerpadlo. CLRWDT Jdi na ZNOVU.
; Vynuluj WDT
Za normálních okolností řadič stále obíhá v této smyčce a zapíná – vypíná čerpadlo tak, aby hladina byla na správné výši. Pokud dojde k takové chybě, která způsobí, že řadič tuto smyčku opustí (např. po neúplném výpadku napájení – brown-out), WDT po 18 ms způsobí reset. Součástí programu po resetu může být např. i přivolání obsluhy.
e) Brown-out Reset Aktivuje se a vyvolá restart při neúplném výpadku napájení.1
4.1.10 Timer0 – Timer2 Osmibitové časovače (timer) a čítače (counter). Mohou počítat události, třeba počet impulzů. Mohou dělit kmitočet, odměřovat časové intervaly.
1
Black-out je výpadek, který vyvolá úplnou (černou = black) tmu. Brown-out je pokles napětí, který způsobí pouze snížení jasu žárovek. Jejich vlákna jsou pak hnědá (= brown).
12
Obrázek 4: Blokové schéma 16F883
13
Vývody 16F883
4.2 Rozložení vývodů1
Obrázek 5: Rozložení vývodů 16F883
4.3 Popis vývodů Většina vývodů má více funkcí. Popíšeme zde jen některé hlavní funkce.
4.3.1 Řídicí vývody OSC1/CLKIN, OSC2/CLKOUT slouží k připojení vnějších součástí, které jsou zapotřebí pro vytvoření vlastního oscilátoru. Vlastní oscilátor může podle zvoleného módu být buď krystalový, nebo RC. OSC1/CLKIN může sloužit jako vstup vnějšího hodinového signálu v případě, že řadič si nevyrábí vlastní hodinový signál, ale bere ho zvenku. OSC2/CLKOUT může sloužit jako výstup hodinového signálu, a to jak v případě vlastního oscilátoru, tak i v případě vnějšího hodinového signálu. MCLR (Master CLeaR – hlavní nulování) resetuje celý řadič. Je aktivní v nule. Po resetu se začíná vykonávat program z paměti programu od jeho první instrukce. VPP Při programování obvodu slouží VPP k přivedení programovacího napětí.
4.3.2 Skupina RA Vývody RA0 – RA4 jsou souhrnně označovány jako PORTA. Mohou být naprogramovány jako vstupy nebo výstupy, a to každý zvlášť. Můžeme naprogramovat libovolnou kombinaci vstupů a výstupů. Např. mohou být vývody RA0, RA2, RA4 jako vstupy, vývody RA1 a RA3 jako výstupy. RA4/T0CKI může být naprogramován také jako vstup čítače TMR0 (T0CKI = Timer ClocK Input).
4.3.3 Skupina RB Vývody RB0 – RB7 jsou souhrnně označovány jako PORTB. Také mohou být naprogramovány jako vstupy nebo výstupy, a to každý zvlášť, podobně jako vývody PORTA. Je-li některý vývod RB naprogramován jako vstup, lze mu programově přiřadit interní tzv. „pull-up“ rezistor, který zajistí úroveň 1 na vstupu v případě, že na něj není nic připojeno (když necháme vstup „ve vzduchu“). RB0/INT je možno naprogramovat jako vstup externího přerušení. 1
PDIP = Plastic Dual In line Package; SOIC = Small-Outline Integrated Circuit 14
RB0-RB7 je možno naprogramovat tak, že při změně stavu na kterémkoliv z nich se vyvolá přerušení. RB6 slouží při sériovém programování obsahu paměti programu jako vstup sériového programovacího hodinového signálu. RB7 slouží při sériovém programování obsahu paměti programu jako sériový vstup dat.
4.3.4 Skupina RC Vývody RC0 – RC7 jsou souhrnně označovány jako PORTC. Také mohou být naprogramovány jako vstupy nebo výstupy, a to každý zvlášť, podobně jako vývody PORTA, PORTB.
4.3.5 Napájecí vývody VSS je zem pro napájení a signály. VDD je vstup pro kladné napájecí napětí.
15
16
5. Organizace datové paměti RAM 16F883 5.1 Rozdělení paměti RAM Datová paměť je (jakoby vodorovnou čarou) rozdělena do dvou oblastí podle účelu a použití: • SFR – Special Function Registers – registry speciálních funkcí • GPR – General Purpose Registers – univerzální registry Další dělicí čáry si můžeme představit svislé, a ty dělí datovou paměť na čtyři stránky (Banks): • Bank 0 – banka 0 • Bank 1 – banka 1 • Bank 2 – banka 2 • Bank 3 – banka 3 Z tabulky (Tabulka 2) je vidět, že celý adresový prostor paměti RAM je od adresy 000H do adresy 1FFH. Pro jeho adresování je tedy zapotřebí 9 bitů: když číslo 1FFH rozepíšeme do binární podoby, dostaneme 1 1111 1111, tj. 9 bitů. Ve čtrnáctibitových instrukcích je ale pro adresu paměti vyhrazeno jen 7 bitů. Instrukce pracující s pamětí tedy mohou přímo adresovat nejvýše do binární adresy 111 1111, tj. 7FH. To podle tabulky (Tabulka 2) odpovídá jen rozsahu banky 0. Abychom se dostali i do bank 1, 2, 3, musíme dodat ještě další dva adresové bity, které rozhodnou o bance, se kterou se bude pracovat. Tyto další dva bity, když se nevejdou do instrukcí, musí být někde jinde. Jsou v registru STATUS, což je jeden z registrů speciálních funkcí SFR (viz dále). Bity číslo 6 a 5 registru STATUS, zvané RP1 a RP0, určují pracovní banku takto: 7 4 3 2 1 0 Číslo bitu 6 5 Název bitu IRP RP1 RP0 TO PD Z DC C
RP1 0 0 1 1
RP0 0 1 0 1
Banka Banka 0 Banka 1 Banka 2 Banka 3
Potřebujeme-li se dostat do jiné banky, musíme předtím nastavit bity číslo 6 a 5 v registru STATUS.
17
Tabulka 2: Organizace datové paměti RAM 16F883
18
Adresa v instrukci RP1 RP0 0 0 0 0 0 0 0 0 0 SFR 0 0 0 0 1 1 1 1 1 Banka 0 0 0 0 1 0 0 0 0 0 GPR 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 SFR 0 1 0 0 1 1 1 1 1 Banka 1 0 1 0 1 0 0 0 0 0 GPR 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 SFR 1 0 0 0 1 1 1 1 1 Banka 2 1 0 0 1 0 0 0 0 0 GPR 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 SFR 1 1 0 0 1 1 1 1 1 Banka 3 1 1 0 1 0 0 0 0 0 GPR 1 1 1 1 1 1 1 1 1 Hex2 Hex1 Hex0 Tabulka 3: Adresy paměti RAM (pro jednoduchost zde nejsou odlišeny adresy, které nejsou použité – viz předchozí Tabulka 2)
Hex 000 01F 020 07F 080 09F 0A0 0FF 100 11F 120 17F 180 19F 1A0 1FF
5.1.1 Rozdělení paměti RAM podle účelu a použití a) SFR – Special Function Registers Registry speciálních funkcí se používají pro řízení činnosti řadiče. Změnou jejich obsahu tedy můžeme programově měnit činnost řadiče. Registry speciálních funkcí jsou na adresách 00-1FH, 80H-9FH, 100H-10FH, 180H-18FH. Do některých registrů SFR je přístup ze všech bank, např. do registru STATUS, pomocí kterého se mimo jiné přepíná mezi bankami. Příklad Obsahem registru TRISB se určí, které vývody RB budou vstupy a které výstupy. Určitý bit registru nastavený na jedničku znamená, že odpovídající vývod bude pracovat jako vstup. Nastavení bitu na nulu znamená, že odpovídající vývod bude pracovat jako výstup. Např. zapíšeme-li do registru TRISB číslo 7BH (tj. 0111 1011 binárně), bude nastavení vývodů RB následující:
19
Vývod RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 RB Bit registru TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 TRISB Hodnota 0 1 1 1 1 0 1 1 bitu TRISBx Funkce vstup vstup vstup vstup výstup vstup vstup vývodu výstup RBx Tabulka 4: Příklad určení typu vstupu / výstupu pro vývody portu B
b) GPR – General Purpose Registers Univerzální registry slouží jako paměť RAM pro krátkodobé uložení informací. U řadiče 16F883 tyto registry leží na adresách 20H-7FH, A0H-EFH, 120H-16FH. Registry na horních adresách bank 1, 2, 3 nejsou plnohodnotné, neboť tyto adresy ukazují do horní oblasti banky 0. Pokročilejší programátoři toho mohou využít, umožní jim to ušetřit přepínání mezi bankami. Začátečníci se těmto adresám raději vyhnou. Začátečníci by měli vystačit s bankou 0 a do banky 1 se přepínat, jen když je to nezbytně nutné, např. při programování vstupů – výstupů pomocí registrů TRISA, TRISB, TRISC.
5.2 Význam některých registrů speciálních funkcí INDF, Indirect Address, nepřímá adresa, 00H, 80H, 100H, 180H Není to fyzický registr. Při zápisu do něj nebo čtení z něj je k operaci použit registr, jehož adresa je v registru FSR. Tím je umožněno tzv. nepřímé adresování, při kterém není nutno adresu znát už při psaní programu, ale je možno ji vypočítat až za běhu programu. Kdybychom např. chtěli vynulovat deset vzájemně sousedících registrů, bez nepřímého adresování bychom při jejich nulování museli ve svém programu postupně „vyjmenovat“ všechny jejich adresy. S nepřímým adresováním zadáme ve svém programu adresu počátečního registru, počet nulovaných registrů, a pak necháme smyčku programu, aby postupně vypočítala adresy dalších nulovaných registrů.
TMR0, Timer / Counter, Časovač / Čítač, 01H, 101H Osmibitový čítač, jehož vstup může být připojen buď na interní signál (pak se mu říká časovač), nebo na externí signál (pak se mu říká čítač). Před něj je možno zařadit programovatelnou předděličku, která může dělit v poměru 1:2 až 1:256. TMR0 je možno naprogramovat tak, že při přetečení, tj. při přechodu ze stavu FFH do stavu 00H vyvolá přerušení.
Až sem byl zatím text aktualizován a doplněn o údaje 16F883 12.10.2016 OPTION, Volba, 81H Nastavením jeho bitů je možno ovládat předděličku, vnější přerušení, čítač – časovač, pull-up rezistory na portu PORTB. 20
7 RBPU
6 INTEDG
5 T0CS
4 T0SE
3 PSA
2 PS2
1 PS1
0 PS0
Význam některých bitů Bit 0 – bit 2: Prescaler Rate Select – výběr dělicího poměru předděličky. Osm možných kombinací těchto tří bitů umožňuje výběr z osmi různých dělicích poměrů předděličky (2, 4, 8, 16, 32, 64, 128, 256). Bit 3: Prescaler Assignment – přiřazení předděličky. Přiřazuje předděličku buď před čítač / časovač TMR0, nebo před hlídací časovač WDT. Bit 5: TMR0 Clock Source Select – výběr zdroje hodin pro časovač TMR0. Připojuje vstup časovače TMR0 buď k vývodu RA4 / T0CKI, nebo na vnitřní hodiny (CLOCKOUT). Bit 7: PORTB Pull-up Enable – aktivace interních rezistorů, které připojí vstupy portu B na kladné napájecí napětí.
PCL, Program Counter Low, nižší část programového čítače, 02H, 82H Nižších 8 bitů programového čítače. Jeho přepsáním je možno způsobit skok na adresu, která nebyla známa v době psaní programu, ale je výsledkem výpočtu (Computed GOTO).
STATUS, Stav, 03H, 83H Tři bity registru STAUS obsahují informaci o stavu ALU, nebo jinak řečeno o výsledku minulé operace : Zda výsledek byl nulový a zda při něm došlo k přenosu / výpůjčce. Dva bity informují o činnosti instrukce SLEEP a WDT. Dva bity jsou použity pro nastavení stránky paměti. 7 IRP
6 5 RP1 RP0 Register Bank Select
4 TO/ Time-out
3 PD/ Powerdown
2 Z Zero
1 DC Digit Carry
0 C Carry
Význam některých bitů Bit 0: Carry – přenos. Nastaví se na 1, když při sčítání dojde k přetečení (výsledek je větší než 255), když při odčítání dojde k podtečení (výsledek je menší než 0). Tento bit se také účastní operací rotace při instrukcích RRF, RLF. Bit 2: Zero – nula. Nastaví se na 1, když výsledkem aritmetické nebo logické operace je nula. Bit 5: Register Bank Select – výběr banky. Je-li jeho hodnota 0, směřují operace s pamětí do banky 0. Je-li jeho hodnota 1, směřují operace s pamětí do banky 1. Bit 6: Register Bank Select – výběr banky. U 16F84 není využit. Má být udržován na hodnotě 0, aby programy byly kompatibilní s vyššími verzemi mikrořadičů, které ho budou využívat.
21
FSR, File Select Register, registr pro výběr místa v paměti, 04H, 84H Viz výše odstavec o INDF.
PORTA, Port A, 05H Pětibitový registr, spojený s příslušnými vnějšími vývody. Tři jeho bity nejsou využity. Funkce jednotlivých vývodů (vstup / výstup) se programuje nastavením bitů registru TRISA.
TRISA, TRI State A, 85H Nastavením jeho bitů se nastavuje funkce vývodů PORTA. Použití obdobné jako u registru TRISB, jehož funkce byla vysvětlena v příkladu výše.
PORTB, Port B, 06H Osmibitový registr, spojený s příslušnými vnějšími vývody. Funkce jednotlivých vývodů (vstup / výstup) se programuje nastavením bitů registru TRISB.
TRISB, TRI State B, 86H Viz popis TRISA a příklad o programování PORTB výše.
22
EEDATA, EEprom DATA, 08H Před zápisem do EEPROM umístíme do tohoto registru hodnotu, která se má zapsat. Při čtení z EEPROM se v tomto registru objeví čtená hodnota.
EEADR, EEprom ADdRess, 09H Před zápisem do EEPROM umístíme do tohoto registru adresu, na kterou se má zapsat. EEPROM řadiče 16F84 má kapacitu 64 bajtů s adresami 00H – 3FH. Uvedené adresy nejsou součástí adresového prostoru paměti RAM. Proto mohou mít stejné hodnoty jako adresy některých registrů SFR, GPR.
EECON1, EEprom CONtrol 1, 88H Registr, jehož bity se řídí zápis a čtení do/z EEPROM. Bit WREN (WRite ENable) musí být nastaven před zápisem do EEPROM. Použijeme ho tak, že před zápisem do několika buněk EEPROM ho nastavíme, zapíšeme do buněk, a po skončení zápisu do poslední buňky ho vynulujeme. Bit WR (WRite) dává povel k vykonání jednoho zápisu do jedné buňky EEPROM. Po skončení zápisu je WR automaticky hardwarově vynulován. Před zápisem do další buňky se tedy musí znovu nastavit. Aby zápis byl možný, musí být nastavený WREN (viz výše). Bit RD (ReaD) dává povel k vykonání jednoho čtení z jedné buňky EEPROM. Po skončení čtení je RD automaticky hardwarově vynulován. Před čtením z další buňky se tedy musí znovu nastavit.
EECON2, EEprom CONtrol 2, 89H Před zápisem do každé buňky EEPROM je nutno zapsat do EECON2 hodnotu 55H a potom 0AAH. Zápis do EEPROM je tak jištěn několikerým způsobem, aby nedošlo k nechtěnému přepsání jejího obsahu.
Příklady užití EECON1, EECON2 Čtení z EEPROM BCF MOVLW MOVWF BSF BSF BCF MOVF
STATUS, RP0 CONFIG_ADDR ; EEADR STATUS, RP0 EECON1, RD STATUS, RP0 EEDATA, W
; Bank 0 ; Address to read ; Bank 1 ; EE Read ; Bank 0 ; W = EEDATA
23
Zápis do EEPROM ; v EEADR je připravená adresa ; v EEDATA je připravená hodnota, která se má zapsat BSF STATUS, RP0 ; Bank 1 BCF INTCON, GIE ; Disable INTs. BSF EECON1, WREN ; Enable Write MOVLW 55h ; MOVWF EECON2 ; Write 55h MOVLW AAh ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit ; begin write BSF INTCON, GIE ; Enable INTs.
PCLATH, PC LAtch High, 0AH, 8AH Registr PCLATH je určen spíše pro budoucí použití u řadičů, které budou mít větší paměť pro program. U řadiče 16F84 tento registr použijeme jen při tvorbě pokročilých programů.
INTCON, INTerrupt CONtrol, 0BH, 8BH Pět bitů povoluje / zakazuje všechny druhy přerušení, které 16F84 umožňuje. Tři bity obsahují tzv. příznaky (flags), které informují o tom, zda k určitému přerušení došlo nebo ne.
Aktualizováno 14/10/16 začátek
24
6. Instrukční soubor 6.1 Definice asembler
jazyk, ve kterém píšeme program pro mikrořadič program (překladač), který překládá zdrojový program (napsaný v asembleru – jazyku) do strojového kódu instrukční doba, za kterou se vykoná většina instrukcí; má délku čtyř period signálu cyklus oscilátoru komentář text uvozený středníkem, který slouží jako nadpis nebo vysvětlivka návěští označení místa v programu, které je cílem skoku nebo volání podprogramu podprogram část programu, která se v paměti programu vyskytuje jen jednou, ale během vykonávání programu se vykonává víckrát pomocí volání instrukcí CALL nebo pomocí přerušení programátor • člověk tvořící program • zařízení na programování PROM, EPROM, řadičů překladač program, který překládá zdrojový program do strojového kódu přerušení přerušení vykonávaného programu a skok na program obsluhy zařízení, které si přerušení vyžádalo sklípek paměť, do které se ukládá návratová adresa při přerušení smyčka část programu, která se díky zpětné vazbě (skoku z konce na začátek) vykonává opakovaně strojový program, jehož instrukce jsou v podobě binárních čísel tak, že je řadič může kód přímo vykonávat syntaxe pravidla „pravopisu“ programovacího jazyka zdrojový program napsaný v asembleru program • •
25
6.2 Syntaxe asembleru Aby počítač rozuměl zdrojovému programu a byl schopen přeložit ho pomocí překladače do strojového kódu, musí být zdrojový program napsán podle přesných pravidel.
6.2.1 Malá, velká písmena V programu můžeme používat velká i malá písmena. Při psaní instrukcí a čísel jsou si malá i velká písmena rovnocenná. Příklad MOVLW 0xD2 movlw 0xd2 Movlw 0Xd2 jsou tytéž instrukce. Při psaní návěští můžeme rovněž používat malá i velká písmena, ale překladač je v tomto případě „case sensitive“, tj. rozlišuje malá a velká písmena. Příklad Pokud v programu použijeme slovo „znovu“ jako návěští na začátku smyčky, a dále pak slovo „Znovu“ v příkazu skoku na začátek smyčky, znovu:
movlw b'10111110' ..... ..... goto Znovu
ohlásí překladač chybu, protože „znovu“ a „Znovu“ jsou pro něj dvě různá slova.
6.2.2 Číselné formáty Pro vyjádření čísla můžeme v asembleru použít tři číselné soustavy: Desítková – dekadická soustava Číslo v desítkové soustavě uvedeme písmenem D a vlastní číslo uzavřeme mezi apostrofy, například D‘169‘. Po instrukci MOVLW D‘169‘ tedy v registru W bude hodnota 169. Dvojková – binární soustava Číslo ve dvojkové soustavě uvedeme písmenem B a vlastní číslo uzavřeme mezi apostrofy, například B‘10101001‘. Po instrukci MOVLW B‘10101001‘ tedy v registru W bude binární číslo 10101001, tj. 169 dekadicky. Šestnáctková – hexadecimální soustava Číslo v šestnáctkové soustavě je možno vyjádřit třemi způsoby: a) Za číslem uvedeme písmeno H. Pokud číslo nezačíná číslicí, dáme před něj nulu, např. 0A9H. b) Před číslo napíšeme 0x, např. 0xA9. Po instrukci MOVLW 0xA9 nebo MOVLW 0A9H 26
tedy v registru W bude hodnota A9 hexadecimálně, tj. 169 dekadicky. c) Pokud číslo obsahuje jen číslice (a žádná písmena), můžeme je napsat bez úvodního 0x nebo závěrečného H. Po instrukci MOVLW 12 tedy v registru W bude hexadecimální číslo 12, tj. 18 dekadicky. Tento způsob psaní vůbec není vhodný, protože hexadecimální číslo pak působí mylným dojmem, že je dekadické.
6.2.3 Komentáře Komentáře používáme proto, abychom program učinili čitelným a srozumitelným pro toho, kdo na něm bude pracovat po nás, ale i pro sebe, až se k němu po čase vrátíme. Pro označení komentáře používáme znak ; (středník). Text od středníku až do konce řádku je překladačem ignorován, může v něm proto být cokoliv. Komentář může začínat hned na začátku řádku, nebo může následovat za instrukcí. Příklad ; Smyčka, která určuje dobu, po kterou LED svítí MOVLW 0xB1 ; nastavení počáteční hodnoty čítače
6.2.4 Zkratky Konstanta k f d b
Význam konstanta, se kterou instrukce pracuje registr, se kterým instrukce pracuje destination = místo určení; místo, kam se uloží výsledek operace bit; číslo bitu, se kterým instrukce pracuje
k – konstanta Konstanta je veličina, jejíž hodnota se po celou dobu vykonávání programu nezmění. Většinou ji určí programátor už při psaní programu. Adresa v instrukci skoku GOTO a volání podprogramu CALL je také konstanta, která se během vykonávání programu nemění. Při psaní programu v asembleru ji ale neurčuje programátor, ale překladač. Příklad MOVLW
k
MOVLW
D‘58‘ ; vloží do registru W konstantu - číslo 58 (dekadické)
; obecný tvar instrukce pro vložení konstanty do W
f – registr Označuje číslo (adresu) registru, který je v instrukci použit. Příklad CLRF
f
CLRF
0x3A ; vynuluje registr na adrese 0x3A
; obecný tvar instrukce pro nulování registru
d – destination Destination je místo, kam se uloží výsledek operace, kterou instrukce provádí. Instrukce, které pracují s registrem W a zároveň s registrem v paměti RAM, ukládají výsledek do registru W (když d = 0), nebo do registru RAM (když d = 1). 27
V registru, do kterého se výsledek neukládá, zůstává hodnota, která v něm byla před instrukcí. Příklad ADDWF
f, d
; obecný tvar instrukce pro sečtení W a registru
Jsou-li v registrech hodnoty Jméno / adresa registru W 0x3D pak po provedení instrukce ADDWF 0x3D, 0 budou nové hodnoty Jméno / adresa registru W 0x3D zatímco po provedení instrukce ADDWF 0x3D, 1 budou nové hodnoty Jméno / adresa registru W 0x3D
Obsah registru D‘12‘ D‘6‘ ; sečte W a f, výsledek do W Obsah registru D‘18‘ D‘6‘ ; sečte W a f, výsledek do f Obsah registru D‘12‘ D‘18‘
b – bit Určuje číslo bitu, se kterým instrukce pracuje. Příklad BCF
f, b
; obecný tvar instrukce pro nulování jednoho bitu v ; registru
Je-li obsah registru na adrese 0x05 (PORT A) Bit PA7 PA6 PA5 PA4 PA3 PA2 Hodnota 1 0 1 1 1 1 a port je nastavený jako výstup, pak po provedení instrukce BCF 0x05, 3 ; vynuluje bit 3 registru 0x05 bude nový obsah registru na adrese 0x05 (PORT A) Bit PA7 PA6 PA5 PA4 PA3 PA2 Hodnota 1 0 1 1 0 1
28
PA1 1
PA0 0
PA1 1
PA0 0
6.3 Instrukce aritmetických a logických operací 6.3.1 Operace s konstantou Do těchto instrukcí vstupuje konstanta, uváděná v pravé části instrukce, a obsah registru W. Výsledek se ukládá do W. Všechny instrukce této skupiny se vykonají za jeden instrukční cyklus. Slovo „Literal“ zde znamená „číslo“. Zkratka Význam Činnost ADDLW k Add Literal to W Sečte W a k ANDLW k AND Literal with W Provede logický součin mezi odpovídajícími bity W a k IORLW k Inclusive OR Literal with W Provede logický součet mezi odpovídajícími bity W a k SUBLW k Subtract W from Literal Odečte W od k MOVLW k MOVe Literal to W Zapíše k do W XORLW k eXclusive OR Literal with W Provede Exclusive-OR mezi odpovídajícími bity W a k: Pokud jsou odpovídající bity shodné, výsledkem je 0. Nejsou-li shodné, výsledkem je 1. Příklad Je-li v registru W hodnota D‘61‘, pak po provedení instrukce SUBLW D‘71‘ ; odečte W od k bude v registru W hodnota D‘10‘. S konstantou pracuje také instrukce MOVLW k (zápis konstanty do registru W), která je popsaná dále v odstavci o instrukcích přesunů.
6.3.2 Operace s registrem RAM Do těchto instrukcí vstupuje obsah registru RAM, jehož adresa je uvedená v pravé části instrukce, a většinou také obsah registru W. Výsledek se ukládá do W nebo do registru RAM podle hodnoty d, jak bylo popsáno výše. Všechny instrukce této skupiny se vykonají za jeden instrukční cyklus. Slova „File register“ zde znamenají „jeden z registrů paměti RAM“. Zkratka Význam Činnost ADDWF f, d ADD W and File register Sečte W a f ANDWF f, d AND W with File register Provede logický součin mezi odpovídajícími bity W a f COMF f, d COMplement File register Provede komplement (negaci) všech bitů f DECF f, d DECrement File register Dekrementuje f (sníží jeho hodnotu o 1) INCF f, d INCrement File register Inkrementuje f (zvýší jeho hodnotu o 1) IORWF f, d Inclusive OR W with File Provede logický součet mezi register odpovídajícími bity W a f SUBWF f, d SUBtract W from File register Odečte W od f XORWF f, d eXclusive OR W with File Provede Exclusive-OR mezi register odpovídajícími bity W a f: Pokud jsou odpovídající bity shodné, výsledkem je 0. Nejsou-li shodné, výsledkem je 1.
29
Příklad Jsou-li v registrech hodnoty Jméno / adresa registru W 0x3D pak po provedení instrukce IORWF 0x3D, 0 budou nové hodnoty Jméno / adresa registru W 0x3D
Obsah registru B‘0001 1010‘ B‘1000 1011‘ ; logický součet W a f, výsledek do W Obsah registru B‘1001 1011‘ B‘1000 1011‘
30
6.4 Instrukce přesunů Pokud instrukce obsahuje parametr d, výsledek se ukládá • do W když d = 0 • do f když d = 1 Všechny instrukce této skupiny se vykonají za jeden instrukční cyklus. Zkratka Význam Činnost MOVF f, d MOVe contents of File d = 0 ... f se zkopíruje do W, hodnota v f zůstává register beze změny. d = 1 ... nic se nepohne ani nezmění, ale nastaví se příznak Z podle f. MOVLW k Viz výše Viz výše MOVWF f MOVe W to File Zkopíruje W do f, W se nezmění register RLF f, d Rotate Left File register Rotuje obsah f doleva přes bit C stavového registru.
RRF f, d
SWAPF f, d
Rotate Right File register
d = 0 ... výsledek rotace se objeví ve W. f zůstává původní, beze změny. d = 1 ... výsledek rotace je v f. W zůstává původní, beze změny. Rotuje obsah f doprava přes bit C stavového registru.
SWAP nibbles in File register
d = 0, 1 ... jako u RLF Prohodí se levý a pravý půlbajt (nibble) registru f. d = 0, 1 ... jako u RLF
Příklad Jsou-li v registrech hodnoty Jméno / adresa registru W 0x3D pak po provedení instrukce SWAPF 0x3D, 0 budou nové hodnoty Jméno / adresa registru W 0x3D
Obsah registru cokoliv 0xA5 ; prohoď levou a pravou část f, výsledek do W Obsah registru 0x5A 0xA5
31
6.5 Instrukce skoků Po těchto instrukcích dojde k mimořádné*) změně obsahu čítače instrukcí, a to • u instrukce GOTO vždy • u ostatních instrukcí když je splněná testovaná podmínka. Pokud instrukce obsahuje parametr d, • výsledek se ukládá do W když d = 0 • výsledek se ukládá do f když d = 1 Všechny instrukce této skupiny se vykonají • za jeden instrukční cyklus, pokud ke skoku nedojde • za dva instrukční cykly, pokud ke skoku dojde. Jelikož při instrukci GOTO je skok nepodmíněný, trvá tato instrukce dva cykly vždy. Zkratka Význam Popis BTFSC f, b Bit Test of File register, Skip if Testuje bit b registru f, přeskočí další Clear instrukci, když b = 0. BTFSS f, b Bit Test of File register, Skip if Testuje bit b registru f, přeskočí další Set instrukci, když b = 1. DECFSZ f, d DECrement File register, Skip if Dekrementuje f, přeskočí další instrukci, Zero když po operaci f = 0. GOTO k GO TO address k Skočí na adresu k. INCFSZ f, d INCrement File register, Skip if Inkrementuje f, přeskočí další instrukci, Zero když po operaci f = 0. Příklad Část blikacího programu, která zajistí svícení LED, dokud je program ve smyčce: SMYCKA:
DECFSZ GOTO POKRACUJ: • • •
CNT, 1 SMYCKA
Před instrukcí DECFSZ programový čítač PC obsahuje adresu „SMYCKA“. Po instrukci DECFSZ bude: CNT = CNT – 1 W beze změny, protože d = 1 když CNT ≠ 0, PC = adresa SMYCKA+1, tj. ukazuje na instrukci GOTO, která provede skok zpátky na SMYCKA. Program se točí dál ve smyčce. když CNT = 0, PC = adresa POKRACUJ, tj. opuštění smyčky
*)
Po každé „normální“ instrukci se obsah čítače instrukcí zvýší o 1, tj. čítač instrukcí pak ukazuje na následující instrukci. Po instrukci, která uskutečnila skok, se obsah čítače instrukcí změní mimořádně. U instrukcí „obskoků“ se zvýší o 2, u instrukce GOTO skočí na zadanou adresu.
32
6.6 Instrukce nulování a nastavení Tyto instrukce nulují nebo nastavují jednotlivý bit určitého registru (BCF, BSF), nulují celý registr (CLRF, CLRW), nastavují výchozí stav hlídacího časovače (CLRWDT). Všechny instrukce této skupiny se vykonají za jeden instrukční cyklus. Zkratka BCF f, b BSF f, b CLRF f CLRW CLRWDT
Význam Bit Clear in File register Bit Set in File register Clear File register CLeaR Working register Clear WatchDog Timer
Popis Vynuluje bit b registru f. Nastaví na 1 bit b registru f. Vynuluje registr f. Vynuluje registr W. Vynuluje WDT = Watch Dog Timer a předděličku.
Příklad Jsou-li v registrech hodnoty Jméno / adresa registru W 0x3D pak po provedení instrukce CLRF 0x3D budou nové hodnoty Jméno / adresa registru W 0x3D a dále po provedení instrukce CLRW budou nové hodnoty Jméno / adresa registru W 0x3D
Obsah registru B‘0001 1010‘ B‘1000 1011‘ ; vynulování registru 0x3D Obsah registru B‘0001 1010‘ B‘0000 0000‘ ; vynulování registru W Obsah registru B‘0000 0000‘ B‘0000 0000‘
Aktualizováno 13/10/16 konec 6.7 Instrukce pro podprogramy a přerušení Po těchto instrukcích opět dojde k mimořádné změně obsahu čítače instrukcí. Při instrukci CALL program skočí na adresu podprogramu danou parametrem k (např. návěštím) a adresa následující instrukce (návratová adresa) se uloží do sklípku (STACK). Při instrukcích návratu (RETURN, RETFIE, RETLW) se ze sklípku vyzvedne návratová adresa a uloží se do programového čítače (PC = Program Counter). Tím dojde ke skoku (návratu) na instrukci, která následuje po té, která se jako poslední vykonala před skokem na adresu podprogramu. Pokračuje se tedy v práci, která byla předtím rozdělaná. Instrukce RETFIE kromě návratu na návratovou adresu také zajistí povolení dalších přerušení. Během obsluhy přerušení jsou totiž další přerušení zakázána. 33
Instrukce RETLW kromě návratu na návratovou adresu také vsadí do registru W hodnotu k. To umožňuje programu, aby si z obsluhy přerušení přinesl informaci o tom, jak obsluha přerušení proběhla. Všechny instrukce této skupiny se vykonají za dva instrukční cykly. Při všech totiž dochází k mimořádné změně obsahu čítače instrukcí. Zkratka CALL k RETURN RETFIE
RETLW k
Význam CALL subroutine on address k
Popis Uloží do sklípku adresu následující instrukce (= návratovou adresu) a skočí na adresu danou parametrem k. RETURN from subroutine Vyzvedne ze sklípku návratovou adresu, dosadí ji do programového čítače, a tím vyvolá skok (návrat) na tuto adresu. RETurn From Interrupt, Enable Vyzvedne ze sklípku návratovou adresu, interrupts dosadí ji do programového čítače, a tím vyvolá skok (návrat) na tuto adresu. Nastaví bit GIE = General Interrupt Enable v registru INTCON, a tím umožní přijetí dalších přerušení. RETurn with Literal in W Vyzvedne ze sklípku návratovou adresu, dosadí ji do programového čítače, a tím vyvolá skok (návrat) na tuto adresu. Do registru W dosadí hodnotu k.
Příklad Řadič má pravidelně kontrolovat hladinu vody v nádrži. Příslušný podprogram má hladinu změřit a sdělit, zda už hladina dosáhla předepsané úrovně nebo ne. Podprogram může mít dva výstupy. Zjistí-li se, že hladina ještě nedosáhla předepsané úrovně, návrat z podprogramu se provede instrukcí RETLW 0x00 Pokud hladina už dosáhla předepsané úrovně, návrat z podprogramu se provede v jiném místě instrukcí RETLW 0x01 Pokud tedy hladina nedosáhla předepsané úrovně, najdeme v registru W po návratu z podprogramu hodnotu 0, pokud dosáhla, najdeme tam 1.
6.8 Zvláštní instrukce Všechny instrukce této skupiny se vykonají za jeden instrukční cyklus. Instrukce NOP se používá k záměrnému zpomalení chodu programu, nebo, při ručním programování, k vynechání místa v paměti pro případné vložení dalších částí programu. Zpomalení chodu programu může být zapotřebí tam, kde před odebráním stavu vstupu je třeba počkat na ustálení vstupní veličiny. Při programování časové smyčky, která má odměřovat přesný čas, lze vložením prázdných instrukcí jemně doladit délku trvání smyčky. Při ručním programování je největším problémem „rozhrnutí“ dosavadního programu a vložení další části, protože se tím změní adresy skoků a volání. Pokud si v programu necháme prázdná místa, zaplněná jen instrukcemi NOP, můžeme pak tato místa využít ke vložení nových částí. Pokud ale pro psaní a překlad programu používáme počítač, 34
překladač tento problém řeší za nás. Po každé změně programu přepočítá adresy skoků a volání automaticky. Zkratka NOP SLEEP
Význam NO Operation SLEEP
Popis Prázdná operace Přechod řadiče do stavu SLEEP. Vynulování WDT a předděličky.
Příklad Programujeme pravidelné blikání LED. Část programu, která určuje dobu svícení – nesvícení může vypadat takto: ; svícení MOVLW D‘66‘ ; smyčka se má proběhnout 66x MOVWF 0x0D ; registr 0x0D použijeme jako počítadlo DOKOLA: NOP ; vycpávka: prázdné instrukce NOP DECFSZ 0x0D, 1 ; dekrementuj počítadlo, výsledek nech v něm GOTO DOKOLA ; není hotovo? Jedeme dokola! MOVLW
.......
; hotovo, jedeme dál!
Počtem instrukcí NOP můžeme měnit dobu, kterou potrvá jedno proběhnutí smyčky. Velikostí čísla v úvodní instrukci MOVLW měníme počet průchodů smyčkou.
Aktualizováno 14/10/16 konec
35
7. Úlohy 7.1 Drát Funkce Stav jednoho vývodu (vstupu) se programově přenese na jiný vývod (výstup), jako kdyby tyto dva vývody byly propojeny drátem. HW příprava Na vývod č.1 (RA2) připojte přepínač tak, aby v jedné poloze byl vývod připojen na +5V, ve druhé poloze na zem. Na vývod č.2 (RA3) připojte LED tak, aby svítila, když na vývodu bude úroveň H. Rozbor úlohy Na začátku programu je nutno vývod č.1 (RA2) nastavit jako vstup, vývod č.2 (RA3) je nutno nastavit jako výstup. Během činnosti programu se bude stále testovat stav vývodu č.1 a zjištěná hodnota se bude posílat na vývod č.2.
36