Výukový program PIC - od registrů k přerušení

Vyzkoušejte Náš Nástroj Pro Odstranění Problémů





Než se podíváme na drobné podrobnosti programování PIC, bylo by nejprve důležité naučit se několik dobrých programovacích metod.

Porozumění registrům

Pro začátek předpokládejme, že napíšete (středník) v kterémkoli bodě programu, vše, co přijde po tomto středníku, bude kompilátorem ignorováno, dokud se samozřejmě vozík nedostane zpět do polohy.



Výše uvedená funkce nám umožňuje přidávat komentáře nebo poznámky, aby se nestaly součástí programu, ale usnadňuje nám identifikovat program pomocí komentářů vedle něj. Zadávání komentářů je doporučenou praxí při programování libovolného IC.

Další důležitou věcí v kurzu je přiřadit názvy různým konstantám (později byste se je podrobně naučili). Díky tomu je snazší porozumět tomu, na co se píše, nebo co se týká příslušných hodnot, místo aby se zaměňovalo se zahrnutými čísly.



Výše uvedené musí být provedeno ve formě skutečných jmen pro okamžité rozpoznání, například COUNT, je důležité si uvědomit, že zde jsou použita všechna velká písmena, aby byla odlišná a také naznačovala, že jde o konstantní hodnotu.


Jak vidíme, výše uvedené je provedeno ve formě krabice ze středníků, díky čemuž vypadá čistěji. Kromě toho zkuste dokumentovat program také na papíře, tato praxe vám pomůže pochopit věci krok za krokem.

2. Registry.

Registr v rámci PIC je oblast, která přijímá písemné podrobnosti a umožňuje čtení z něj. Můžete jej porovnat s listem papíru, kde můžete vizualizovat obsah a přidávat jej tak, že na něj budete psát.

Na následujícím obrázku je znázorněna typická mapa souborů registrů vložená do PIC16F84. Formát není něco, co je ve skutečnosti nastaveno uvnitř PIC, je to jen pro indikaci toho, jak mohou být bity uspořádány uvnitř čipu, a pro pochopení několika souvisejících příkazů.

Vidíte, že je v zásadě rozdělena na Banku 0 a Banku 1. Banka 1 je zodpovědná za řízení skutečné práce PIC, například tel PIC, které bity na Portu A jsou přiřazeny jako vstupy a které jsou jako výstupy.

Banka 2 slouží pouze k manipulaci s informacemi.

Rozumíme tomu na následujícím příkladu:

Předpokládejme, že chceme přiřadit jeden bit na PortA high. Za tímto účelem bychom nejprve museli jít do banky 1 pro nastavení zadaného bitu nebo pinu na portu A ve formě výstupu. Poté se vrátíme do banky 0 a doručíme logiku 1 (bit 1) tomuto konkrétnímu kolíku.

Nejběžnější registry, které bychom rádi použili v bance 1, jsou STATUS, TRISA a TRISB.

STATUS nám pomáhá vrátit se do banky 0, TRISA nám umožňuje vybrat, které piny na portu A jsou výstupy a které mohou být vstupy, zatímco TRISB usnadňuje výběr mezi výstupem a vstupním pinem na portu B. Registr SELECT v BANK 0 umožňuje uživateli otočit do banky 1.

Shrňme celý koncept s následujícím popisem:

POSTAVENÍ:

Abychom přepnuli z banky 0 do banky 1, ovládáme registr STATUS. To je implementováno nastavením bitu # 5 registru STATUS na 1. Abychom se vrátili zpět do banky 0, přiřadíme bit 5 registru STATUS na 0. Registr STATUS je umístěn na adrese 03h, zde h označuje číslo může být hexadecimální.

TRISA a TRISB:

Ty jsou umístěny na adrese 85h a 86h odpovídajícím způsobem. Pro programování kolíku jako výstupu nebo vstupu, doručíme nulu nebo jeden na konkrétní bit v registru. Nyní to lze provést dvěma způsoby, pomocí binárního nebo Hexu. V případě, že jeden není schopen převést parametr, může se obrátit na vědeckou kalkulačku pro implementaci hodnot.

Nyní máme 5 pinů na portu A, což odpovídá 5 pinům. Pokud máme v úmyslu opravit jeden z pinů jako vstupy, doručíme „1“ konkrétnímu bitu.

V případě, že bychom chtěli přiřadit jeden z pinů jako výstupy, nastavili bychom konkrétní pin na „0“. Bity jsou podporovány přesně odpovídající bitům, nebo přesnější bit 0 je RA0, bit 1 by byl RA1, bit 2 = RA2 atd.. Pojďme to pochopit takto:

Předpokládejme, že chcete opravit RA0, RA3 a RA4 jako výstupy, zatímco RA1 / RA2 jako i / ps, uděláte to odesláním 00110 (06h). Podívejte se, že bit 0 je vpravo, jak je uvedeno zde:

Port A Pin RA4 RA3 RA2 RA1 RA0

Počet bitů 4 3 2 1 0

Binární 0 0 1 1 0

Totéž platí pro TRISB.

PORTA a PORTB

Abychom dostali jeden z výstupních pinů vysoko, nabízíme pouze „1“, aby se příslušný bit v našem registru PORTA nebo PORTB. Stejný postup lze použít i pro registry TRISA a TRISB. Než se pustíme do našeho prvního příkladu kódování, pochopme kupé více registrů, viz: w a f.

W a F

Registr W je běžný registr, který vám umožňuje přiřadit libovolnou hodnotu podle vašeho výběru. Jakmile přiřadíte velikost W, můžete pokračovat přidáním této hodnoty k jiné hodnotě nebo ji jednoduše přesunout. S přidělenou jinou hodnotou se podrobnosti jednoduše přepíší na W.

Registr F předává své písemnosti do registru. Vyžadovali bychom, aby tento registr F přiřadil hodnotu přes registr, může to být přes registry STATUS nebo TRISA, protože nám tyto hodnoty neumožní přímo přesahovat hodnoty. Ukázkový program

Prozkoumejme následující ukázkový kód, který nám ukáže, jak je výše uvedená instrukce implementována, a bude také svědkem několika pokynů v kurzu.

Začněme opravou portu A, jak je popsáno výše.

K tomu musíme přejít z banky 0 na banku 1, to se provádí nastavením registru STATUS na adrese 03h, bit 5 až 1.

BSF 03h, 5

BSF znamená bitovou sadu F. Po této instrukci používáme dvě čísla - 03h, což je adresa registru STATUS, a číslo 5, které odpovídá číslu bitu.

Říkáme tedy „Nastavit bit 5 na adresu 03h na 1“.

Nyní jsme v bance 1.

MOVLW 00110b

Vkládáme binární hodnotu 00110 (písmeno b znamená, že číslo je v binárním formátu) do našeho obecného registru W. Mohl bych to samozřejmě udělat v hexu, v takovém případě by naše instrukce byla:

MOVLW 06h

Buď funguje. MOVLW znamená „Move Literal Value Into W“, což v angličtině znamená vložit hodnotu, která následuje přímo do W registru.

Nyní musíme dát tuto hodnotu do našeho registru TRISA a nastavit port:

MOVWF 85h

Tato instrukce označuje „Přesuňte obsah W do následující adresy registru“, v tomto případě adresa odkazuje na TRISA.

Náš registr TRISA v tomto okamžiku nese číslo 00110 nebo je znázorněn graficky:

Port A Pin RA4 RA3 RA2 RA1 RA0

Binární 0 0 1 1 0

Vstup / výstup O O I I O

Takže teď máme své piny Port A, musíme se vrátit do Banky 0 a upravit jednu z informací.

BCF 03h, 5

Tato instrukce dosahuje obrácení BSF. To znamená „Bit Clear F“. Dvojice čísel, která odpovídají, je adresa registru, zde registr STATUS, stejně jako bitová figura, v tomto případě bit pět. Co přesně jsme v současné době dokončili, je definováno bitem pět na našem

STAV se zaregistruje na 0

V tuto chvíli jsme se vrátili v bance 0.
Následuje kód vše v jednom bloku:

