Výukový program PIC - od registrov k prerušeniam

Vyskúšajte Náš Nástroj Na Odstránenie Problémov





Predtým, ako sa dostaneme k drobným podrobnostiam programovania PIC, bolo by najskôr dôležité osvojiť si niekoľko dobrých programovacích metód.

Porozumenie registrom

Ak chcete začať s predpokladom, že v ktoromkoľvek bode programu napíšete (bodkočiarku), kompilátor bude ignorovať všetky znaky, ktoré prídu po tomto bodkočiarke, až kým sa vozík samozrejme nevráti do tejto polohy.



Vyššie uvedená funkcia nám umožňuje pridávať komentáre alebo poznámky, aby sa nestali súčasťou programu, ale umožňuje nám identifikovať program pomocou ďalších komentárov. Pri programovaní ľubovoľného integrovaného obvodu je odporúčané postupovanie komentárov.

Ďalšou dôležitou vecou v kurze je priradenie mien k rôznym konštantám (neskôr by ste sa ich podrobne naučili). Vďaka tomu je jednoduchšie porozumieť tomu, do čoho sa píše, alebo čo sa týka príslušných hodnôt, namiesto toho, aby ste sa nechali zmiasť zahrnutými číslami.



Vyššie uvedené musí byť urobené vo forme skutočných mien pre okamžité rozpoznanie, napríklad COUNT, je dôležité poznamenať, že tu sú použité všetky veľké písmená, aby to bolo zreteľné a tiež aby bolo zrejmé, že ide o konštantnú hodnotu.


Ako vidíme, vyššie uvedené sa vykonáva vo forme škatule vyrobenej zo bodkočiarok, vďaka čomu vyzerá čistejšie. Okrem toho sa pokúste dokumentovať program aj na papieri, táto prax pomôže pochopiť veci krok za krokom.

2. Registre.

Register v rámci PIC je oblasť, ktorá prijíma písomné podrobnosti a umožňuje z nej čítať. Môžete ho porovnať s listom papiera, kde môžete vizualizovať obsah a pridávať ho tak, že ho napíšete.

Na nasledujúcom obrázku je znázornená typická mapa súborov registrov vložená do PIC16F84. Formát nie je niečo, čo sa v skutočnosti nastavuje vo vnútri PIC, je to len na indikáciu toho, ako môžu byť bity usporiadané vo vnútri čipu, a na pochopenie niekoľkých súvisiacich príkazov.

Vidíte, že je v zásade rozdelený na Banku 0 a Banku 1. Banka 1 je zodpovedná za riadenie skutočnej práce PIC, napríklad prostredníctvom PIC, ktoré bity na porte A sú priradené ako vstupy a ktoré sú ako výstupy.

Banka 2 slúži iba na manipuláciu s informáciami.

Poďme to pochopiť na nasledujúcom príklade:

Predpokladajme, že by sme chceli priradiť jeden bit na PortA high. Za týmto účelom by sme najskôr museli ísť do banky 1, kde nastavíme zadaný bit alebo pin na porte A vo forme výstupu. Potom sa vrátime do banky 0 a dodáme logiku 1 (bit 1) na tento konkrétny pin.

Najbežnejšie registre, ktoré by sme chceli použiť v banke 1, sú STATUS, TRISA a TRISB.

STAV nám pomáha vrátiť sa do banky 0, program TRISA nám umožňuje zvoliť, ktoré piny na porte A sú výstupy a ktoré môžu byť vstupmi, zatiaľ čo TRISB uľahčuje výber medzi výstupom a vstupným kolíkom na porte B. Register SELECT v BANK 0 umožňuje používateľovi otočiť do banky 1.

Zhrňme celý koncept s týmto popisom:

POSTAVENIE:

Aby sme prešli z banky 0 na banku 1, spustíme príkaz do registra STATUS. To sa implementuje nastavením bitu # 5 registra STATUS na 1. Aby sme sa vrátili späť do banky 0, priradíme bit 5 registra STATUS k 0. Register STATUS je umiestnený na adrese 03h, tu h označuje číslo môže byť v šestnástkovej sústave.

TRISA a TRISB:

Nachádzajú sa na adrese 85h a 86h zodpovedajúcim spôsobom. Na programovanie špendlíka ako výstupu alebo vstupu iba dodáme nulu alebo jednu do konkrétneho bitu v registri. Teraz to možno urobiť dvoma spôsobmi, pomocou binárneho alebo hexu. V prípade, že nie je možné konvertovať parameter, môže pre implementáciu hodnôt vyhľadať vedeckú kalkulačku.

Teraz máme 5 pinov na porte A, čo zodpovedá 5 pinom. Ak máme v úmysle opraviť jeden z kolíkov ako vstupy, doručíme „1“ konkrétnemu bitu.

V prípade, že by sme chceli priradiť jeden z pinov ako výstupy, nastavili by sme konkrétny pin na „0“. Bity sú presne pomáhajúce dole zodpovedajúce bitom, alebo presnejšie bit 0 je RA0, bit 1 by bol RA1, bit 2 = RA2 a tak ďalej. Poďme to pochopiť takto:

Predpokladajme, že chcete opraviť RA0, RA3 a RA4 ako výstupy, zatiaľ čo RA1 / RA2 ako i / ps, urobíte tak odoslaním 00110 (06h). Skontrolujte, či je bit 0 smerom doprava, ako je to tu naznačené:

Port A Pin RA4 RA3 RA2 RA1 RA0

Počet bitov 4 3 2 1 0

Binárne 0 0 1 1 0

To isté platí pre TRISB.

PORTA a PORTB

Aby sme dostali jeden z výstupných pinov vysoko, ponúkame v našom registri PORTA alebo PORTB iba „1“ na zvýšenie príslušného bitu. Rovnaký postup je možné dodržať aj pre registre TRISA a TRISB. Predtým, ako sa pustíme do nášho prvého príkladu kódovania, poďme pochopiť kupé ďalších registrov, napríklad: w a f.

W a F

Register W je obyčajný register, ktorý vám umožňuje priradiť ľubovoľnú hodnotu podľa vášho výberu. Akonáhle priradíte magnitúdu k W, môžete pokračovať jej pridaním k inej hodnote alebo ju jednoducho presunúť. Keď je priradená iná hodnota, podrobnosti sa jednoducho prepíšu na W.

Register F postúpi svoje písomnosti do registra. Vyžadovali by sme, aby tento register F priradil hodnotu k registru, môže to byť nad registrami STATUS alebo TRISA, pretože nám to neumožňuje priamo umiestniť hodnoty nad ne. Ukážkový program

Pozrime sa na nasledujúci ukážkový kód, ktorý nám ukáže, ako sa vyššie uvedená inštrukcia implementuje, a bude tiež svedkom niekoľkých pokynov v kurze.

Začnime opravou portu A, ako je uvedené vyššie.

Potrebujeme preto prejsť z banky 0 do banky 1, čo sa deje nastavením registra STATUS na adrese 03h, bit 5 až 1.

BSF 03h, 5

BSF znamená bitová sada F. Po tejto inštrukcii používame dve čísla - 03h, čo je adresa registra STATUS, a číslo 5, ktoré zodpovedá číslu bitu.

Takže hovoríme „Nastaviť bit 5 na adresu 03h na 1“.

Teraz sme v banke 1.

MOVLW 00110b

Vkladáme binárnu hodnotu 00110 (písmeno b znamená, že číslo je v binárnej sústave) do nášho univerzálneho registra W. Mohol by som to samozrejme urobiť v hexade, v takom prípade by naša inštrukcia bola:

MOVLW 06h

Buď funguje. MOVLW znamená „Move Literal Value Into W“, čo v angličtine znamená vložiť nasledujúcu hodnotu priamo do registra W.

Teraz musíme vložiť túto hodnotu do nášho registra TRISA a nastaviť port:

MOVWF 85 h

Táto inštrukcia označuje „Presuňte obsah W na nasledujúcu adresu registra“, v tomto prípade adresa odkazuje na TRISA.

Náš register TRISA v tomto bode nesie číslo 00110 alebo je znázornený graficky:

Port A Pin RA4 RA3 RA2 RA1 RA0

Binárne 0 0 1 1 0

Vstup / výstup O O I I O

Takže teraz máme svoje piny Port A, musíme sa vrátiť do Banky 0 a upraviť jednu z informácií.

BCF 03h, 5

Týmto pokynom sa dosahuje reverz BSF. Znamená to „Bit Clear F“. Dvojica čísel, ktoré zodpovedajú, je adresa registra, tu register STATUS, ako aj bitová postava, v tomto prípade bit päť. Čo presne sme v súčasnosti dokončili, je definované na našej bitke päť

STAV sa zaregistruje na 0