BSF 03h, 5 Přejít na banku 1
MOVLW 06h Vložte 00110 do W
MOVWF 85h Přesuňte 00110 na TRISA
BCF 03h, 5 Vraťte se zpět do banky 0

V rámci posledního pokynu jsme vám potvrdili způsob, jak vytvořit kolíky portů IO na PIC, aby byly případně vstupní nebo výstupní.

Prostřednictvím tohoto kurzu vám pomůžu poslat data do portů.

Odesílání dat na porty

V dalším tutoriálu to dokončíme blikáním LED diody, která se skládá z kompletního programu a podrobného schématu zapojení, takže můžete vidět PIC vykonávající přesně to, co od něj očekáváme.

Nepokoušejte se sestavit a naprogramovat svůj PIC s níže uvedenými výsledky, protože jsou pouze ilustrační. Zpočátku vytvoříme Port A bit 2 jako výstup:

To by bylo patrné z předchozího pokynu. Jediný rozdíl by mohl být. Opravili jsme každý bit pinů na A jako výstup doručením 0h do trojstátového registru. Takže teď musí zapnout LED.

Toho dosáhneme naplánováním jednoho z pinů (ten, na který je připojena LED), vysokého. Jinak řečeno, na špendlík aplikujeme „1“. Je to přesně tak, jak je to provedeno (pro vysvětlení u každého řádku postupujte podle komentářů):

To, čeho jsme nyní dosáhli, je tedy jednou zapnout a potom vypnout LED. Chceme, aby se kontrolka LED trvale rozsvítila.

Toho dosáhneme získáním programu pro návrat na začátek. Toho dosáhneme tím, že nejprve vytvoříme značku na začátku našeho programu, poté informujeme program, aby tam pokračoval. Značku specifikujeme zcela přímočaře.

Zadáme výraz, řekněme START, dále zadejte kód:

Jak je ukázáno, výraz „Start“ jsme původně zmínili hned na začátku programu.

Dále, na samém konci programu, jsme jasně zmínili „goto Start“. Instrukce „goto“ provádí přesně to, co deklaruje.

Tento program by trvale zapínal a vypínal LED, kdykoli zapneme obvod, a měl by tendenci se vypínat, jakmile odstraníme elektřinu. Možná bychom měli znovu zkontrolovat náš program:

Určitě jsme vynechali komentáře, ale stále můžeme dodržovat pokyny a čísla.

To může být později trochu záhadné, pokud se pokusíte vyřešit problém s programem a při psaní kódu jste si zapamatovali všechny adresy.

I když je možné komentáře umístit, mohlo by to být trochu přeplněné. To bude vyžadovat pojmenování čísel a může být provedeno další instrukcí: 'equ' Instrukce 'equ' naznačuje, že některé věci se mohou rovnat jiným věcem.

Nemusí to být instrukce pro PIC, spíše pro assembler. Tato instrukce usnadňuje přiřazení názvu umístění adresy registru nebo konstanty programovacímu termínu.

Stanovíme několik konstant pro náš program a budeme také svědky toho, jak přímo program čte.

Vzhledem k tomu, že jsme nyní opravili konstantní hodnoty, můžeme pokračovat jejich nastavením do našeho programu. Před jejich použitím je třeba určit konstantní hodnoty.

proto je vždy umístěte na začátek programu. Program s vyloučením komentářů znovu přepíšeme, abychom porovnali dřívější označení s nejnovějším.

Možná si všimnete, že konstanty umožňují o něco snazší pochopení programu, ale stále jsme bez komentářů, bez obav, protože ještě nejsme hotovi.

Náš blikající program LED může mít malou nevýhodu.
Každá instrukce potřebuje k dokončení 1 sekvenci hodin. V případě, že používáme 4MHz krystal, pak každá instrukce volá po dokončení 1 / 4MHz nebo 1uS.

Jelikož používáme pouze pět instrukcí, LED by se aktivovala a potom zhasla v 5uS. To by mohlo být příliš rychlé na to, aby si to lidé všimli, navíc se bude zdát, že kontrolka LED plně svítí.

Místo toho bychom měli dosáhnout inhibice mezi zapnutím LED a vypnutím LED. Teorie inhibice spočívá v tom, že odpočítáváme od dřívější veličiny, takže když se dostane na nulu, přestaneme počítat.

Nulová hodnota znamená závěr zpoždění a my pokračujeme v práci na celém procesu po celý program. Nejprve tedy musíme určit konstantu, kterou použijeme jako náš čítač.

Pojďme tuto konstantu pojmenovat COUNT. Poté musíme určit, jak významné číslo se má začít počítat. Jistě, největší číslo, které bychom mohli zahrnout, je 255, nebo FFh v hexadecimálním formátu. Jak jsem hovořil v předchozím tutoriálu, instrukce equ přiřadí výraz situaci v registru.

To znamená, že bez ohledu na to, jaké množství přidělíme náš POČET, bude odpovídat položkám v registru. V případě, že se pokusíme určit hodnotu FFh, dostaneme chybu, jakmile se dostaneme ke kompilaci programu.

Důvodem je umístění FFh, proto k němu nemůžeme získat přístup. Jak tedy musíme určit skutečné číslo? Určitě to bude vyžadovat malé množství bočního přemýšlení.

Pokud například označíme náš POČET na adresu 08h, znamenalo by to základní cíl cíle registru. Ve výchozím nastavení jsou nedotčené oblasti nastaveny na FFh. Pokud tedy COUNT vede k 08h, setkáte se s hodnotou FFh, když poprvé zapneme. Nicméně já, vy, jak můžeme opravit COUNT na jiné číslo? Vše, co použijeme, je „přesunout“ nejprve ocenění do tohoto cíle.

Pro ilustraci předpokládejme, že jsme si přáli, aby měl COUNT hodnotu 85h, nemůžeme zmínit COUNT ekv 85h, protože to je pozice mimo Tri-State registru pro Port A. Přesně to, čeho dosáhneme, je následující: movlw 85h hodnota 85h v registru W movwf 08h

Nyní ji přesuňte do našeho 08h registru. Následně v případě, že vyjádříme COUNT equ 08h, COUNT by odpovídal hodnotě 85h. Delikátní, že? Proto zpočátku určíme naši konstantu: COUNT ekv. 08 h. Poté musíme tento POČET snížit o jednu, dokud se nestane nulovou.

Prostě se tak stane, že existuje jedna instrukce navržená k tomu, abychom toho dosáhli, a to pomocí „goto“ a značky.

Instrukce, kterou použijeme, je: DECFSZ COUNT, 1 Tato instrukce uvádí „Snižte registr (zde je to COUNT) o číslo, které sleduje čárku. Pokud dosáhneme nuly, vyskoč o dvě místa vpřed. “Najdeme ji nejprve v akci, než ji umístíme do kurzu.

To, co jsme provedli, je zpočátku vytvoření naší konstantní hodnoty POČET až 255. Následující segment umístí značku nazvanou LABEL blízko naší instrukce decfsz.

Decfsz COUNT, 1 snižuje hodnotu COUNT o jednu a zachovává konečný výsledek rovnou do COUNT. Kromě toho ověří, zda má COUNT hodnotu 0.

Pokud se tak nestane, v takovém případě se program přepne na následující řádek. Nyní máme deklaraci „goto“, která nás vrací zpět k naší instrukci decfsz.

V případě, že hodnota COUNT funguje stejně, pak instrukce decfsz způsobí, že náš program přeskočí o 2 body dopředu a je odeslán na místo, kde jsme deklarovali „Pokračujte zde“.

Proto, jak můžete pozorovat, jsme vytvořili program tak, aby před pokračováním seděl na předem určené místo na jednom místě. To by se dalo nazvat zpožďovací smyčkou.

Porozumění zpožděným smyčkám

V případě, že požadujeme podstatnější zpoždění, mohli bychom pokračovat v jedné smyčce za druhou. Smyčky navíc prodloužily zpoždění. Pojďme alespoň dvě, za předpokladu, že chceme pozorovat blikání LED. Tyto zpožďovací smyčky umístíme do našeho programu a dosáhneme tím, že z něj uděláme skutečný program zavedením komentářů:

Je možné sestavit tento program, po kterém programovat PIC. Je zřejmé, že se pokusíte obvod zkontrolovat, zda skutečně funguje. Následuje schéma zapojení, které byste měli sestavit, jakmile naprogramujete PIC.


Dobře, mohli jste skutečně sestavit svůj první program PIC a zkonstruovat obvod, který bude blikat a zapínat LED. Až dosud jste se v případě, že jste tyto kurzy absolvovali, mohli naučit celkem sedm instrukcí z 35, ale bezpochyby zatím můžete ovládat I / O porty!

Pokusili byste se změnit smyčky zpoždění, aby se LED blesk zrychlil - jaká je minimální hodnota COUNT, aby v podstatě LED blikal? Nebo možná budete chtít zahrnout třetí nebo doplňkové zpožďovací smyčky po počáteční, abyste stabilizovali LED. jedinečná konstanta pro každou zpožďovací smyčku.

Ve svých zpožďovacích smyčkách byste se pak mohli potenciálně pohrávat a vytvořit tak LED blesk určitou rychlostí, například po sekundě. V další instruktáži se podívejme, jak dokážeme využít něco známého jako podprogram k udržení kompaktního a základního programu. Subrutina je nedílnou součástí kódu nebo programu, na který lze odkazovat a kdy to budete potřebovat. Subrutiny se používají v případech, kdy často provádíte stejnou funkci.

Co jsou to podprogramy

Výhody použití podprogramu spočívají v tom, že bude pravděpodobně jednodušší upravit hodnotu jednou v podprogramu místo, řekněme, desetkrát v celém programu, a také výrazně přispívá ke snížení úrovně paměti, kterou váš program spotřebovává uvnitř OBR. Zkontrolujeme podprogram:

Zpočátku musíme svému podprogramu poskytnout označení a v této situaci jsme vybrali RUTINU. Poté zadáme kód, který bychom chtěli provést jako obvykle. Proto jsme zvolili zpoždění v našem blikajícím programu LED. Nakonec ukončíme podprogram zadáním instrukce RETURN.

Chcete-li zahájit podprogram odkudkoli v našem programu, rychle napíšeme instrukci CALL a poté označení podprogramu.

Uvažujeme o tom trochu hlouběji. Jakmile dorazíme do části našeho programu CALL xxx, ve které xxx je název našeho podprogramu, program přeskočí kamkoli, kde je podprogram xxx nainstalován. Jsou provedeny pokyny uvnitř podprogramu.

Kdykoli je provedena instrukce RETURN, program přeskočí návrat do našeho hlavního programu k instrukci následující po naší instrukci CALL xxx.

Je možné zavolat podobný podprogram několikrát, jak byste chtěli, což vysvětluje, proč používání podprogramů snižuje celkovou dobu trvání našeho programu.

Existuje však několik faktorů, o kterých byste měli vědět. Zpočátku, stejně jako u našeho hlavního programu, je třeba potvrdit všechny konkrétní konstanty, než je budete moci použít.

Ty mohou být případně potvrzeny v samotném podprogramu nebo přímo na začátku hlavního programu. Navrhuji vám, abyste na začátku svého hlavního programu všechno uznali, od té doby uznáváte, že věci jsou ve stejné pozici. Dále je třeba se ujistit, že hlavní program přeskočí podprogram.

Z toho vyplývá, že byste měli umístit podprogram přímo na konec vašeho primárního programu, kromě případů, kdy použijete deklaraci „Přejít“ k tomu, abyste skočili z místa, kde je podprogram, program bude pokračovat a bude implementovat podprogram bez ohledu na to, zda jste vyžadovat nebo jinak.

PIC by nerozlišoval mezi podprogramem a hlavním programem. Zkontrolujeme náš blikající program LED, ale tentokrát použijeme podprogram pro zpožďovací smyčku. V ideálním případě zjistíte, o kolik méně se program objeví, a také zjistíte, jak se podprogram prakticky používá.

Nakonec můžete pozorovat, že využitím podprogramu pro naši zpožďovací smyčku jsme mohli zmenšit rozměry programu.

Pokaždé, když požadujeme zpoždění, případně když LED svítí nebo nesvítí, voláme v zásadě podprogram zpoždění. Na konci podprogramu program vede zpět na řádek podle naší instrukce „Volat“. Na výše uvedeném obrázku zapneme LED.

Poté kontaktujeme podprogram. Program se poté vrátí, abychom mohli vypnout LED. Zavoláme podprogram ještě jednou, pro případ, že by podprogram mohl být dokončen, program se vrátí a následná instrukce, kterou rozpozná, je „goto Start“. Pro kohokoli, koho by to mohlo zaujmout, byl náš první program dlouhý 120 bajtů.

Použitím podprogramu jsme mohli snížit velikost našeho programu až na 103 bajtů. To by nemohlo znít tak fantasticky, ale vzhledem k tomu, že v PIC máme celkově pouze 1024 bajtů, přináší každá malá částka výhody.

V rámci dalšího pokynu se podívejme na čtení z portů.

Zatím jsme komponovali do Portu A, abychom mohli zapínat a vypínat LED. V tomto okamžiku uvidíme, jak budeme číst I / O piny na portech.

Čtení vstupních / výstupních portů

To je přesně proto, abychom zajistili, že jsme schopni propojit externí obvod a ovlivnit jakékoli konkrétní výstupy, které nabízí.

Pokud si zapamatujete z našich dřívějších kurzů, pokud chcete vytvořit I / O porty, museli jsme přeskočit z banky 0 do banky 1. Dosáhneme toho nejprve:

V tomto okamžiku jsme na vstup nastavili bit 0 portu A. nyní musíme prozkoumat, zda je kolík vysoký nebo nízký. K dosažení tohoto cíle lze použít pouze jednu ze dvou pokynů:

BTFSC a BTFSS.

Instrukce BTFSC znamená „Proveďte bitový test registru i bit, který určíme.

V případě, že je to 0, v takovém případě následnou instrukci vynecháme. “ BTFSS znamená „Proveďte bitový test v registru a bit, který zavedeme. V případě, že je nastavena na 1, obejdeme následující instrukci.

Který z nich používáme, je přesně určen tím, jak si přejeme, aby náš program reagoval, když studujeme vstup. Pro ilustraci, v případě, že čekáme, až bude vstup číslo 1, pak můžeme být schopni použít instrukci BTFSS následujícím způsobem:

Kód zde:

BTFSS PortA, 0 Pokračovat Pokračujte zde:
:

Program by se jen přesunul na „Pokračujte zde“ za předpokladu, že bit 0 na PortA je naplánován na 1.

Aktuálně napíšeme program, který by mohl vyzvat LED jednou rychlostí, ale pokud je přepínač omezen, bliká LED dvakrát pomaleji.

Je možné si tento program vyzkoušet sami, přesto jsme výpis nějakým způsobem začlenili.

Můžete se pokusit vytvořit celý program a ověřit, zda jste pochopili zásady. Budeme používat ekvivalentní obvod jako dříve, se zahrnutím přepínače připojeného RA0 PIC a kladné kolejnice naší dodávky.

To, čeho jsme zde dosáhli, je rozsvícení LED. Následně určím, zda je spínač vypnutý.

V případě, že je to omezeno, připojím se k našemu podprogramu zpoždění. To nám poskytuje ekvivalentní zpoždění jako dříve, nicméně jsme v tomto okamžiku kontaktováni dvakrát.

Totéž platí, kdykoli LED nesvítí. V případě, že spínač není vypnutý, máme zaznamenané předchozí doby zapnutí a vypnutí.

Sledujete tyto lekce od začátku, možná se snažíte pochopit, že jste právě objevili deset z 35 pokynů pro PIC 16F84! A každý kousek z nich se naučí pouhým zapnutím a vypnutím LED.

Až dosud jsme složili PIC blikání a rozsvícení LED.

Následně jsme byli schopni s naším PIC začleněním přepínače, tedy měnit rychlost blesku.

Efektivní využití paměťového prostoru