V tejto chvíli sme sa vrátili v banke 0.
Toto je kód uvedený v jednom bloku:

BSF 03h, 5 Prejdite do banky 1
MOVLW 06h Vložte 00110 do W
MOVWF 85h Presuňte 00110 na TRISA
BCF 03h, 5 Vráťte sa späť do banky 0

V rámci posledného pokynu sme vám potvrdili spôsob, ako vytvoriť kolíky portov IO na PIC, aby boli prípadne vstupné alebo výstupné.

Prostredníctvom tohto kurzu vám pomôžem pri odosielaní údajov do portov.

Odosielanie údajov do portov

V nasledujúcom výučbe to dokončíme blikaním LED diódy, ktorá sa skladá z kompletných detailov programu a priamej schémy zapojenia, aby ste videli, ako PIC plní presne to, čo od neho očakávame.

Nepokúšajte sa zostaviť a naprogramovať svoj PIC na základe výsledkov uvedených nižšie, pretože sú iba ilustračné. Spočiatku vytvoríme port A bit 2 ako výstup:

To by sa dalo rozpoznať z predchádzajúceho pokynu. Jediný rozdiel by mohol byť. Opravili sme každý bit pinov na A ako výstup doručením 0h do trojstavového registra. Takže to, čo teraz musí urobiť, je rozsvietiť LED.

Docielime to tak, že naplánujeme jeden z pinov (ten, na ktorý je pripojená LED), vysoko. Aby sme to povedali inak, na špendlík nanesieme „1“. Presne takto sa to deje (vysvetlenie nájdete v komentároch pre každý riadok):

To, čo sme teraz dosiahli, je teda jednorazové zapnutie a vypnutie LED. Chceli by sme, aby sa LED dióda rozsvietila postupne nepretržite.

Dosiahneme to získaním programu na návrat na začiatok. Dosiahneme to tak, že na začiatku nášho programu vytvoríme značku, potom informujeme program, aby tam pokračoval. Značku určujeme celkom priamo.

Zadáme výraz, povedzme ŠTART, ďalej zadajte kód:

Ako je demonštrované, pôvodne sme sa zmienili o výraze „Štart“ hneď na začiatku programu.

Ďalej, na konci programu, sme jasne spomenuli „goto Start“. Inštrukcia „goto“ vykonáva presne to, čo deklaruje.

Tento program dôsledne zapína a vypína LED vždy, keď zapíname obvod, a má tendenciu sa vypínať, keď odpojíme elektrinu. Možno by sme mali znova skontrolovať náš program:

Určite sme vynechali komentáre, napriek tomu môžeme naďalej dodržiavať pokyny a čísla.

To môže byť neskôr mierne zarážajúce, ak sa pokúsite vyriešiť problém s programom a pri písaní kódu ste si všetky adresy zapamätali.

Aj keď komentáre možno umiestniť, mohlo by to byť trochu neprehľadné. Bude to vyžadovať pomenovanie čísel a bude to možné dosiahnuť dodatočnou inštrukciou: „equ“ Inštrukcia „equ“ naznačuje, že niektoré položky sa môžu rovnať iným veciam.

Nemusí to byť pokyn pre PIC, skôr pre asembler. Táto inštrukcia uľahčuje priradenie názvu k umiestneniu adresy registra alebo konštanty k programovému výrazu.

Stanovíme niekoľko konštánt pre náš program a budeme tiež svedkami toho, ako priamočiare je čítanie programu.

Od tejto chvíle sme fixovali konštantné hodnoty, ktoré môžeme pokračovať nastavením do nášho programu. Pred ich použitím je potrebné určiť konštantné hodnoty.

umiestnite ich preto vždy na začiatku programu. Program s vylúčením komentárov ešte raz prepíšeme, aby sme porovnali predchádzajúce označenie s tým najnovším.

Možno si všimnete, že konštanty umožňujú o niečo ľahšie pochopiť program, sme však stále bez komentárov, bez obáv, pretože ešte nie sme hotoví.

Náš blikajúci program LED môže mať malú nevýhodu.
Každá inštrukcia potrebuje na dokončenie 1 hodinovú postupnosť. V prípade, že využívame 4MHz kryštál, potom každá inštrukcia vyžaduje dokončenie 1 / 4MHz alebo 1uS.

Pretože používame iba päť pokynov, LED by sa aktivovala a potom zhasla za 5uS. To by mohlo byť pre ľudí príliš rýchle, aby si to všimli, navyše sa bude zdať, že LED dióda svieti úplne.

Namiesto toho by sme mali dosiahnuť potlačenie medzi zapnutím LED a vypnutím LED. Teória inhibície je taká, že odpočítavame od staršej veličiny, takže keď sa dostane na nulu, prestaneme počítať.

Nulová hodnota znamená záver oneskorenia a náš proces pokračuje v práci počas celého programu. Preto najskôr musíme určiť konštantu, ktorú použijeme ako náš počítadlo.

Vyjadrime túto konštantu COUNT. Potom musíme určiť, od akého významného počtu sa má počítať. Iste, najväčší údaj, ktorý by sme mohli zahrnúť, je 255, alebo FFh v hex., Ako som už hovoril v predchádzajúcom tutoriále, inštrukcia equ priradí výraz situácii v registri.

To znamená, že bez ohľadu na to, aké množstvo pridelíme náš POČET, bude sa zhodovať s položkami v registri. V prípade, že sa pokúsime určiť hodnotu FFh, dostaneme chybu, hneď ako sa dostaneme k zostaveniu programu.

Dôvodom je umiestnenie FFh, preto k nemu nemôžeme získať prístup. Ako teda musíme určiť skutočné číslo? Určite to bude vyžadovať malé bočné premýšľanie.

Ak napríklad označíme náš POČET na adresu 08h, znamenalo by to základné cieľové miesto určenia registra. Predvolene sú nedotknuté oblasti nastavené na FFh. Ak teda COUNT vedie do 08 h, pri prvom zapnutí narazíte na hodnotu FFh. Ako vy však, ako môžeme opraviť COUNT na iné číslo, jediné, čo použijeme, je „presunúť“ najskôr ocenenie do tohto cieľa.

Pre ilustráciu, predpokladajme, že by sme chceli, aby COUNT mal hodnotu 85h, nemôžeme spomenúť COUNT ekv. 85h, pretože to je pozícia mimo Tri-State registra pre Port A. Presne to, čo dosiahneme, je nasledovné: movlw 85h hodnota 85h v registri W movwf 08h

Teraz ju presuňte do nášho 8-hodinového registra. Následne, v prípade, že vyjadríme COUNT ekv. 08h, COUNT by sa zhodoval s hodnotou 85h. Jemné, však? Preto spočiatku určíme našu konštantu: COUNT ekv. 08 h. Potom musíme tento POČET znížiť o jednu, kým sa nestane nulou.

Jednoducho sa tak stane, že existuje jedna inštrukcia navrhnutá na dosiahnutie tohto cieľa za použitia výrazu „go“ a značky.

Inštrukcia, ktorú použijeme, je: DECFSZ COUNT, 1 Táto inštrukcia uvádza ‘Znížiť register (tu je to COUNT) o číslo, ktoré sleduje čiarku. Ak dosiahneme nulu, poskočte o dve miesta vpred. ‘Najskôr ho nájdeme v akcii, až potom ho zaradíme do kurzu.

To, čo sme vykonali, je spočiatku vytvorenie našej konštantnej hodnoty COUNT až 255. Nasledujúci segment umiestni značku nazvanú LABEL blízko našej inštrukcie decfsz.

Decfsz COUNT, 1 zníži hodnotu COUNT o jednu a ponechá konečný výsledok rovno na COUNT. Okrem toho overuje, či má COUNT hodnotu 0.

Ak sa tak nestane, v takom prípade sa program presunie na nasledujúci riadok. Teraz máme vyhlásenie „choď“, ktoré nás vráti späť k našej inštrukcii decfsz.

V prípade, že hodnota COUNT funguje rovnako, potom vedie inštrukcia decfsz k tomu, že náš program poskočí o dve miesta dopredu a bude odoslaná tam, kde sme tvrdili „Pokračujte ďalej“.

Preto, ako môžete pozorovať, sme vytvorili program, aby sme pred pokračovaním sedeli na jednom mieste na vopred určený čas. Toto by sa dalo pomenovať oneskorovacia slučka.

Pochopenie oneskorených slučiek

V prípade, že požadujeme výraznejšie oneskorenie, mohli by sme pokračovať v jednej slučke za druhou. Extra slučky, predĺžili oneskorenie. Poďme aspoň dve, za predpokladu, že chceme pozorovať blikanie LED. Tieto oneskorovacie slučky umiestnime do nášho programu a dosiahneme tým, že z neho urobíme skutočný program zavedením komentárov:

Je možné zostaviť tento program, po ktorom programovať PIC. Je zrejmé, že sa pokúsite obvod skontrolovať, či skutočne funguje. Nasleduje schéma zapojenia, ktorú by ste mali vytvoriť, akonáhle naprogramujete PIC.


Výborne, mohli ste skutočne zostaviť svoj prvý program PIC a skonštruovať obvod na blikanie LED diód. Pokiaľ ste doteraz tieto kurzy absolvovali, mohli ste sa naučiť celkovo sedem inštrukcií z 35, ale nepochybne doteraz ovládate I / O porty!

Pokúsili by ste sa zmeniť slučky oneskorenia tak, aby LED blikali rýchlejšie - čo sa javí ako minimálna hodnota COUNT, aby ste v podstate videli LED blikanie? Alebo možno budete chcieť zahrnúť 3. alebo dodatočné oneskorovacie slučky po počiatočnej, aby ste stabilizovali LED smerom nadol. jedinečná konštanta pre každú oneskorovaciu slučku.

Možno by ste potom mohli skutočne manipulovať so svojimi oneskorovacími slučkami a vykresliť LED blesk určitou rýchlosťou, napríklad po sekunde. V ďalšom návode sa pozrime, ako dokážeme na udržanie kompaktného a základného programu použiť niečo známe ako podprogram. Subrutina je neoddeliteľnou súčasťou kódu alebo programu, na ktorý sa dá kedykoľvek odkazovať. Podprogramy sa používajú v prípadoch, keď často vykonávate identickú funkciu.

Čo sú to podprogramy

Výhody použitia podprogramu spočívajú v tom, že bude pravdepodobne jednoduchšie upraviť hodnotu raz v podprocese, ako je napríklad desaťkrát celý program, a tiež to výrazne prispieva k zníženiu úrovne pamäte, ktorú váš program spotrebuje vo vnútri programu. Obr. Skontrolujeme podprogram:

Spočiatku musíme nášmu podprogramu poskytnúť označenie a v tejto situácii sme vybrali ROUTÍN. Potom napíšeme kód, ktorý by sme chceli vykonať ako obvykle. Preto sme v našom blikajúcom programe LED vybrali oneskorenie. Nakoniec podprogram ukončíme zadaním inštrukcie RETURN.

Aby sme zahájili podprogram odkiaľkoľvek v našom programe, rýchlo napíšeme inštrukciu CALL a potom označenie podprogramu.

Zvážime to trochu podrobnejšie. Akonáhle dôjdeme do časti nášho programu, ktorá volá CALL xxx, v ktorej xxx je názov nášho podprogramu, program skočí kamkoľvek, kde je podprogram xxx nainštalovaný. Vykonajú sa pokyny vo vnútri podprogramu.

Kedykoľvek je vykonaná inštrukcia RETURN, program skočí a vráti sa do nášho hlavného programu k inštrukcii nasledujúcej po našej inštrukcii CALL xxx.

Podobný podprogram je možné zavolať niekoľkokrát, ako by ste chceli, čo vysvetľuje, prečo použitie podprogramov skracuje všeobecné trvanie nášho programu.

Existuje však niekoľko faktorov, o ktorých by ste mali vedieť. Spočiatku, rovnako ako v prípade nášho hlavného programu, je potrebné najskôr potvrdiť všetky konkrétne konštanty, aby ste ich mohli použiť.

Tieto možno potvrdiť v rámci samotného podprogramu alebo priamo na začiatku hlavného programu. Navrhujem, aby ste na začiatku svojho hlavného programu všetko uznali, odvtedy si uvedomíte, že veci sú v rovnakom postavení. Ďalej by ste sa mali ubezpečiť, že hlavný program preskočí podprogram.

Z toho mám na mysli to, že by ste podprogram umiestnili priamo na záver vášho primárneho programu, s výnimkou toho, že ak použijete deklaráciu „Goto“ na preskočenie toho, kde je podprogram, program by pokračoval a implementoval podprogram bez ohľadu na to, či ste požadovať alebo inak.

PIC by nerozlišoval medzi podprogramom a hlavným programom. Skontrolujeme náš blikajúci program LED, tentokrát však použijeme podprogram pre oneskorovaciu slučku. V ideálnom prípade zistíte, o koľko menej sa program javí, ako aj praktické uplatnenie podprogramu.

Nakoniec môžete pozorovať, že využitím podprogramu pre našu oneskorovaciu slučku by sme mohli zmenšiť rozmery programu.

Zakaždým, keď požadujeme oneskorenie, prípadne keď LED svieti alebo nesvieti, v zásade nazývame podprogram oneskorenia. Na konci podprogramu program vedie späť na riadok nasledujúci po našej inštrukcii „Zavolať“. Na ilustrácii vyššie zapneme LED.

Potom kontaktujeme podprogram. Program sa potom vráti späť, aby sme mohli LED vypnúť. Zavoláme podprogram ešte raz, len v prípade, že by sa podprogram mohol dokončiť, program sa vráti späť a následná inštrukcia, ktorú rozpozná, je „goto Start“. Pre kohokoľvek, koho by to mohlo zaujať, bol náš prvý program dlhý 120 bajtov.

Použitím podprogramu by sme mohli znížiť veľkosť nášho programu na 103 bajtov. To by nemohlo znieť tak fantasticky, ale vzhľadom na skutočnosť, že v PIC máme celkovo iba 1024 bajtov, prináša každá malá suma výhody.

V rámci ďalšieho pokynu sa pozrime na čítanie z portov.

Doteraz sme komponovali do Portu A, aby sme mohli LED zapínať a vypínať. V tomto okamihu uvidíme, ako budeme čítať I / O piny na portoch.

Čítanie vstupných / výstupných portov

To je presne preto, aby sme zaistili, že sme schopní prepojiť externý obvod a ovplyvniť všetky konkrétne výstupy, ktoré ponúka.

Ak si zapamätáte z našich predchádzajúcich kurzov, ak chcete založiť I / O porty, bolo treba skočiť z banky 0 do banky 1. Dosiahneme to spočiatku:

V tomto okamihu sme fixovali bit 0 portu A na vstup. teraz musíme preskúmať, či je špendlík vysoký alebo nízky. Na dosiahnutie tohto cieľa je možné použiť iba jeden z dvoch pokynov:

BTFSC a BTFSS.

Inštrukcia BTFSC znamená „Vykonajte bitový test registra, ako aj bit, ktorý určíme.

V prípade, že je to 0, v takom prípade vynecháme následnú inštrukciu ‘. BTFSS znamená „Vykonajte bitový test v registri a bit, ktorý zavedieme. V prípade, že je nastavená na 1, obídeme následnú inštrukciu.

Ktorý z nich použijeme, je presne určený tým, ako si prajeme, aby náš program reagoval pri študovaní vstupu. Pre ilustráciu, v prípade, že čakáme na vstup 1, potom by sme mohli byť schopní využiť inštrukciu BTFSS nasledujúcim spôsobom:

Kód tu:

BTFSS PortA, 0 Pokračujte pokračovaním tu:
:

Program by sa len presunul na „Pokračujte ďalej“ za predpokladu, že bit 0 na PortA je naplánovaný na 1.

V súčasnej dobe napíšeme program, ktorý by mohol signalizovať LED jednu rýchlosť, ale ak je prepínač obmedzený, bliká LED dvakrát pomalšie.

Je možné, že si tento program budete môcť vyskúšať aj sami, aj tak sme však výpis nejakým spôsobom začlenili.

Môžete sa pokúsiť a vytvoriť celý program, aby ste skontrolovali, či ste pochopili princípy. Budeme používať ekvivalentný obvod ako predtým, so zahrnutím prepínača pripojeného RA0 z PIC a kladnej koľajnice našej dodávky.

To, čo sme tu dosiahli, je rozsvietenie LED. Následne zisťujem, či je vypínač vypnutý.

V prípade, že je to obmedzené, potom sa pripojím k nášmu podprogramu oneskorenia. Toto nám poskytuje ekvivalentné oneskorenie ako predtým, v tejto chvíli ho však kontaktujeme dvakrát.

To isté platí, kedykoľvek LED nesvieti. V prípade, že vypínač nie je vypnutý, máme zaznamenané naše predchádzajúce obdobia zapínania a vypínania.

Sledujete tieto lekcie od začiatku, možno sa snažíte pochopiť, že ste v súčasnosti objavili desať z 35 pokynov pre PIC 16F84! A každý z nich sa dá naučiť iba zapnutím a vypnutím LED.

Až doteraz sme zložili PIC blikanie LED diódy zapnutia a vypnutia.

Následne sme boli schopní s našim PIC zahrnúť prepínač, a tým meniť rýchlosť blesku.

Efektívne využitie pamäťového priestoru