Jediným problémem je, že program je poměrně zdlouhavý a spíše neefektivní v paměťovém prostoru. Zdálo se mi to v pořádku, když jsem byl včetně příkazů poprvé, ale měl by existovat snadnější způsob, jak to provést. Pozitivní je, že budeme analyzovat, jak jsme doslova zapínali a vypínali LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Nejprve jsme naplnili náš w registr 02h, poté jsme jej přenesli do našeho PortA registru, abychom rozsvítili LED. Abychom to vypnuli, zabalili jsme w s 00h, poté jsme to přesunuli do našeho PortA registru.

Mezi všemi těmito rutinami jsme byli nuceni kontaktovat podprogram, abychom zajistili, že můžeme pozorovat blikání LED.

Proto jsme potřebovali dvakrát přenést dvě sady informací (jednou do registru w, pak na PORTA) a dvakrát zavolat podprogram (jednou pro zapnutí, jednou pro vypnutí). Jak bychom toho tedy mohli dosáhnout s vyšší účinností? Velmi jednoduché.

Používáme jinou instrukci známou jako XORF. Instrukce XORF pracuje s funkcí Exclusive OR v registru, který stanovíme s informacemi, které poskytujeme. Věřím, že musím vyjasnit, co na světě je Exkluzivní OR, než budeme pokračovat. V případě, že máme dva vstupy a jeden výstup, může být vstup pouze 1, pokud a pokud se tyto dva vstupy liší. I když jsou stejné, pak bude výstup pravděpodobně 0. Následující tabulka pravdivosti pro jednotlivce, kteří se rozhodnou si je prohlédnout:

A B F0 0 00 1 11 0 11 1 0

V tomto okamžiku zkontrolujeme, co se stane, pokud vykreslíme B stejně jako náš dřívější výstup a jednoduše změníme hodnotu A:

A B F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

Pokud budeme udržovat hodnotu A stejnou jako 1 a budeme ji exkluzivně NEBO s výstupem, výstup se přepne. V případě, že si toho z tabulky pravdy nemůžete všimnout, níže to můžeme vidět pomocí binárního souboru:

0 Proudový výstup
EX-OR S 1 1 novým výstupem
EX-OR S 1 0 novým výstupem

Možná zjistíte, že exkluzivním ORingem výstupu s 1 nyní přepneme výstup z 0 na 1 na 0.
K zapnutí a vypnutí LED tedy stačí pouze pár vět:

MOVLW 02h
DVEŘE XORWF, 1

Co přesně dosáhneme, je přidání našeho w registru s 02h. V tom případě jsme exkluzivní ORING tohoto čísla bez ohledu na to, co je na našem PortA. V případě, že bit 1 je 1, změní se na 0. V případě, že bit 1 je 0, změní se na 1. Podívejme se na tento kód jednou nebo dvakrát, abychom si ukázali, jak běží binárně:

DVEŘE
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Ve skutečnosti nemusíme pokaždé načíst stejnou hodnotu do našeho registru w, proto je možné toho dosáhnout na začátku a jednoduše přejít zpět k našemu přepínacímu příkazu. Kromě toho bychom neměli opravovat hodnotu v našem registru PortA. Důvod? Jistě, protože v případě zapnutí je to 1, můžeme jej snadno přepnout. Já, alternativně 0 při zapnutí, bychom to dokonce nyní přepnuli.

Proto byste chtěli vidět náš nově vytvořený kód. První představuje náš blikající LED kód, zatímco druhý ukazuje ten s přidáním přepínače:

Přejeme vám, abyste zjistili, že jednoduše pomocí jedné snadné instrukce jsme nyní snížili rozsah našeho programu. Pravdou je, že abychom ukázali, o kolik bychom mohli naše programy snížit, Ukázali jsme dva programy, přesně to, co bylo složeno, a jejich rozměry v tabulce níže:

Změnit rozměry programu (bajty)
Blikající LED originál 120
Blikající LED podprogram přidán 103
Blikající LED XOR Použitá funkce 91
LED se spínačem Original 132
LED s funkcí spínače XOR použitá 124.

Proto jsme nejen objevili několik nových pokynů, ale navíc jsme zmenšili velikost našeho skriptování!

Níže budeme analyzovat, jak můžete kroutit jednotlivé bity, provádět určitou přímou aritmetiku i datové tabulky.

Logičtí manažeři

V rámci posledního tutoriálu jsem představil operaci Exclusive OR. Funkce ExOR je chápána jako logický operátor.

V rámci tohoto tutoriálu objasním další logické operátory, které PIC podporuje. V bodových programech nebude žádný případ, nicméně Naučíme se snadné metody použití operátorů použitím malých oblastí kódu.

Funkce AND Funkce AND v podstatě analyzuje dva bity a poskytuje 1, zda jsou stejné, a 0 v případě, že jsou rozlišovací. Například pokud jsme zmínili 1 AND 1, výsledek je 1, zatímco v případě, že jsme deklarovali 1 AND 0, důsledkem by bylo 0.

Není třeba říkat, že jsme schopni vyhodnotit také slova, stejně jako všechny funkce AND, kterých je dosaženo, jsou tyto dva pojmy kousek po kousku. Níže uvedená instance ukazuje, že dvě 8bitová slova se spolu s produktem stanou AND:

11001011
A 10110011
Rovná se 10000011

Doufám, že souhlasíte, výsledek bude jednoduše mít 1, kdykoli 2 1 s ruku v ruce ve dvojici slov. Jsme schopni využít například funkci AND k ověření portů.

V případě, že kontrolujeme několik I / O pinů, které jsou spojeny s obvodem, a měli bychom dávat pozor na konkrétní situaci, ve které je jen několik pinů vysoko, v takovém případě jsme schopni do značné míry přečíst port, po kterém A výsledek s podmínkou, kterou jsme zkoumali, shodný s výše uvedenou instancí.

PIC nám poskytuje dvě složky pro AND.
Jsou to ANDLW a ANDWF. ANDLW nám umožňuje provádět funkci AND s podrobnostmi registru W a částkou, kterou stanovíme.

Syntaxe je: ANDLW kde je přesně to, s čím pojdeme A obsah W s.

Důsledek funkce AND by byl uložen přímo do W registru.
ANDWF nám umožňuje provádět funkci AND v registru W a jiný registr, například PORT. Syntaxe je: ANDWF, d ve kterém je registr, kterým jsme nadšení, např. PORTA ad označuje PIC, kam byste měli umístit výsledek. Pokud d = 0, výsledek se vloží do registru W a d = 1 se konečný výsledek uloží do registru, který jsme určili. Dvě části kódu níže zobrazují dobrý příklad každé funkce AND.

Počáteční zkoumá stav PORTA, ve kterém musíme zkontrolovat, zda jsou vstupy 1100. Výsledek můžeme umístit zpět do W registru

movlw 1100
ANDWF 05h, 0Druhá ilustrace nyní může ověřit obsah registru W:
ANDLW 1100

NEBO

Nyní jsme objevili jednu funkci OR, přesněji XOR. To se vyvine do 1, pokud dva bity nejsou stejné, ale jsou odlišné. Můžete najít další funkci OR nazvanou IOR, což je včetně OR. Tato funkce vygeneruje 1 v případě, že jeden bit je 1, ale navíc, pokud jsou všechny bity 1. Níže je uvedena jasná tabulka pravdy, která to ilustruje:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

Co jsou to aritmetické operátory

PŘIDAT

Tato funkce dosahuje toho, co obvykle tvrdí. Přispívá dvěma čísly! V případě, že důsledek přidání dvou číslic přesáhne 8 bitů, v takovém případě bude pravděpodobně nastaven příznak CARRY. Příznak CARRY je umístěn na adrese 03h bit 0.

Když je tento bit naplánován, pak tyto dvě čísla překročily 8 bitů. Když je 0, v tom případě je důsledek umístěn do 8 bitů. Stejně jako dříve nám PIC přináší dva styly ADD, konkrétně ADDLW a ADDWF. Jak jste možná předpokládali, je to docela podobné výše uvedené funkci. ADDLW nabízí obsah registru W, který jsme stanovili. Syntaxe je: ADDLW ADDWF přidá obsah registru W a nějakého dalšího registru, který označíme.

Syntaxe je: ADDWF, d je kde

SUB

V tuto chvíli si myslím, že nemůžete předpokládat, co tato funkce vede! Opravdu jste to tušili, tato funkce
odečte jeden bit od druhého. PIC nám opět poskytuje 2 chutě: SUBLW a SUBWF. Syntaxe je přesně podobná jako u funkce ADD, kromě toho, že evidentně napíšete SUB namísto ADD!

Přírůstek V případě, že jsme chtěli zahrnout 1 do čísla v PIC, mohli bychom absolutně využít funkci ADD a využít číslo jedna. ~ Potíž s tím spočívá v tom, že nejprve musíme postavu umístit do registru W a následně ji pomocí ovládacího prvku ADDLW 1 zvýšit. V případě, že jsme chtěli zahrnout 1 do registru, může to být ještě horší. Nejprve musíme umístit číslo 1 do W registru, poté použít ADDWF, 1. Proto například k zahrnutí 1 do umístění 0C řekněme, potřebovali bychom mít následující část skriptu:

movlw 01
addwf 0c, 1

Existuje jednodušší způsob, jak to provést. Můžeme vykonat příkaz INCF. Syntaxe je: INCF, d kde, je registr nebo místo, které se nás týká, a d ukazuje PIC, kam byste měli umístit výsledek. V případě d = 0 je výsledek v registru W a v případě d = 1 je důsledek nastaven v registru, který jsme stanovili.

Použitím této individuální instrukce jsme schopni vlastně padesát procent kódování. V případě, že jsme chtěli, aby byl výsledek obnoven do registru W, v tom případě, že použijeme výše uvedenou instanci, možná bychom museli zahrnout další příkaz k přesunutí položek 0C zpět do registru W, po kterém umístíme registr 0C zpět na no Nezáleží na tom, co to bylo.

Existuje příkaz pro zvýšení. Je to INCFSZ. Tento příkaz by mohl zvýšit registr, který stanovíme, ale pokud se registr rovná 0 po přírůstku (k němuž dojde, když zahrneme 1 až 127), poté PIC pravděpodobně projde následnou instrukcí. Část kódu níže to odráží:

Smyčka incfsz 0C
Přejít na smyčku
:
:
Zbývající část programu.

Ve výše uvedené části kódu bude 0C zvýšeno o 1. Dále vlastníme instrukci, která informuje PIC, aby se vrátila k naší značce s názvem Loop, a opět zvýší 0C o 1. To pokračuje, dokud se 0C nebude rovnat 127. Za těchto okolností, když zvýšíme 0C o 1, bude 0C nyní odpovídat 0. Naše instrukce INCFSZ by mohla velmi dobře informovat PIC, aby vynechal následující instrukci, což je v tomto případě deklarace goto, proto PIC půjde vpřed se zbývajícím programem.

Snížení

Nyní jsme diskutovali o funkci snižování v dřívějším tréninku, proto ji již nebudu revidovat.

Doplněk

Závěrečná instrukce v této diskusi by obrátila každý jeden bit v registru, který stanovíme. Syntaxe je: COMF, d kde

Pochopení bitových operací

To by mohlo být využito například k rychlé výměně kolíků portu z výstupu na vstup atd. Bitové funkce nám umožňují tvarovat jeden bit ve výrazu. Umožňují nám pokračovat, nastavit a zbavit se jednotlivých bitů v registrech nebo číslech, která stanovíme.

Na konci tohoto kurzu zveřejníme program navržený k vytvoření sady sekvenčních světel, která postupují vpřed a poté obráceně. Toho jsme dosáhli dříve, když jsme zkoumali exkluzivní funkci OR, kde jsme porty exkluzivně ORovali výrazem. Uptil jsme si nyní všimli několika bitových funkcí, když jsme založili porty na PIC, a

Dovolte mi zopakovat jejich využití zde.

BCF

Tato instrukce vymaže bit, který stanovíme v registru, který určíme. Syntaxe
je:
BCF,

Toto jsme dříve použili pro změnu ze stránky 1 na stránku 0 odstraněním bitů v registru STATUS. Můžeme to také použít k opravě bitů na 0 v jakémkoli jiném registru / umístění. Například v případě, že bychom chtěli nastavit 3. bit v 11001101 uloženém v sekci 0C na 0, mohli bychom
vložit:

BCF 0C, 03

BSF

Tato instrukce by opravila jakýkoli bit, který stanovíme na 1 v každém registru, který označíme. Toto jsme dříve využili pro postup ze stránky 0 na stránku 1. Syntaxe je: BSF ,, a je využívána přesně stejnou metodou jako výše uvedená BCF.

BTFSC Až dosud jsme mohli nastavit nebo trochu vymazat v registru. Představte si však, jestli potřebujeme v podstatě zkontrolovat, zda je bit v registru 1 nebo 0?

Určitě je možné použít BTFSC. Uvádí registr bitových testů F a přeskočí, pokud je jasný. Tato instrukce bude analyzovat bit, který určíme v registru. V případě, že bit je 0, instrukce by informovala PIC, aby předala následující instrukci.

Tuto instrukci můžeme použít v případě, že bychom chtěli zkontrolovat příznak, například příznak carry. To nás ušetří potřebou číst registr STATUS a hledat jednotlivé bity, abychom zjistili, které příznaky jsou opraveny. 29 Například pokud bychom chtěli zkontrolovat, zda byl příznak Carry nastaven na 1 poté, co jsme přidali 2 číslice, mohli bychom zadat následující:

BTFSC 03h, 0
pokračujte zde, pokud je nastavena na 1
nebo zde, pokud je nastavena na 0

V případě, že stav bitu je 1, v takovém případě by byla dokončena instrukce následující po BTFSC. V případě, že je nastavena na 0, v takovém případě je následující instrukce přeskočena. Následující část kódu vykazuje, ve kterých by mohla být použita:

Smyčka:
:
:
BTFSC 03,0
Přejít na smyčku

Ve výše uvedeném kódu se PIC jednoduše dostane ze smyčky, pokud je bit 0 registru STATUS (nebo příznak Carry) definován na 0. Jinak by byl proveden příkaz goto.

BTFSS

Tato instrukce uvádí registr bitových testů F a přeskočit, pokud je nastaven. To může být srovnatelné s instrukcí BTFSC, kromě toho by PIC vynechal následnou instrukci, pokud je bit, který vyhodnocujeme, nastaven na 1 místo 0.

CLRF

Tato instrukce by opravila všechny podrobnosti registru na 0. Syntaxe je:

CLRF
Použili jsme to dříve k nastavení výstupu portů na 0, použitím CLRF 85h. Dále jsme jej použili k opravě portů tak, aby obsahovaly všechny piny na výstupu pomocí CLRF
05h.

CLRW

To by se mohlo podobat instrukci CLRF, s výjimkou vymazání registru W. Syntaxe je velmi jednoduchá:

CLRW

RLF a RRF

Tyto směry by v registru přenesly trochu jeden slot vlevo (RLF) nebo vpravo (RRF) v registru. Například, kdybychom potřebovali 00000001 a použili jsme RLF, v tom případě bychom mohli vlastnit 00000010. Co se v tomto okamžiku děje v případě, že existuje 10000000 a použije se instrukce RLF? Určitě by 1 byla umístěna v nosné vlajce. V případě, že jsme ještě jednou použili instrukci RLF, 1 by se znovu objevila na začátku. K podobnému dochází, ale naopak, u instrukce RRF. Případ v níže uvedeném bodě to ukazuje pro instrukci RLF, ve které můžeme vidět 8 bitů registru, stejně jako příznak carry:

C 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
1 00000000 RLF
RLF 0 00000001

Ukázkový program

Nyní uvidíme ukázkový kód, který lze zkompilovat a řídit. Generovalo by to sekvenční světlo začínající na PortA bit 0, přecházející na PortB bit 8 a
pak se vrací.
Připojte LED ke každému z kolíků portu. Něco z toho budeme mít
postupy uvedené v tomto kurzu.