Jediným problémom je, že program je dosť zdĺhavý a dosť neefektívny v pamäti. Keď som zahrnul príkazy prvýkrát, zdalo sa mi to v poriadku, mal by však byť vykonateľný ľahší spôsob. Pozitívne je, že budeme analyzovať, ako sme doslova zapínali a vypínali LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Najskôr sme náš w register zaplnili 02h, potom sme ho preniesli do nášho PortA registra, aby sme rozsvietili LED. Aby sme ho vypli, zabalili sme w s 00h, po ktorom sme ho presunuli do nášho registra PortA.

Medzi všetkými týmito rutinami sme boli nútení spojiť sa s podprogramom, aby sme zaistili, že môžeme pozorovať blikanie LED.

Preto sme potrebovali dvakrát preniesť dve sady informácií (jedenkrát do registra w, potom na PORTA) a dvakrát zavolať podprogram (raz zapnúť, raz vypnúť). Ako by sme to teda mohli dosiahnuť s vyššou účinnosťou? Veľmi jednoduché.

Využívame inú inštrukciu známu ako XORF. Inštrukcia XORF pracuje s funkciou Exkluzívne ALEBO v registri, ktorý stanovíme s informáciami, ktoré poskytujeme. Verím, že predtým, ako budeme pokračovať, musím objasniť, čo na svete je Exkluzívne ALEBO. V prípade, že máme dva vstupy a jeden výstup, môže byť vstup iba 1, ak sa tieto dva vstupy líšia. Aj keď sú rovnaké, potom bude mať výstup pravdepodobne hodnotu 0. Nasleduje tabuľka pravdy pre jednotlivcov, ktorí sa rozhodnú skontrolovať tieto položky:

A B F0 0 00 1 11 0 11 1 0

V tomto bode skontrolujeme, čo sa deje, ak vykreslíme B rovnako ako náš predchádzajúci výstup a jednoducho zmeníme hodnotu A:

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

Ak udržíme hodnotu A rovnakú ako 1 a s výstupom použijeme Exkluzívne ALEBO A, výstup sa prepne. Ak si to nemôžete všimnúť z tabuľky pravdy, nižšie to môžeme vidieť pomocou binárneho kódu:

0 prúdový výstup
EX-ALEBO s 1 1 novým výstupom
EX-OR s 1 0 novým výstupom

Možno zistíte, že exkluzívnym ORingom výstupu s 1 teraz prepneme výstup z 0 na 1 na 0.
Preto na zapnutie a vypnutie našej LED diódy potrebujeme iba pár viet:

MOVLW 02h
DVERE XORWF, 1

Čo presne dosiahneme, je pridanie nášho w registra do 02h. V takom prípade sme exkluzívnym ORingom tohto čísla bez ohľadu na to, čo je na našom PortA. V prípade, že bit 1 je 1, zmení sa na 0. V prípade, že bit 1 je 0, zmení sa na 1. Pozrime sa na tento kód raz alebo dvakrát, aby sme zistili, ako beží binárne:

DVERE
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

V skutočnosti nemusíme zakaždým načítať rovnakú hodnotu do nášho registra w, preto je možné to dosiahnuť jednorazovo na začiatku a jednoducho skočiť späť k nášmu príkazu prepínania. Ďalej by sme nemali opravovať hodnotu v našom registri PortA. Dôvod? Iste, pretože v prípade napájania je to 1, môžeme ho ľahko prepnúť. Ja, alternatívne 0 pri zapnutí, by sme to aj teraz prepínali.

Preto by ste chceli vidieť náš novo vytvorený kód. Prvý predstavuje náš blikajúci kód LED, zatiaľ čo druhý zobrazuje kód s pridaním prepínača:

Prajeme vám, aby ste zistili, že jednoduchou inštruktážou sme teraz zmenšili rozsah nášho programu. Pravdou je, že na to, aby sme zobrazili, o koľko by sme mohli naše programy zredukovať, sme predviedli dva programy, iba to, čo bolo zložené, a ich rozmery v tabuľke nižšie:

Dimenzie zmeny programu (bajty)
Blikajúca LED originálna 120
Blikajúci LED podprogram pridaný 103
Použitá blikajúca LED dióda XOR 91
LED so spínačom Original 132
LED dióda s funkciou prepínača XOR použitá 124.

Preto sme nielen objavili niekoľko nových pokynov, ale určite sme navyše zmenšili veľkosť nášho skriptovania!

Ďalej budeme analyzovať, ako môžete krútiť jednotlivými bitmi, vykonávať určitú priamu aritmetiku, ako aj údajové tabuľky.

Logickí manažéri

V rámci posledného tutoriálu som predstavil operáciu Exclusive OR. Funkcia ExOR sa chápe ako logický operátor.

V rámci tohto tutoriálu objasním ďalšie logické operátory, ktoré PIC podporuje. V bodových programoch nebude nijaký prípad, ale naučíme sa jednoduché metódy používania operátorov aplikovaním malých oblastí kódu.

Funkcia AND v zásade analyzuje dva bity a dáva 1, či sú rovnaké, a 0, ak sú rozlišovacie. Napríklad, ak sme spomenuli 1 AND 1, výsledok je 1, zatiaľ čo v prípade, že by sme deklarovali 1 AND 0, dôsledok by bol 0.

Nie je potrebné zdôrazňovať, že sme schopní vyhodnotiť aj slová, rovnako ako všetky funkcie AND, ktoré postupne kontroluje tieto dva pojmy. Nasledujúca inštancia demonštruje, že dve 8-bitové slová sa stávajú AND spolu s produktom:

11001011
A 10110011
Rovná sa 10000011

Dúfam, že súhlasíte, výsledok bude mať dvojicu slov, 1 vždy, keď sú dve sekundy ruka v ruke. Sme schopní napríklad využiť funkciu AND na overenie portov.

V prípade, že kontrolujeme niekoľko I / O pinov, ktoré sú spojené s obvodom, mali by sme dohliadať na konkrétnu situáciu, v ktorej je iba pár pinov vysoko, v takom prípade dokážeme pekne prečítať port, po ktorom A výsledok s podmienkou, ktorú sme skúmali, zhodný s prípadom vyššie.

PIC nám poskytuje dve zložky pre AND.
Sú nimi ANDLW a ANDWF. ANDLW nám umožňuje vykonávať funkciu AND s podrobnosťami registra W a čiastkou, ktorú stanovíme.

Syntax je: ANDLW, kde je presne to, s čím ideme A do obsahu W.

Dôsledok funkcie AND by bol uložený priamo do W registra.
ANDWF nám umožňuje vykonávať funkciu AND v registri W a v inom registri, napríklad PORT. Syntax je: ANDWF, d v ktorom je register, z ktorého sme nadšení, napr. PORTA ad označuje PIC, kam by ste mali umiestniť výsledok. Ak d = 0, výsledok sa vloží do registra W a z d = 1 sa konečný výsledok uloží do registra, ktorý sme určili. Dve časti kódu nižšie zobrazujú dobrý príklad každej funkcie AND.

Prvým je skúmanie stavu PORTA, v ktorej musíme skontrolovať, či sú vstupy 1100. Výsledok môžeme umiestniť späť do W registra

movlw 1100
ANDWF 05h, 0Druhá ilustrácia by teraz mohla overiť obsah registra W:
ANDLW 1100

ALEBO

Teraz sme objavili jednu funkciu OR, presnejšie XOR. Toto sa vyvinie do 1, ak dva bity nie sú rovnaké, ale sú odlišné. Môžete nájsť inú funkciu OR s názvom IOR, ktorá obsahuje OR. Táto funkcia vygeneruje 1 v prípade, že jeden bit je 1, ale ak sú všetky bity rovné 1. Ďalej je uvedená jasná tabuľka pravdy, ktorá to ilustruje:

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

Čo sú to aritmetické operátory

PRIDAŤ

Táto funkcia dosahuje to, čo zvyčajne tvrdí. Prispieva dvoma číslami! V prípade, že dôsledok sčítania týchto dvoch čísel presiahne 8 bitov, v takom prípade bude pravdepodobne nastavený príznak CARRY. Príznak CARRY sa nachádza na adrese 03h bit 0.

Keď je tento bit naplánovaný, potom tieto dve čísla prekročili 8 bitov. Ak je 0, v takom prípade sa dôsledok nachádza do 8 bitov. Rovnako ako predtým, PIC nám poskytuje dva štýly ADD, konkrétne ADDLW a ADDWF. Ako ste si mohli predpokladať, je to podobné ako vyššie uvedená funkcia. ADDLW ponúka obsah registra W, ktorý sme stanovili. Syntax je: ADDLW ADDWF pridá obsah registra W a niektorých ďalších registrov, ktoré označíme.