TIME EQU 9FH Proměnná pro zpožďovací smyčku.
Adresa portu P PORTB EQU 06H.
TRISB EQU 86H Port B Tristate adresa.
PORTA EQU 05H Port A adresa.
TRISA EQU 85H Port A Tristate adresa.
STAV EQU 03H Stránka vyberte registr.
COUNT1 EQU 0CH Loop register.
COUNT2 EQU 0DH Loop register.

STAV BSF, 5 Přejít na stranu 1
MOVLW 00H a nastavení
MOVWF TRISB oba porty A a B.
MOVLW 00H na výstup,
MOVWF TRISA a poté se vraťte do
STAV BCF, 5 strana 0.
MOVLW 00H Vymazat port A.
DVEŘE MOVWF

Spuštění hlavního programu

RUNMOVLW
01H Nastavit první bitMOVWF
PORTB na portu B. VOLAT
ZPOŽDĚNÍ Počkejte chvíli VOLEJTE
ZPOŽDĚNÍ
Přesuňte bit na portu B doleva a poté pause.RLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
PORTB, 1 Tím se bit přesune do nosné vlajky
Nyní se přesuňte na port A a posuňte bit left.RLF
PORTA, 1 Tím se bit přesune z nulového příznaku do PortACALL
DELAYCALL DELAYRLF
DVEŘE, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
DVEŘE, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRLF
DVEŘE, 1 VOLÁNÍ
ZPOŽDĚNÍ
ZPOŽDĚNÍ
Přesuňte bit zpět na Port ARRF
DVEŘE, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
DVEŘE, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
DVEŘE, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
PORTA, 1 Tím se bit přesune do nulového příznaku. Nyní posuňte bit
zpět na Port BRRF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
PORTB, 1 VOLÁNÍ
DELAYCALL DELAYRRF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
DELAYRRF
PORTB, 1 VOLÁNÍ
ZPOŽDĚNÍ
ZPOŽDĚNÍ Nyní jsme zpět, kde jsme začali, GOTO
RUN pojďme znovu.

V tréninkové sadě existuje skvělá volba, která vám umožňuje využívat datovou tabulku.

Datová tabulka je pouze seznam citací dat, ve kterých je vše prohlédnuto na základě několika úvah.
Můžete například mít obvod, který využívá PIC, který počítá množství případů, kdy se vstupní pin za 1 sekundu zvýší. Poté můžete číslo vystavit na 7segmentovém displeji.

Jakmile je spuštěno načasování, PIC začne počítat počet případů, kdy je špička vysoká. Po 1 sekundě navštíví tabulku a vzhlédne k datům, musí na displeji zobrazit číslo, které symbolizuje množství situací, kdy se špendlík dostal vysoko. To může být prospěšné, protože neurčujeme, jaké číslo by to mohlo být, dokud PIC nedosáhne svého odhadu.

Využitím tabulky jsme schopni umožnit PIC určit, kterou postavu vykreslit. V tomto okamžiku, než vám i nadále ukážu, jak funguje datová tabulka, vám možná budu muset říct, že PIC udržuje cestu pobytu v programu, který je, zatímco program funguje.

Usnadňuje to těm, kteří provedli určité programování v BASICu. Jinak se nedělejte starosti, možná budete chtít pokračovat v učení o teorii. Představte si, že existuje ZÁKLADNÍ program podobný níže uvedenému:

10 LET K=0
11 K = K + 1
12 KDYŽ K> 10 POTOM GOTO 20 JINÉ GOTO 11
20 TISK K
21 KONEC

Program začíná na řádku 10. Jakmile je K naplánováno na 0, postupuje dále na řádek 11. Poté, co jsme zahrnuli 1 do K, pokračujeme na řádek 12.

V tomto okamžiku by nás mohlo zajímat, zda je K vyšší než 10. V případě, že ano, pokračujeme dále k řádku 20, jinak se vrátíme k řádku 11.

Řádek 20 dokumentuje K a řádek 21 uzavírá program. BASIC využívá statistiky linek, aby pomohl programátorovi zaznamenávat, kde jsou problémy, protože štítky nejsou autorizovány. PIC zaměstnává štítky k úniku mezi cílovými místy - nebo je to opravdu tak?

Štítky používáme k zajištění toho, abychom věděli, kde jsou problémy, a také k tomu, abychom mohli PIC jednoduchým způsobem informovat, kde hledat.

Přesně to, co se stane, je PIC, který využívá počítadlo vnitřních linek zvané Program Counter. Trasa programu Counter (zkráceně PC) cíle paměti, kde je aktuální instrukce.

Kdykoli informujeme PIC, aby navštívil vybraný štítek, rozumí místu v paměti, a proto rozšiřuje počítač, dokud neuvidí tento cíl paměti. Jedná se přesně o stejnou metodu, jakou jsme zkontrolovali výše uvedeným programem BASIC. Níže je vedle každé instrukce segment kódu s paměťovými prostory nebo položkami počítače:

Pokyny pro PC 0000 movlw 03
0001 movwf 0C
0002 Smyčka decfsc 0C
0003 přejděte na smyčku
0004 konec

V ukázce výše jsme opravili PC na 0000. K tomu máme instrukci movlw 03. Když PIC implementovala tato data, zvýší PC, aby byla naskenována následující instrukce. V tomto bodě PIC sleduje movwf 0C. Počítač se opět zvýší.

Nyní PIC studie decfsc 0C. V případě, že podrobnosti 0C nejsou 0, v tom případě se PC zvýší o 1, stejně jako následující instrukce goto Loop informuje PC o návratu na pozici 0003, což je uvedená Loop. V případě, že podrobnosti 0C jsou 0, pak se PC doporučuje zvýšit o 2, jednoduše vynechat následnou instrukci.

Porozumění datovým tabulkám

Tím se PC umístí na pozici 0004, kde program skončí. Cíle jsou stanoveny assemblerem a obecně by nás nemělo zajímat, čeho počítač dosahuje. Dokud nenajdeme potřebu dostat ji pod kontrolu, stejně jako při používání datových tabulek. Nejpohodlnějším způsobem, jak popsat, jak funguje datová tabulka, je začít ilustrací.

PC ekv 02
movlw 03
volací stůl
:
tabulka addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
vrátit se

Počáteční instrukcí je přidělení štítku PC s adresou programového čítače (02h). Budeme brzy po vložení hodnoty 03h do w registru. Poté komunikujeme se stolem. Nejpřednější řádek v tabulce podprogramů rozšiřuje podrobnosti o W registru (03h) k počítadlu programu.

Tím se spustí počítadlo programů, které se zvýší o 3, nebo jinak řečeno, stimuluje počítadlo programu, aby postupovalo dolů o 3 řádky. Zatímco počítadlo dorazí o 3 řádky dolů, PIC rozpozná příkazovou odpověď. Tento příkaz odešle následující hodnotu do registru W, poté se vrátí z podprogramu. RETLW v zásadě znamená návrat, doslovně k W.

Podívejte se, že za slovo Návrat jsem vložil čárku. Jelikož jsme v podprogramu, potřebujeme na jeho povrch instrukci Návrat. Proto RET v pokynu. Po instrukci RETLW je číslo, a to je přesně to, co je vloženo do W registru.

V tomto případě je to obrázek 3. Mohli bychom určit jakoukoli veličinu do registru W, pokud je tento údaj kombinován s programovým počitadlem v podprogramu tabulka, objevíme instrukci retlw. Na výše uvedeném obrázku z toho vyplývá, že jsme schopni vlastnit libovolné číslo od 1 do 7. V případě, že budeme postupovat za podprogram, můžeme dokončit provedení další části programu. Z tohoto důvodu je obvykle chytrým krokem umístit datovou tabulku přesně ke konci programu PIC, proto pokud v takovém případě dojde k překročení, budeme i tak dospět k závěru programu.

Téma přerušení může být nejdelší a nejtěžší projít.

Nemůžete najít žádnou nekomplikovanou metodu podrobného popisu přerušení, nicméně s trochou štěstí ke konci této části budete moci přerušení aplikovat do svých vlastních programů.
Sekce jsme rozdělili na 2 etapy. To znamená povolit oddělit téma do sekcí a také vám poskytnout praktický návod pro snadné pochopení.