Syntax je: ADDWF, d je kde

SUB

V tomto okamihu hádam nemôžete predpokladať, čo táto funkcia vedie! Skutočne ste to tušili, táto funkcia
odčíta jeden bit od druhého. PIC nám opäť poskytuje 2 chute: SUBLW a SUBWF. Syntax je úplne podobná ako pre funkciu ADD, okrem toho, že evidentne napíšete SUB namiesto ADD!

Prírastok Ak by sme chceli zahrnúť 1 do čísla v PIC, mohli by sme absolútne využiť funkciu ADD a využiť číslo jedna. ~ Problém je v tom, že najskôr musíme figúru umiestniť do registra W a následne ju pomocou kontroly ADDLW 1 zvýšiť. V prípade, že by sme chceli zahrnúť 1 do registra, môže to byť ešte horšie. Najprv musíme umiestniť číslo 1 do registra W, potom použiť ADDWF, 1. Preto napríklad zahrnutie 1 do polohy 0C, povedzme, budeme musieť vlastniť nasledujúcu časť skriptu:

movlw 01
addwf 0c, 1

Existuje ľahší spôsob, ako to uskutočniť. Môžeme vykonať príkaz INCF. Syntax je: INCF, d kde, je register alebo miesto, ktoré nás zaujíma, a d zobrazuje PIC, kam by ste mali umiestniť výsledok. V prípade d = 0 je výsledok v registri W a v prípade d = 1 je dôsledok nastavený v registri, ktorý sme určili.

Použitím tejto individuálnej inštrukcie sme schopní dosiahnuť päťdesiat percent kódovania. V prípade, že by sme požadovali, aby sa výsledok obnovil do registra W, v takom prípade, ktorý by použil vyššie uvedenú inštanciu, by sme možno museli zahrnúť ďalší príkaz na presunutie položiek 0C späť do registra W, po ktorom sa register 0C vráti späť na no nezáleží na tom, čo to bolo.

Existuje príkaz na zvýšenie. Je to INCFSZ. Tento príkaz by mohol zvýšiť register, ktorý sme určili, ale ak sa register rovná 0 po prírastku (ktorý sa vyskytne, keď zahrnieme 1 až 127), potom PIC pravdepodobne prejde nasledujúcou inštrukciou. Toto odráža časť kódu:

Slučka incfsz 0C
Choďte do slučky
:
:
Zvyšok programu.

Vo vyššie uvedenej časti kódu sa 0C zvýši o 1. Ďalej vlastníme inštrukciu, ktorá informuje PIC o návrate k našej značke s názvom Loop a o 0C sa opäť zvýši o 1. Toto pokračuje, kým 0C sa nebude rovnať 127. Za týchto okolností, keď zvýšime 0C o 1, 0C bude teraz zodpovedať 0. Naša inštrukcia INCFSZ by mohla veľmi dobre informovať PIC, aby vynechal následnú inštrukciu, ktorou je v tomto prípade deklarácia goto, teda PIC pôjde ďalej so zvyškom programu.

Zníženie

Už sme diskutovali o funkcii znižovania v predchádzajúcom tréningu, preto ju už nebudem revidovať.

Doplnok

Záverečná inštrukcia v tejto diskusii by obrátila každý jeden bit v registri, ktorý stanovíme. Syntax je: COMF, d pričom

Pochopenie bitových operácií

To by sa dalo využiť napríklad na rýchlu výmenu pinov portu z výstupu na vstup a podobne. Bitové funkcie nám umožňujú tvarovať jeden bit vo výraze. Umožňujú nám postupovať, nastavovať a zbavovať sa jednotlivých bitov v registroch alebo číslach, ktoré stanovíme.

Na konci tohto kurzu zverejníme program určený na vytvorenie množiny postupných svetiel, ktoré postupujú vpred a potom v opačnom smere. Toto sme dosiahli skôr, keď sme skúmali exkluzívnu funkciu OR, kde sme porty výhradne OR OROVALI výrazom. Až teraz sme si všimli niekoľko bitových funkcií, keď zakladáme porty na PIC, a

Dovoľte mi zopakovať ich využitie tu.

BCF

Táto inštrukcia trochu zotrie, čo určíme v registri, ktorý určíme. Syntax
je:
BCF,

Použili sme to skôr na zmenu zo strany 1 na stranu 0 odstránením bitu v registri STATUS. Môžeme ho tiež použiť na opravu trochy 0 v akomkoľvek inom registri / umiestnení. Napríklad v prípade, že by sme chceli nastaviť 3. bit v 11001101 uloženom v sekcii 0C na 0, mohli by sme
vložiť:

BCF 0C, 03

BSF

Táto inštrukcia by opravila akýkoľvek bit, ktorý nastavíme na 1 v ľubovoľnom registri, ktorý označíme. Toto sme využili skôr na postup zo stránky 0 na stránku 1. Syntax je: BSF, a používa sa presne rovnakou metódou ako BCF vyššie.

BTFSC Až doteraz sme mohli nastaviť alebo vyčistiť trochu v registri. Predstavte si však, či potrebujeme v zásade skontrolovať, či je bit v registri 1 alebo 0?

Určite je možné použiť BTFSC. Uvádza register bitových testov F a preskočí, ak je jasný. Táto inštrukcia bude analyzovať bit, ktorý označíme v registri. V prípade, že bit je 0, inštrukcia by informovala PIC, aby prešiel nasledujúcou inštrukciou.

Túto inštrukciu by sme mohli využiť v prípade, že by sme chceli skontrolovať vlajku, napríklad vlajku na prenášanie. To nás ušetrí potrebou čítať register STATUS a vyhľadávať jednotlivé bity, aby sme sa dozvedeli, ktoré príznaky sú opravené. 29 Napríklad, ak by sme chceli skontrolovať, či bol príznak prenášania nastavený na 1 po pridaní 2 číslic, mohli by sme napísať nasledovné:

BTFSC 03h, 0
pokračujte tu, ak je nastavený na 1
alebo tu, ak je nastavená na 0

V prípade, že stav bit je 1, v takom prípade by bola dokončená inštrukcia nasledujúca po BTFSC. V prípade, že je nastavená na 0, v takom prípade sa následná inštrukcia preskočí. Nasledujúca časť kódu vykazuje, v ktorých by sa mohla použiť:

Slučka:
:
:
BTFSC 03,0
Choďte do slučky

Vo vyššie uvedenom kóde sa PIC jednoducho dostane zo slučky, ak je bit 0 registra STATUS (alebo príznak Carry) definovaný na 0. Alebo by bol vykonaný príkaz goto.

BTFSS

Táto inštrukcia uvádza register bitových testov F a preskočí, ak je nastavený. To môže byť porovnateľné s inštrukciou BTFSC, okrem toho by PIC vynechal následnú inštrukciu, ak je bit, ktorý vyhodnocujeme, nastavený na 1, namiesto 0.

CLRF

Táto inštrukcia by opravila všetky podrobnosti registra na 0. Syntax je:

CLRF
Použili sme to skôr na nastavenie výstupu portov na 0 aplikáciou CLRF 85h. Ďalej sme ho použili na opravu portov tak, aby obsahovali všetky piny na výstup pomocou CLRF
05h.

CLRW

Môže to pripomínať inštrukciu CLRF, s výnimkou vymazania registra W. Syntax je veľmi jednoduchá:

CLRW

RLF a RRF

Tieto smery by transportovali trochu v registri jeden slot vľavo (RLF) alebo vpravo (RRF) v registri. Napríklad, ak by sme potrebovali 00000001 a použili by sme RLF, v takom prípade by sme mohli vlastniť 00000010. Čo sa stane v tomto okamihu, ak existuje 10000000 a použije sa inštrukcia RLF? Iste by bola 1 umiestnená v nosnej vlajke. V prípade, že by sme použili inštrukciu RLF ešte raz, 1 by sa znovu objavila späť na začiatku. Podobné sa vyskytuje, ale naopak, pre inštrukciu RRF. Prípad v bode nižšie to ukazuje pre inštrukciu RLF, v ktorej môžeme vidieť 8 bitov registra, ako aj príznak carry:

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

Ukážkový program

Teraz uvidíme ukážkový kód, ktorý je možné zostaviť a riadiť. Generovalo by to sekvenčné svetlo začínajúce na PortA bit 0, idúce na PortB bit 8 a
potom sa vracia.
Pripojte LED diódy ku každému z pinov portu. Niečo z toho budeme mať
postupy uvedené v tomto návode.

TIME EQU 9FH Premenná pre oneskorenú slučku.
Adresa portu P PORTB EQU 06H.
TRISB EQU 86H Port B Tristate adresa.
Adresa PORTA EQU 05H Port A.
TRISA EQU 85H Port A Tristate adresa.
STAV EQU 03H Stránka vyberte register.
COUNT1 EQU 0CH Loop register.
COUNT2 EQU 0DH Loop register.

STAV BSF, 5 Prejdite na stranu 1
MOVLW 00H a nastaviť
MOVWF TRISB obidva porty A a B.
MOVLW 00H na výstup,
Potom sa vráťte na server MOVWF TRISA
STAV BCF, 5 strana 0.
MOVLW 00H Čistý port A.
DVERE MOVWF

Spustenie hlavného programu

RUNMOVLW
01H Nastaviť prvý bitMOVWF
PORTB v prístave B. VOLAJTE
MEŠKANIE Počkajte chvíľuVOLAŤ
Meškanie
Posuňte bit na portu B doľava a potom pozastavte.RLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRLF
PORTB, 1 Toto posúva bit do nosnej vlajky
Teraz prejdite na port A a posuňte bit doľava.RLF
PORTA, 1 Týmto sa bit presunie z nulového príznaku do PortACALL
DELAYCALL DELAYRLF
DVERE, 1VOLANIE
DELAYCALL
DELAYRLF
DVERE, 1VOLANIE
DELAYCALL
DELAYRLF
DVERE, 1VOLANIE
DELAYCALL
Meškanie
Posuňte bit späť na port ARRF
DVERE, 1VOLANIE
DELAYCALL
DELAYRRF
DVERE, 1VOLANIE
DELAYCALL
DELAYRRF
DVERE, 1VOLANIE
DELAYCALL
DELAYRRF
PORTA, 1 Toto posúva bit do nulovej vlajky. Teraz posuňte bit
späť na port BRRF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRRF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRRF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRRF
PORTB, 1 VOLANIE
DELAYCALL DELAYRRF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRRF
PORTB, 1 VOLANIE
DELAYCALL
DELAYRRF
PORTB, 1 VOLANIE
DELAYCALL
Meškanie Teraz sme späť tam, kde sme začali, GOTO
UTEČTE poďme znova.

V tréningovej sade existuje skvelá možnosť, ktorá vám umožňuje využívať údajovú tabuľku.

Dátová tabuľka je iba zoznam cenových ponúk, v ktorých je všetko prehliadané na základe niekoľkých úvah.
Môžete mať napríklad obvod, ktorý využíva PIC, ktorý počíta počet prípadov, za ktoré sa vstupný pin za 1 sekundu zvýši. Potom môžete číslo vystaviť na 7-segmentovom displeji.

Hneď ako sa spustí načasovanie, PIC začne počítať množstvo príležitostí, kedy je špendlík vysoký. Po 1 sekunde navštívi stôl a vzhliadne údaje, na displeji musí zobraziť číslo, ktoré symbolizuje množstvo situácií, v ktorých sa špendlík dostal vysoko. To môže byť prospešné, pretože neurčujeme, aké by to mohlo byť, kým PIC nedosiahne svoj odhad.

Použitím tabuľky dokážeme PIC umožniť určiť, ktorú postavu má zobraziť. V tomto okamihu, skôr ako vám ďalej ukážem, ako funguje tabuľka údajov, možno budem musieť povedať, že PIC udržiava cestu pobytu v programe, kým je, kým program funguje.

Uľahčuje to tým, ktorí vykonali určité programovanie v jazyku BASIC. Inak sa nemusíte báť, možno budete chcieť pokračovať v učení sa o teórii. Predstavte si, že existuje program BASIC podobný programu uvedenému nižšie:

10 ROKOV K = 0
11 K = K + 1
12 AK K> 10 POTOM GOTO 20 INÉ GOTO 11
20 TLAČ K
21 KONIEC

Program začína na riadku 10. Len čo je K naplánovaná na 0, pokračuje ďalej na riadok 11. Potom, čo sme zahrnuli 1 do K, pokračujeme do riadku 12.

V tomto okamihu by nás mohlo zaujímať, či je K vyššie ako 10. Ak áno, pokračujeme ďalej k riadku 20, inak sa vrátime k riadku 11.

Riadok 20 dokumentuje K a riadok 21 uzatvára program. BASIC využíva štatistiku liniek, aby programátorovi pomohol zaznamenať, kde sú problémy, pretože štítky nie sú autorizované. PIC zamestnáva štítky na únik medzi cieľmi - alebo je to naozaj tak?

Štítky používame na to, aby sme si boli vedomí toho, kde sú problémy, a tiež na to, aby sme mohli PIC jednoduchým spôsobom informovať, kde hľadať.

Presne to, čo sa stane, je PIC, ktorý využíva počítadlo vnútorných liniek nazývané Programové počítadlo. Stopa programu Counter (skrátene PC) cieľovej pamäte, kde je súčasná inštrukcia.

Kedykoľvek informujeme PIC o návšteve zvoleného štítku, rozumie pamäťovému miestu, a preto rozširuje počítač, kým neuvidí cieľ pamäte. Je to presne tá istá metóda, ktorú sme si vyskúšali vyššie v programe BASIC. Ďalej je uvedený segment kódu s pamäťovými priestormi alebo položkami počítača PC, ktorý obsahuje všetky pokyny:

Pokyny pre PC 0000 movlw 03
0001 movwf 0C
0002 Slučka decfsc 0C
0003 prejsť na slučku
0004 koniec

V ukážke vyššie sme opravili PC na 0000. Na tomto máme inštrukciu movlw 03. Keď PIC implementoval tieto dáta, zvýši PC, aby sa naskenovala následná inštrukcia. V tomto okamihu PIC pohľady movwf 0C. Počítač sa znova zvyšuje.

Teraz PIC štúdie decfsc 0C. V prípade, že podrobnosti 0C nie sú 0, v takom prípade sa PC zvýši o 1, rovnako ako nasledujúca inštrukcia goto Loop informuje PC o návrate do polohy 0003, čo je uvedená Loop. V prípade, že sú podrobnosti 0C 0, potom sa PC odporúča zvýšiť o 2, nasledujúcu inštrukciu jednoducho vynechať.

Pochopenie údajových tabuliek

Toto umiestni PC na pozíciu 0004, kde program skončí. Ciele určuje asembler a všeobecne by nás nemalo zaujímať, čo dosahuje počítač. Kým nenájdeme potrebu dostať ju pod kontrolu, rovnako ako pri využívaní údajových tabuliek. Najpohodlnejším spôsobom, ako opísať fungovanie dátovej tabuľky, je začať s ilustráciou.

PC ekv 02
movlw 03
volací stôl
:
tabuľka addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
návrat

Prvotnou inštrukciou je pridelenie štítku PC s adresou počítadla programov (02h). Budeme čoskoro po vložení hodnoty 03h do registra w. Potom komunikujeme so stolom. Najprednejší riadok v tabuľke podprogramov rozširuje podrobnosti o registri W (03h) o počítadlo programu.

Tým sa spustí počítadlo programov, ktoré sa zvýši o 3, alebo inak povedané, stimuluje počítadlo programov k postupu o 3 riadky nižšie. Zatiaľ čo počítadlo dorazí o 3 riadky nižšie, PIC rozpozná inštrukciu retlw. Tento príkaz odošle nasledujúcu hodnotu do registra W, po ktorom sa vráti z podprogramu. RETLW v podstate znamená návrat, doslovne k W.

Pozri, za slovo Návrat som vložil čiarku. Pretože sme v podprogramu, potrebujeme na jeho povrch inštrukciu Návrat. Preto RET v pokyne. Po inštrukcii RETLW je číslo, a to je presne to, čo je vložené do W registra.

V tomto prípade je to obrázok 3. Mohli by sme označiť ľubovoľnú veličinu do registra W, pokiaľ je tento údaj kombinovaný s programovým počítadlom v podprograme tabuľky, objavíme inštrukciu retlw. Na vyššie uvedenom obrázku to znamená, že sme schopní vlastniť ľubovoľné číslo od 1 do 7. V prípade, že budeme postupovať za podprogramom, môžeme dokončiť vykonanie ďalšej časti programu. Z tohto dôvodu je zvyčajne rozumné presunúť tabuľku s údajmi presne na koniec programu PIC, preto ak v takom prípade dôjde k prekročeniu, každopádne dospejeme k záveru programu.

Téma prerušenia bude pravdepodobne najdlhšia a najťažšia.

Nenájdete nijakú nekomplikovanú metódu podrobného opisu prerušení, s trochou šťastia ku koncu tejto časti však budete pravdepodobne môcť aplikovať prerušenia do svojich vlastných programov.
Sekciu sme rozdelili na 2 etapy. To znamená umožniť rozdelenie témy na jednotlivé sekcie a tiež vám poskytne praktické doplnenie pre ľahké pochopenie.