Co přesně je to přerušení? Jistě, jak tento termín naznačuje, přerušení je technika nebo signál, který brání mikroprocesoru / mikrokontroléru v tom, co dělá, aby se mohlo stát něco jiného.

Dovolte mi, abych vám dal denní ilustraci. Myslíte si, že relaxujete ve svém domě a konverzujete s jinou osobou. Najednou zazní telefon.

Přestali jste mluvit a popadnete telefon, abyste mluvili s volajícím. Jakmile proběhne vaše telefonní interakce, rozhodnete se vrátit se k rozhovoru s danou osobou dříve, než zazvoní telefon. Je možné vzít v úvahu hlavní rutinu, když s někým chatujete, zvonění telefonu způsobí narušení vašeho rozhovoru a přerušení rutiny je metoda mluvení po telefonu.

I když telefonická diskuse končí, pak se vrátíte ke své primární rutině chatování. Tento obrázek přesně ukazuje, jak přerušit procesor, aby jednal.

Primární program je v provozu a vykonává určitou funkci v obvodu, ale když dojde k přerušení, primární program se zastaví, zatímco je prováděna jiná rutina. rutina končí, procesor se přesune zpět k primární rutině stejně jako dříve.

Porozumění přerušení

PIC má 4 zdroje přerušení. Mohly by být rozděleny do několika skupin. Dva jsou zdroje přerušení, které lze využít navenek k PIC, zatímco další dva jsou vnitřní procesy. Dovolte mi zde objasnit dva externí typy. Jakmile dorazíme k časovačům a ukládání dat, další dva budou popsány v různých výukových programech.

Pokud byste zkontrolovali pin-out PIC, všimnete si, že pin 6 je RB0 / INT. V tomto okamžiku je RB0 jasně port B bit 0. INT představuje, že by to mohlo být také konfigurace jako vnější přerušovací kolík. Dále mohou být pro přerušení použity piny portu B 4 až 7 (piny 10 až 13). Než budeme moci použít INT nebo jiné piny Portu B, musíme splnit dva úkoly. Nejprve musíme PIC informovat, že využijeme přerušení.

Dále musíme určit, který pin B portu budeme používat spíše jako přerušení než jako I / O pin. Uvnitř PIC najdete registr známý jako INTCON a je na adrese 0Bh. V tomto registru najdete 8 bitů, které mohou být povoleny nebo zakázány. Bit 7 INTCON je známý jako GIE. Toto je Global Interrngupt Enable. Oprava na 1 informuje PIC, že použijeme přerušení.

Bit 4 INTCON je známý jako INTE, INTerrupt Enable. Uvedení tohoto bitu na 1 sděluje PIC, že RB0 bude kolíkem přerušení. Konfigurace bitu 3, zvaného RBIE, informuje PIc, že ​​budeme využívat bity Port B 4 až 7. V tomto okamžiku PIC chápe, kdy tento pin může být vysoký nebo nízký, musí zastavit, co provádí, a pokračovat s přerušením rutina. V tomto okamžiku musíme PIC informovat, zda přerušení bude nebo nebude pravděpodobně na transformaci signálu na vzestupné hraně (0 V až + 5 V) nebo na sestupné hraně (+ 5 V až 0 V).

Jednoduše řečeno, přejeme si, aby PIC přerušil pokaždé, když se signál pohybuje z nízké na vysokou nebo z vysoké na nízkou. Delikvencí to lze zjistit tak, aby bylo umístěno na náběžné hraně.

„Spouštění“ hrany je naplánováno v dalším registru, který se nazývá registr OPTION, na adrese 81h. Bit, kterým jsme nadšeni, je bit 6, často označovaný jako INTEDG.

Nastavením na 1 se spustí narušení PIC na montážní hraně (výchozí stav) a nastavením na 0 se stimuluje PIC k narušení na posuvné hraně. Pokud chcete, aby se PIC aktivoval na náběžné hraně, pak s tímto bitem rozhodně nemusíte nic dělat.

V tomto okamžiku je bohužel registr Option v bance 1, což znamená, že nás baví modifikovat z banky 0 na banku 1, nastavit bit v registru Option, po tomto návratu do banky 0. Klíčem je zde dosáhnout každého bitu banky 1 se zaregistruje v jedné stávce, například zřízení kolíků portů, poté se vrátí do banky 0, pokud jste hotovi.

Dobře, následně jsme oznámili PIC, který pin bude pravděpodobně přerušení a kde se má spustit hrana, co se děje v programu a PIC kdykoli dojde k přerušení? Konají se pár věcí. Nejprve je naplánována „vlajka“.

Toto informuje interní procesor PIC, že došlo k přerušení. Dále programové počítadlo (o kterém jsem hovořil v předchozím tutoriálu) tipy na konkrétní adresu v rámci PIC. Podívejme se rychle na všechny tyto jednotlivce. Příznak přerušení V našem registru INTCON je bit 1 příznak přerušení, nazývaný INTF. V tomto okamžiku, kdykoli dojde k jakémukoli přerušení, bude tento příznak pravděpodobně nastaven na 1.

Pokud nedojde k přerušení, je vlajka umístěna na 0. Stejně tak je to téměř vše. V tomto okamžiku možná přemýšlíte „o co jde?“ Jistě, i když je tento příznak naplánován na 1, PIC není schopen a nebude reagovat na další přerušení. Pojďme tedy vyjádřit, že přinášíme přerušení. Příznak bude pravděpodobně nastaven na 1 a PIC může přejít do naší rutiny pro práci s přerušením.

Když tento příznak nebyl fixován na 1 a PIC bylo povoleno pokračovat v odpovídání na přerušení, pak nepřetržité pulzování kolíku mohlo udržet PIC v návratu na začátek naší rutiny přerušení a v žádném případě jej nedokončil. Vrátíme-li se k mé ilustraci telefonu, je to podobné jako zvednutí telefonu a okamžitě, jakmile přistoupíme k diskusi, začne znovu zvonit, protože si s vámi chce někdo promluvit.

Doporučuje se dokončit jeden dialog, poté znovu uchopit telefon a mluvit s následným jednotlivcem. S tímto příznakem můžete najít malý problém. I když PIC rychle nastaví tento příznak na 1, nenastaví jej znovu 0! Tuto činnost musí vykonávat programátor - tedy vy. Toho lze dosáhnout bez námahy, protože to jistě předpokládám, a je třeba toho dosáhnout poté, co PIC provedl rutinu přerušení.

Umístění paměti Kdykoli zpočátku zapnete PIC, nebo v případě, že dojde k resetování, programový čítač tipuje na adresu 0000h, která by mohla být okamžitě na začátku programové paměti. Ale v případě přerušení by čítač programu označil adresu 0004h.

Proto i když skládáme náš program, který bude mít přerušení, musíme nejprve informovat PIC, aby přeskočil adresu 0004h, a udržovat rutinu přerušení, která začíná na adrese 0004h, diskrétně od zbytku programu.

To může být bezproblémové. Zpočátku zahajujeme náš program příkazem známým jako ORG. Tento příkaz označuje počátek nebo start. Držíme se toho s adresou. Protože PIC začíná na adrese 0000h, zadáme ORG 0000h. Poté musíme obejít adresu 0004h. Toho dosáhneme tím, že dáme instrukci GOTO, doprovázenou štítkem, který ukazuje na náš primární program.

Poté se držíme tohoto příkazu GOTO ještě jednou ORG, tentokrát s adresou 0004h. Po tomto příkazu vložíme naši rutinu přerušení. V tomto okamžiku bychom mohli být schopni zadat naši rutinu přerušení přímo po druhém příkazu ORG, nebo jsme schopni umístit příkaz GOTO, který ukazuje na rutinu přerušení.

Opravdu to souvisí s možností z vaší strany. Abychom informovali PIC, který nabízí, dorazili na konec rutiny přerušení, musíme umístit příkaz RTFIE ke konci rutiny. Tento příkaz znamená návrat z rutiny přerušení. Zatímco si to PIC všimne, počítadlo programu indikuje konečnou pozici, na které byl PIC před tím, než došlo k přerušení. Níže jsme vytvořili krátkou část kódu pro zobrazení výše:

Existuje několik věcí, o kterých byste měli být informováni při používání přerušení. Počáteční má tendenci být, že pokud možná používáte identický registr v primárním programu a rutinu přerušení, mějte na paměti, že podrobnosti registru se s největší pravděpodobností změní, když dojde k přerušení.

Například využijme registr w k předávání dat na primární program Port A, proto můžete navíc použít registr w v rutině přerušení k přesunu dat z jednoho cíle do druhého.

V případě, že nejste opatrní, bude registr w obsahovat poslední hodnotu, kterou obdržel, když byl v rutině přerušení, takže když se vrátíte z přerušení, bude tato informace doručena do Portu A místo hodnoty, kterou jste vlastnili dříve došlo k přerušení.

Znamená to, že na okamžik uložíte podrobnosti registru w, než jej znovu použijete v rutině přerušení. Druhým je skutečnost, že můžete najít zpoždění mezi okamžikem, kdy dojde k jednomu přerušení, a okamžikem, kdy může dojít k dalšímu. I když chápete, PIC má vnější hodiny, které by mohly být krystal nebo kombo rezistor-kondenzátor.

Bez ohledu na to, jakou frekvenci mají tyto hodiny, PIC je vydělí 4 a poté to využije pro své vnitřní načasování. Například v případě, že máte 4MHz krystal propojený s vaším PIC, v tom případě by PIC provedl instrukce na 1MHz. Toto vnitřní časování je známé jako instruktážní cyklus. V tomto okamžiku datový list tvrdí (nepochybně v malém tisku), že musíte povolit 3 až 4 instrukční kola mezi přerušeními.

Moje by bylo povolit 4 kola. Důvodem zpoždění je skutečnost, že PIC vyžaduje čas na skok na adresu přerušení, příznak a návrat zpět z rutiny přerušení. Proto na to pamatujte, pokud pracujete s alternativním obvodem a aktivujete přerušení pro PIC.

V tomto bodě je bodem skutečnost, že pokud použijete bity 4 až 7 portu B jako přerušení. Nejste schopni vybrat konkrétní piny na portu B, aby fungovaly jako přerušení.

Proto v případě, že tyto piny povolíte, je pravděpodobné, že budou všechny dostupné. Proto například nemůžete jednoduše mít bity 4 a 5 - bity 6 a 7 budou pravděpodobně současně zmocněny. Co přesně je účelem získání čtyř bitů, které představují přerušení? Určitě můžete mít obvod napojený na PIC, pro případ, že by někdo ze čtyř linek šel vysoko, v takovém případě to může být problém, který vyžaduje okamžitý vliv PIC.

Jedním z příkladů toho může být domácí bezpečnostní alarm, ve kterém jsou čtyři senzory propojeny s piny Port B 4 až 7. Jakýkoli konkrétní senzor může vyzvat PIC ke spuštění alarmu a rutina signalizace alarmu je rutina přerušení. To šetří neustálou kontrolu portů a umožňuje PIC pokračovat v různých záležitostech. V dalším kurzu se chystáme vytvořit program pro správu přerušení.

V posledním tutoriálu jsme se zabývali spoustou základů, proto mám pocit, že nastal čas, abychom složili náš první program.

Program, který napíšeme, spočítá množství příležitostí, kdy zapneme vypínač, a potom vystavíme číslo.

Program by počítal od 0 do 9, viditelný na 4 LED v binární formě, spolu se vstupem nebo přerušením bude pravděpodobně na RB0.

Nejdůležitější věcí, kterou musíme provést, je informovat PIC, aby přeskočil adresu, na kterou programový pult ukazuje, kdykoli dojde k přerušení.

Uvidíte, že používáme jedinečnou metodu vystavování hexadecimálních čísel. Než jsem nastal, aplikujte F9h, ve kterém h označuje hexadecimální. Mohli bychom to napsat jako 0xF9, což je struktura, kterou od nynějška použijeme.

Nyní musíme PIC říct, že budeme používat přerušení, a jako pin přerušení používáme pin 6 RB0:

bsf INTCON, 7GIE - Povolení globálního přerušení (1 = povolení)
bsf INTCON, 4INTE - povolení přerušení RB0 (1 = povolení)
Chystám se vymazat příznak přerušení jen pro případ (nikdy nic nevěřím!)
bcf INTCON, 1INTF - Zrušte příznakový bit pro každý případ

V současné době musíme vytvořit naše 2 porty. Mějte na paměti, že když nyní využíváme RB0 jako kolík přerušení, je třeba to stanovit jako vstup:

K uložení počtu přepnutí použijeme proměnnou s názvem COUNT. Mohli bychom jednoduše zvýšit hodnotu na portu A, ale uvidíte, proč používám proměnnou, když píšeme naši přerušovací rutinu.

Proto je náš hlavní program složen a v tomto okamžiku musíme PIC informovat, jak postupovat, kdykoli dojde k přerušení. V tomto příkladu bude naším přerušením pravděpodobně přepínač. To, co bychom chtěli, aby byl PIC, je jeden k nastavitelnému POČTU pokaždé, když je přepínač omezen.

Chtěli bychom však ukázat, kolikrát se přepínač vypne z 0 na 9. Výše ​​jsem uvedl, že bychom mohli být schopni jednoduše zvýšit hodnotu na portu A pokaždé, když dojde k přerušení. Port A má však 5 bitů, v případě, že jsme port jednoduše zvýšili, budeme mít nejvyšší počet 31. Existuje několik vysvětlení, proč jsem se rozhodl nepohnout až na 31.

Zpočátku použijeme 7segmentovou obrazovku, která by mohla nanejvýš přejít pouze od 0 do 15 (0 až F v hexadecimálním formátu). Dále bych vám chtěl ukázat několik aritmetických příkazů, na které jste narazili v posledních několika lekcích.

Proto budeme pokračovat v naší přerušovací rutině. V současné době musíme nejdříve krátce uložit podrobnosti o našem registru w, protože to aplikujeme na přesun obsahu COUNT do PORTA. V případě, že to neuložíme, v takovém případě bychom kvůli naší aritmetice mohli doručit úplně jiné číslo. Dosáhneme toho proto jako první:

V tomto okamžiku chápeme, zda je hodnota COUNT 9 nebo více. To, co nyní musíme dosáhnout, je, pokud je COUNT více než 9, vraťte jej zpět na 0 nebo se vraťte k hlavnímu programu, abyste se ujistili, že jsme schopni jej doručit na Port A. Příkaz BTFSS, protože chápete, že následující
instrukce v případě, že je naplánován příznak carry, tj. COUNT = 10:

Jedinou věcí, kterou nyní zbývá udělat, je zadat společně a určit hodnoty našich konstant, které jsme schopni provést hned na začátku našeho programu.

Pokaždé, když aktivujete zapnutí, LED diody se budou počítat v binárním formátu od 0000 do 1010, poté zpět do 0000.

Následující obrázek ukazuje schéma zapojení kompatibilní s výše vysvětleným kódem. Zajímavé je, že do návrhu byl zahrnut časovací kondenzátor. To je pěkný malý trik, díky kterému získáte svobodu vyhnout se zahrnutí kondenzátoru pro případ, že byste po tu dobu žádný neměli.

Zde vstupuje do hry kapacita pomocí zbloudilé kapacity přes kolík oscilátoru a zem.
Samozřejmě se to nemusí zdát jako velmi inteligentní způsob, jak se kondenzátoru prakticky vyhnout, protože zbloudilá hodnota se může lišit za různých daných podmínek.

Další částí, kterou lze v obvodu sledovat, je vypovídající síť přes přepínač. To zabrání rušení při mechanickém přepínání a zabrání tomu, aby se PIC zmátl, pokud k přepínání došlo jediným přepínáním nebo více přepínáním.




Předchozí: Programovatelný obousměrný obvod časovače motoru Další: Jak fungují obvody Buck-Boost