Čo je to vlastne prerušenie? Iste, ako tento výraz naznačuje, prerušenie je technika alebo signál, ktorý mikroprocesoru / mikrokontroléru bráni v akejkoľvek činnosti, ktorú vykonáva, aby sa mohlo stať niečo iné.

Dovoľte mi, aby som vám dal dennú ilustráciu. Myslíte si, že relaxujete vo svojom vlastnom dome a konverzujete s inou osobou. Zrazu zaznie telefón.

Prestanete rozprávať a chytíte telefón, aby ste hovorili s volajúcim. Po telefonickom rozhovore sa rozhodnete vrátiť sa k rozhovoru s jednotlivcom skôr, ako zazvoní telefón. Počas rozhovoru s niekým je možné brať do úvahy hlavnú rutinu, zvonenie telefónu vám môže narušiť konverzáciu a prerušenie rutiny je metóda hovorenia po telefóne.

Kým sa telefonická diskusia končí, vrátite sa k svojej hlavnej rutine chatovania. Táto ilustrácia je presným príkladom toho, ako prerušiť činnosť procesora.

Primárny program je v činnosti a vykonáva určitú funkciu v obvode. Ak však dôjde k prerušeniu, primárny program sa zastaví, keď sa vykonáva iná rutina. rutina končí, procesor sa vráti späť k primárnej rutine rovnako ako predtým.

Pochopenie prerušenia

PIC má 4 zdroje prerušenia. Dali by sa rozdeliť do niekoľkých skupín. Dva sú zdroje prerušenia, ktoré sa dajú využiť navonok na PIC, zatiaľ čo ďalšie dva sú vnútorné procesy. Tu objasním dva vonkajšie typy. Ďalšie dva budú popísané v rôznych tutoriáloch, akonáhle prídeme k časovačom a ukladaniu údajov.

Ak by ste si pozreli vývod PIC, všimli ste si, že pin 6 je RB0 / INT. V tomto okamihu je RB0 jednoznačne port B bit 0. INT predstavuje, že by mohol byť konfigurovaný aj ako vonkajší prerušovací pin. Ďalej, piny portu B 4 až 7 (piny 10 až 13) možno tiež použiť na prerušenie. Predtým, ako budeme schopní zamestnať INT alebo iné piny Portu B, musíme splniť dve úlohy. Najskôr musíme PIC informovať, že budeme využívať prerušenia.

Ďalej musíme určiť, ktorý pin B portu budeme používať skôr ako prerušenie ako ako I / O pin. Vo vnútri PIC nájdete register známy ako INTCON a je na adrese 0Bh. V tomto registri nájdete 8 bitov, ktoré môžu byť povolené alebo zakázané. Bit 7 INTCON je známy ako GIE. Toto je globálne povolenie prerušenia. Oprava tejto hodnoty na 1 informuje PIC, že použijeme prerušenie.

Bit 4 nástroja INTCON je známy ako INTE, INTerrupt Enable. Uvedenie tohto bitu na 1 sprostredkuje PIC, že RB0 bude prerušovacím kolíkom. Konfigurácia bitu 3, nazývaného RBIE, informuje PIc, že ​​budeme využívať bity portu B 4 až 7. V tomto okamihu PIC chápe, kedy môže byť tento pin vysoký alebo nízky, musí zastaviť to, čo vykonáva, a pokračovať v prerušení rutina. V tomto okamihu musíme informovať PIC, či bude alebo nebude prerušenie pravdepodobne na transformácii signálu na vzostupnej hrane (0V až +5V) alebo na zostupnej hrane (+5V až 0V).

Zjednodušene povedané, chceme, aby PIC prerušil zakaždým, keď sa signál pohybuje z nízkej na vysokú alebo z vysokej na nízku. Delikvenciou sa dá zistiť, že sa to dá umiestniť na nábežnú hranu.

„Spúšťanie“ okraja je naplánované v ďalšom registri, ktorý sa nazýva register OPTION, na adrese 81h. Bit, ktorým sme nadšení, je bit 6, často označovaný ako INTEDG.

Nastavením na 1 sa spustí narušenie PIC na montážnej hrane (predvolený stav) a nastavením na 0 sa stimuluje PIC na narušenie na posuvnej hrane. Ak chcete, aby sa PIC aktivoval na nábežnej hrane, potom s týmto bitom určite nemusíte nič robiť.

V tomto okamihu je, žiaľ, register Option v banke 1, čo znamená, že nás baví modifikácia z banky 0 na banku 1, nastavenie bitu v registri Option, po tomto návrate do banky 0. Kľúčom je dosiahnuť každý bit banky 1 sa zaregistruje v jednom štrajku, napríklad vytvorením kolíkov portu, potom sa vráti do banky 0, ak ste hotoví.

Fajn, následne sme informovali PIC, ktorý pin bude pravdepodobne prerušením a kde sa má hrana spustiť, čo sa deje v programe a PIC vždy, keď dôjde k prerušeniu? Koná sa pár vecí. Úplne najskôr je naplánovaná „vlajka“.

Toto informuje interný procesor PIC o tom, že došlo k prerušeniu. Ďalej programové počítadlo (o ktorom som hovoril v rámci predchádzajúceho tutoriálu) prepíše na konkrétnu adresu v rámci PIC. Poďme si všetko rýchlo pozrieť jednotlivo. Príznak prerušenia V našom registri INTCON je bit 1 príznakom prerušenia, ktorý sa nazýva INTF. V tomto okamihu, kedykoľvek dôjde k prerušeniu, bude tento príznak pravdepodobne nastavený na 1.

Ak nedôjde k prerušeniu, je vlajka umiestnená na 0. Rovnako to je takmer všetko. V tejto chvíli si možno kladiete otázku „o čo ide?“ Iste, aj keď je tento príznak naplánovaný na 1, PIC nie je schopný a nebude reagovať na ďalšie prerušenie. Preto si dovoľte povedať, že spôsobíme prerušenie. Vlajka bude pravdepodobne nastavená na 1 a PIC môže ísť do našej rutiny na prácu s prerušením.

Keď tento príznak nebol fixovaný na 1 a PIC bolo povolené pokračovať v odpovedaní na prerušenie, potom neustále pulzovanie špendlíka mohlo udržať PIC v návrate na začiatok našej rutiny prerušenia a v žiadnom prípade ho nedokončil. Keď sa vrátim k mojej ilustrácii telefónu, je to podobné ako zdvihnutie telefónu. Akonáhle začne diskusia, začne zvoniť znova, pretože si s vami chce hovoriť iná osoba.

Je vhodné dokončiť jeden dialóg, potom znova chytiť telefón a hovoriť s nasledujúcim jednotlivcom. S týmto príznakom môžete nájsť malý problém. Aj keď PIC rýchlo nastaví tento príznak na 1, nenastaví ho znova na 0! Túto činnosť musí vykonávať programátor - teda vy. Toho sa dá dosiahnuť bez námahy, pretože som si istý, že to je potrebné dosiahnuť, až keď PIC vykoná rutinu prerušenia.

Umiestnenie pamäte Kedykoľvek pôvodne zapnete PIC alebo v prípade, že dôjde k vynulovaniu, programový počítadlo tipuje na adresu 0000h, ktorá by mohla byť okamžite na začiatku programovej pamäte. Ale v prípade, že dôjde k prerušeniu, programový počítadlo by označil adresu 0004h.

Preto aj keď skladáme náš program, ktorý bude mať prerušenia, najskôr musíme informovať PIC, aby preskočil adresu 0004h, a udržiavať rutinu prerušenia, ktorá začína na adrese 0004h, oddelene od zvyšku programu.

To môže byť bezproblémové. Spočiatku začíname náš program príkazom známym ako ORG. Tento príkaz označuje počiatok alebo štart. Držíme sa toho adresou. Pretože PIC začína na adrese 0000h, napíšeme ORG 0000h. Potom musíme obísť adresu 0004h. Dosiahneme to tým, že dáme inštrukciu GOTO sprevádzanú štítkom, ktorý označuje náš primárny program.

Potom nasledujeme tento príkaz GOTO s ďalším jedným ORG, tento okamih s adresou 0004h. Až po tomto príkaze vložíme našu prerušovaciu rutinu. V tomto bode by sme mohli byť schopní zadať našu prerušovaciu rutinu priamo po druhom príkaze ORG, alebo sme schopní umiestniť príkaz GOTO, ktorý ukazuje na prerušovaciu rutinu.

Skutočne to súvisí s možnosťou z vašej strany. Aby sme informovali PIC, ktorý ponúka, dospeli k záveru prerušovacej rutiny, musíme umiestniť príkaz RTFIE ku koncu rutiny. Tento príkaz znamená návrat z rutiny prerušenia. Keď si to PIC všimne, počítadlo programu indikuje konečnú pozíciu, na ktorej bol PIC predtým, ako došlo k prerušeniu. Nižšie sme vytvorili krátku časť kódu, ktorá slúži na zobrazenie vyššie uvedeného:

Pri využívaní prerušenia by ste mali byť informovaní o niekoľkých veciach. Počiatočné má tendenciu byť, že ak vo svojom primárnom programe a rutine prerušenia využívate identický register, nezabudnite, že keď dôjde k prerušeniu, podrobnosti registra sa s najväčšou pravdepodobnosťou zmenia.

Využime napríklad register w na preposielanie údajov do primárneho programu Port A, preto môžete dodatočne využiť register w v rutine prerušenia na presun údajov z jedného cieľa do druhého.

V prípade, že nie ste obozretní, register w bude obsahovať poslednú hodnotu, ktorú prijal, kým bola v rutine prerušenia, takže keď sa vrátite z prerušenia, táto informácia sa doručí do portu A, a nie do hodnoty, ktorú ste predtým vlastnili. došlo k prerušeniu.

To znamená, že je potrebné dočasne uložiť podrobnosti registra w pred tým, ako ho znova použijete v rutine prerušenia. Druhou je skutočnosť, že môžete nájsť oneskorenie medzi tým, kedy dôjde k jednému prerušeniu, a tým, kedy môže nastať ďalšie. Aj keď ste pochopili, PIC má vonkajšie hodiny, ktoré by mohli byť kryštál alebo kombo rezistor-kondenzátor.

Bez ohľadu na frekvenciu týchto hodín, PIC ich vydelí 4, potom ich použije pre svoje vnútorné načasovanie. Napríklad v prípade, že máte k svojmu PIC pripojený 4MHz kryštál, v takom prípade by PIC vykonal pokyny pri 1MHz. Toto vnútorné časovanie je známe ako inštruktážny cyklus. V tomto okamihu údajový list tvrdí (nepochybne v zmenšenej tlači), že musíte medzi prerušeniami povoliť 3 až 4 inštruktážne kolá.

Moje by bolo umožniť 4 kolá. Dôvodom oneskorenia je skutočnosť, že PIC vyžaduje čas na preskočenie na adresu prerušenia, príznak a návrat späť z rutiny prerušenia. Preto majte na pamäti toto, ak pracujete s alternatívnym obvodom na aktivácii prerušenia pre PIC.

V tomto bode je bodom skutočnosť, že ak použijete bity 4 až 7 portu B ako prerušenie. Nie ste schopní zvoliť konkrétne piny na porte B, ktoré fungujú ako prerušenie.

Preto, v prípade, že tieto piny povolíte, je pravdepodobné, že budú všetky dostupné. Preto napríklad nemôžete mať iba bity 4 a 5 - bity 6 a 7 budú pravdepodobne oprávnené súčasne. Čo presne je účelom toho, aby štyri bity predstavovali prerušenie? Iste by ste mohli mať okruh napojený na PIC, pre prípad, že by ktokoľvek zo štyroch riadkov išiel vysoko, v takom prípade môže ísť o problém, ktorý vyžaduje, aby PIC ovplyvnil okamžite.

Jedným z príkladov toho môže byť domáci bezpečnostný alarm, v ktorom sú štyri snímače spojené s pinmi 4 až 7. Port B môže byť vyzvaný ľubovoľným konkrétnym snímačom. Rutina signalizácie alarmu je rutina prerušenia. Toto šetrí neustálu kontrolu portov a umožňuje PIC pokračovať v rôznych záležitostiach. V rámci nasledujúceho tutoriálu vytvoríme program na správu prerušenia.

V minulom tutoriáli sme sa zaoberali mnohými základmi, a preto mám pocit, že nadišiel čas, keď sme zostavili náš prvý program.

Program, ktorý napíšeme, spočíta počet príležitostí, ktoré zapneme, a potom počet vystavíme.

Program by počítal od 0 do 9, viditeľný na 4 LED v binárnej forme, spolu so vstupom alebo prerušením bude pravdepodobne na RB0.

Najdôležitejšou vecou, ​​ktorú musíme urobiť, je informovať PIC o preskočenie adresy, na ktorú programový pult ukazuje, kedykoľvek dôjde k prerušeniu.

Uvidíte, že používame jedinečnú metódu vykazovania hexadecimálnych čísel. Predtým, ako som sa stal, použite F9h, v ktorom h označuje hexadecimálne číslo. Mohli by sme to napísať ako 0xF9, čo je štruktúra, ktorú odteraz použijeme.

Teraz musíme PIC povedať, že budeme používať prerušenia a ako prerušovací pin používame pin 6 RB0:

bsf INTCON, 7GIE - globálne povolenie prerušenia (1 = povolenie)
bsf INTCON, 4INTE - povolenie prerušenia RB0 (1 = povolenie)
Vymažem príznak prerušenia pre každý prípad (nikdy ničomu neverím!)
bcf INTCON, 1INTF - Jasný príznakový bit pre každý prípad

Momentálne musíme založiť naše 2 porty. Majte na pamäti, že keďže v súčasnosti využívame RB0 ako prerušovací kolík, je potrebné ho ustanoviť ako vstup:

Na uloženie počtu prepínačov použijeme premennú s názvom COUNT. Mohli by sme jednoducho zvýšiť hodnotu na porte A, ale uvidíte, prečo používam premennú, keď píšeme svoju prerušovaciu rutinu.

Preto je náš hlavný program zložený a v tomto okamihu musíme informovať PIC, ako postupovať, kedykoľvek dôjde k prerušeniu. V tomto príklade bude naším prerušením pravdepodobne prepínač. Chceli by sme, aby bol PIC jeden k nastaviteľnému POČTU zakaždým, keď dôjde k obmedzeniu prepínača.

Avšak iba by sme chceli ukázať, koľkokrát sa prepínač vypne z 0 na 9. Vyššie som uviedol, že by sme mohli byť schopní jednoducho zvýšiť hodnotu na porte A zakaždým, keď dôjde k prerušeniu. Port A má však 5 bitov, pre prípad, že by sme jednoducho zvýšili port, budeme mať najvyšší počet 31. Existuje niekoľko vysvetlení, prečo som sa rozhodol nepohnúť až na 31.

Spočiatku použijeme 7-segmentovú obrazovku, ktorá by mohla prechádzať maximálne od 0 do 15 (0 až F v šestnástke). Ďalej by som vám chcel ukázať niekoľko aritmetických príkazov, ktoré ste narazili na posledných hodinách.

Preto budeme pokračovať v našej prerušovacej rutine. Momentálne prvé, čo musíme dosiahnuť, je stručné uloženie podrobností nášho registra w, pretože to aplikujeme na presun obsahu COUNT do PORTA. V prípade, že to neuložíme, v takom prípade by sme kvôli našej aritmetike mohli byť schopní doručiť úplne odlišné číslo. Preto to najskôr dosiahneme:

V tomto bode chápeme, či je hodnota COUNT 9 alebo viac. To, čo teraz musíme dosiahnuť, je, ak je COUNT viac ako 9, umiestnite ho späť na 0 alebo sa vráťte k hlavnému programu, aby sme sa ubezpečili, že sme schopní ho doručiť na port A. Príkaz BTFSS, pretože chápete, že následný
inštrukcia v prípade, že je naplánovaný príznak carry, tj. COUNT = 10:

Jediné, čo teraz zostáva, je kolektívne zadávanie a určovanie hodnôt našich konštánt, ktoré sme schopní vykonať hneď na začiatku nášho programu.

Zakaždým, keď aktivujete zapnutie, LED diódy sa budú počítať v binárnom formáte od 0000 do 1010, potom späť do 0000.

Nasledujúci obrázok zobrazuje schému zapojenia kompatibilnú s vyššie vysvetleným kódom. Je zaujímavé, že do návrhu bol zahrnutý aj časovací kondenzátor. Toto je pekný malý trik, vďaka ktorému získate slobodu vyhnúť sa zapojeniu kondenzátora, ak počas tejto doby nemáte žiaden so sebou.

Tu vstupuje do hry kapacita prostredníctvom rozptýlenej kapacity cez kolík oscilátora a zem.
Samozrejme sa nemusí zdať, že by to bol veľmi inteligentný spôsob, ako sa kondenzátoru prakticky vyhnúť, pretože túlavá hodnota sa môže za rôznych daných podmienok meniť.

Ďalšou časťou, ktorú je možné v obvode vidieť, je vypovedajúca sieť cez prepínač. Tým sa zabráni rušeniu pri mechanickom prepínaní a zabráni sa zámene PIC, ak išlo o prepínanie jedným alebo viacerými prepínačmi.




Dvojica: Programovateľný obojsmerný obvod časovača motora Ďalej: Ako fungujú obvody Buck-Boost