Vadnica PIC - Od registrov do prekinitev

Preizkusite Naš Instrument Za Odpravo Težav





Preden se podrobno seznanimo s programiranjem PIC, bi bilo najprej pomembno, da se naučimo nekaj dobrih metod programiranja.

Razumevanje registrov

Za začetek predpostavimo, da vtipkate (podpičje) na kateri koli točki programa, prevajalnik pa bo vse, kar pride po tem podpičju, prezrl, dokler se kočija seveda ne vrne v položaj.



Zgornja funkcija nam omogoča dodajanje komentarjev ali pripomb, tako da ne postanejo del programa, vendar nam olajša prepoznavanje programa s pomočjo komentarjev ob njem. Dajanje komentarjev je priporočljiva praksa pri programiranju katerega koli IC.

Naslednja pomembna stvar na tečaju je dodeliti imena različnim konstantam (kasneje se jih boste podrobneje naučili). Ta aso poenostavi razumevanje, v kaj se piše ali glede vključenih vrednosti, namesto da bi se zamenjali s priloženimi številkami.



Zgoraj je treba to narediti v obliki dejanskih imen za takojšnje prepoznavanje, na primer COUNT. Pomembno je opozoriti, da so tukaj uporabljene vse velike črke, da je to razločno, in tudi, da gre za konstantno vrednost.


Kot lahko vidimo, je zgoraj narejeno v obliki škatle iz podpičja, zaradi česar je videti bolj čisto. Poleg tega poskusite program dokumentirati tudi na papirju, ta praksa vam bo pomagala razumeti stvari postopoma.

2. Registri.

Register znotraj PIC je področje, ki sprejema tudi pisne podrobnosti in omogoča branje iz njega. Lahko ga primerjate s listom papirja, kjer lahko vizualizirate vsebino in jo dodate tako, da nanjo pišete.

Spodnja slika prikazuje tipično mapo registrske datoteke, vdelano v PIC16F84. Format ni nekaj, kar je dejansko nastavljeno znotraj PIC-a, ampak preprosto označuje, kako so lahko biti razporejeni znotraj čipa, in razume nekaj vključenih ukazov.

Vidite lahko, da je v bistvu razdeljena na banko 0 in banko 1. Banka 1 je odgovorna za nadzor dejanskega delovanja PIC-a, na primer sporoči PIC-u, kateri biti v pristanišču A so določeni kot vhodi in kateri kot izhodi.

Banka 2 je namenjena samo manipulaciji z informacijami.

Razumimo to na naslednjem primeru:

Recimo, da želimo dodeliti en bit na PortA high. Za to bi morali najprej iti do banke 1 za nastavitev določenega bita ali zatiča na priključku A v obliki izhoda. Po tem se vrnemo v banko 0 in na ta posebni zatič dostavimo logiko 1 (bit 1).

Najpogostejši registri, ki bi jih radi uporabljali v banki 1, so STATUS, TRISA in TRISB.

STATUS nam pomaga, da se vrnemo v banko 0, TRISA nam omogoča, da izberemo, kateri zatiči na priključku A so izhodi in kateri so lahko vhodi, medtem ko TRISB olajša izbiro med izhodnim in vhodnim zatičem na vratih B. Register SELECT v BANK 0 omogoča uporabniku preusmeriti na banko 1.

Povzemimo celoten koncept z naslednjim opisom:

STANJE:

Za prehod iz banke 0 na banko 1 ukažemo STATUS registru. To se izvede z nastavitvijo bita št. 5 registra STATUS na 1. Da se vrnemo nazaj v banko 0, damo bit 5 registra STATUS na 0. Register STATUS se nahaja na naslovu 03h, tukaj h pomeni tat številko je lahko v šestnajstiški.

TRISA in TRISB:

Ti se nahajajo na naslovih 85h in 86h. Za programiranje zatiča kot izhoda ali vhoda pravkar dostavimo ničlo ali eno določenemu bitu v registru. Zdaj je to mogoče storiti na dva načina, prek binarnega ali Hex-a. Če parametra ne more pretvoriti, se lahko odloči za znanstveni kalkulator za izvajanje vrednosti.

Zdaj imamo na priključku A 5 zatičev, kar ustreza 5 zatičem. Če nameravamo enega od zatičev pritrditi kot vhode, dobimo določen bit '1'.

V primeru, da bi želeli enega od zatičev dodeliti kot izhode, bi določen zatič postavili na '0'. Biti so pomoč, ki natančno ustreza bitom, ali natančneje bit 0 je RA0, bit 1 bi bil RA1, bit 2 = RA2 in tako naprej. Razumejmo tako:

Recimo, da želite popraviti RA0, RA3 in RA4 kot izhode, medtem ko RA1 / RA2 kot i / ps, to storite s pošiljanjem 00110 (06h). Preverite, da je bit 0 v desno, kot je prikazano tukaj:

Priključite pin RA4 RA3 RA2 RA1 RA1 RA0

Število bitov 4 3 2 1 0

Binarno 0 0 1 1 0

Enako velja za TRISB.

PORTA in PORTB

Da bi dobili enega od izhodnih zatičev visoko, v našem registru PORTA ali PORTB ponudimo le '1' do ustreznega bita. Identičen postopek lahko sledimo tudi za registre TRISA in TRISB. Preden pospešimo v prvi primer kodiranja, razumimo le še nekaj registrov, in sicer: w in f.

W in F

W register je navaden register, ki vam omogoča dodelitev poljubne vrednosti po vaši izbiri. Takoj, ko W določite velikost, lahko nadaljujete tako, da to dodate drugi vrednosti ali pa jo preprosto premaknete. Z drugo dodeljeno vrednostjo se podrobnosti preprosto prepišejo na W.

Register F posreduje svoje pisne zadeve v register. Zahtevali bi, da ta register F dodeli vrednost registru, lahko je čez regije STATUS ali TRISA, saj nam ne omogočajo, da vrednosti postavimo neposredno nadnje. Primer programa

Oglejmo si naslednjo kodo primera, ki nam bo pokazala, kako se zgornje navodilo izvaja, in bo priča tudi nekaterim navodilom v tečaju.

Začnimo s popravljanjem priključka A, kot smo že omenili.

Za to moramo preusmeriti z banke 0 na banko1, to storimo z vzpostavitvijo registra STATUS na naslovu 03h, bit 5 do 1.

BSF 03h, 5

BSF pomeni nabor bitov F. Po tem navodilu uporabljamo dve številki - 03h, ki je naslov registra STATUS, in številko 5, ki ustreza številu bitov.

Torej, kar pravimo, je 'Nastavite bit 5 v naslovu 03h na 1'.

Zdaj smo v banki 1.

MOVLW 00110b

Binarno vrednost 00110 (črka b pomeni, da je številka v binarni obliki) vnašamo v naš splošni register W. To bi seveda lahko naredil v šestnajstiški obliki, v tem primeru bi bilo naše navodilo:

MOVLW 06h

Ali deluje. MOVLW pomeni 'Premakni dobesedno vrednost v W', kar v angleščini pomeni, da vrednost, ki sledi, vnesemo neposredno v register W.

Zdaj moramo to vrednost vnesti v naš register TRISA za nastavitev vrat:

MOVWF 85h

To navodilo označuje 'Premaknite vsebino W v naslov registra, ki sledi', v tem primeru se naslov nanaša na TRISA.

Naš register TRISA na tej točki nosi številko 00110 ali grafično predstavljen:

Priključite pin RA4 RA3 RA2 RA1 RA1 RA0

Binarno 0 0 1 1 0

Vhod / izhod O O I I O

Zdaj imamo svoje nožice Port A, zato se moramo vrniti v banko 0, da prilagodimo eno od informacij.

BCF 03h, 5

To navodilo dosega obratno BSF. To pomeni 'Bit Clear F'. Par številk, ki ustrezata, sta naslov registra, tukaj je STATUS register, pa tudi bitna slika, v tem primeru bit pet. Kaj natančno smo dokončali trenutno, je definirano v peti točki

STATUS se registrira na 0

Na tej točki smo vrnili v banko 0.
Sledi koda v enem bloku:

BSF 03h, 5 Pojdite na Bank 1
MOVLW 06h Vstavite 00110 v W
MOVWF 85h Premaknite 00110 na TRISA
BCF 03h, 5 Vrnite se v banko 0

V zadnjem navodilu smo vam potrdili način, kako na PIC-u vzpostaviti vhodne ali izhodne priključke IO vrat.

V tem tečaju naj vam pomagam pri pošiljanju podatkov v vrata.

Pošiljanje podatkov v pristanišča

V naslednji vadnici bomo zaključili z utripanjem in vklopom LED, ki je sestavljen iz popolnih podrobnosti programa in enostavnega vezja, tako da boste lahko videli, da PIC izvaja točno tisto, za kar predvidevamo.

Ne poskušajte sestaviti in programirati PIC s spodnjimi rezultati, saj so le ilustracije. Sprva bomo kot izhod vzpostavili vrata A bit 2:

To bi bilo mogoče prepoznati iz prejšnjih navodil. Edina razlika bi lahko bila: Vsak bit nožic na A smo pritrdili kot izhod, tako da smo v tridržavni register dostavili 0h. Zdaj mora vklopiti LED.

To dosežemo tako, da enega od zatičev (tistega, na katerega je povezana LED) postavimo visoko. Povedano drugače, na zatič uporabimo oznako '1'. Natančno tako se izvaja (upoštevajte komentarje za pojasnitev za vsako vrstico):

Zato smo zdaj dosegli, da enkrat enkrat vklopimo in izklopimo LED. Želimo si, da bi se LED dioda nato neprestano vklapljala.

To dosežemo s pridobitvijo programa za vrnitev na začetek. To dosežemo tako, da na začetku našega programa najprej določimo oznako, nato pa program obvestimo, da se vrne nazaj. Oznako določimo povsem neposredno.

Vtipkamo izraz, recimo START, nato vtipkamo kodo:

Kot je razvidno, smo uvodoma že na začetku programa omenili izraz 'Začni'.

Nato smo na samem koncu programa jasno omenili 'pojdi na Start'. Navodilo 'goto' izvaja samo tisto, kar izjavi.

Ta program bi dosledno vklapljal in izklapljal LED, ko vklopimo vezje, in se po navadi izklopi, ko odstranimo elektriko. Mogoče bi morali še enkrat preveriti naš program:

Zagotovo smo komentarje izpustili, vendar lahko še vedno upoštevamo navodila in številke.

To lahko pozneje nekoliko zmede, če poskusite odpraviti težave s programom in med pisanjem kode, ki ste si jo zapomnili za vse naslove.

Čeprav se komentarji dajo še vedno, bi lahko postalo nekoliko neurejeno. To bo zahtevalo poimenovanje številk, kar lahko dosežete z dodatnim navodilom: 'equ' Navodilo 'equ' kaže, da so nekatere stvari lahko enake drugim.

Morda ni navodilo za PIC, temveč za monterja. To navodilo olajša dodelitev imena lokaciji naslova registra ali konstante programskemu izrazu.

Vzpostavili bomo nekaj konstant za naš program in se tudi prepričali, kako enostavno je branje programa.

Od zdaj smo določili konstantne vrednosti, ki jih lahko nadaljujemo z nastavitvijo v naš program. Pred njihovo uporabo je treba določiti konstantne vrednosti.

zato poskrbite, da jih boste vedno postavili na začetek programa. Program bomo znova izključili iz komentarjev, da bomo prejšnje oznake primerjali z najnovejšimi.

Morda boste opazili, da konstante omogočajo nekoliko lažje razumevanje programa, vendar smo še vedno brez komentarjev, brez skrbi, saj še nismo končali.

Naš utripajoči LED-program ima lahko manjšo slabost.
Vsako navodilo potrebuje 1 uro za zaključek. V primeru, da uporabljamo 4MHz kristal, potem vsako navodilo zahteva 1 / 4MHz ali 1uS za dokončanje.

Ker smo uporabili le pet navodil, bi se LED vklopila in nato ugasnila v 5uS. To bi lahko bilo prehitro, da bi ga ljudje opazili, poleg tega pa se zdi, da je LED v celoti prižgana.

Namesto tega bi morali doseči oviro med vklopom in izklopom LED. Teorija inhibicije je, da odštevamo od prejšnje količine, zato, ko pride do ničle, prenehamo s štetjem.

Ničelna vrednost pomeni zaključek zamude in ves čas delamo s svojim postopkom. Zato moramo najprej določiti konstanto, ki jo bomo uporabili kot svoj števec.

Omenimo to konstanto COUNT. Po tem moramo določiti, kako pomembno število naj začne šteti. Zagotovo je največja številka, ki bi jo lahko vključili, 255 ali FFh v šestnajstiki. Kot sem že govoril v prejšnji vadnici, navodilo equ dodeljuje izraz situaciji v registru.

To pomeni, da se ne glede na količino, ki jo dodeli našemu ŠTEVILU, ujema s postavkami registra. V primeru, da poskusimo določiti vrednost FFh, bomo dobili napako, ko bomo sestavili program.

Razlog za to je lokacija FFh, zato do nje ne moremo dostopati. Kako naj torej določimo resnično številko? Vsekakor bo potrebno malo bočnega premišljevanja.

Če morda na primer določimo svojo COUNT za naslov 08h, bi to pomenilo osnovni cilj registra. Privzeto so nedotaknjena območja nastavljena na FFh. Če torej COUNT vodi do 08h, boste pri prvem vklopu naleteli na vrednost FFh. Kljub temu, jaz ti, kako lahko popravimo COUNT na drugo številko ?, vse kar uporabimo je, da najprej 'premaknemo' vrednotenje na ta cilj.

Kot ponazoritev, domnevamo, da smo si želeli, da bi COUNT imel vrednost 85h, ne moremo omeniti COUNT equ 85h, saj je to položaj zunanjega tridržavnega registra za pristanišče A. Natanko dosežemo naslednje: movlw 85h vrednost 85h v registru W movwf 08h

Zdaj ga premaknite v naš 08-urni register. V primeru, da izrazimo COUNT enak 08h, se bo COUNT ujemal z vrednostjo 85h. Nežno, kajne! Zato najprej določimo svojo konstanto: COUNT enak 08h Nato moramo to COUNT zmanjšati za eno, dokler ne postane nič.

Preprosto se zgodi, da obstaja eno navodilo, ki je namenjeno temu, da to dosežemo z uporabo 'goto' in oznake.

Navodilo, ki ga bomo uporabili, je: DECFSZ COUNT, 1 V tem navodilu piše „Zmanjšajte register (tukaj je COUNT) za število, ki sledi vejici. Če dosežemo ničlo, skočite dve točki naprej. ’Najprej najdemo v akciji, preden jo postavimo v svojo smer.

To, kar smo izvedli, je najprej določiti našo konstanto COUNT do 255. Naslednji segment postavi oznako, imenovano LABEL, blizu našega navodila decfsz.

Decfsz COUNT, 1 zmanjša vrednost COUNT za eno in zadrži končni rezultat naravnost v COUNT. Poleg tega preveri, ali ima COUNT vrednost 0.

Če se ne, program v tem primeru sproži preusmeritev na naslednjo vrstico. Zdaj imamo izjavo 'goto', ki nas vrne k našim navodilom decfsz.

V primeru, da je vrednost COUNT enaka, potem navodilo decfsz prikaže, da naš program preskoči 2 mesti naprej in se pošlje tja, kjer smo zahtevali 'Carry on here'.

Ker lahko opazite, smo pripravili program, da pred vnaprej določen čas sedi na enem mestu. To bi lahko poimenovali zanka zamika.

Razumevanje zamikov z zamudo

V primeru, da bomo potrebovali večjo zamudo, lahko nadaljujemo z eno zanko do naslednje. Dodatne zanke, podaljšana zamuda. Predpostavimo vsaj dva, če predpostavimo, da želimo opazovati LED-bliskavico. Te zamike zakasnitve bomo postavili v naš program in dosegli tako, da bomo z uvedbo komentarjev ustvarili pristen program:

Ta program je mogoče sestaviti, po katerem programu PIC. Očitno poskusite tokokrog preveriti, ali res deluje. Sledi diagram vezja, ki ga morate sestaviti takoj, ko programirate PIC.


Dobro opravljeno, lahko bi dejansko sestavili svoj prvi program PIC, pa tudi sestavili vezje za utripanje in vklop LED. Do zdaj bi se lahko, če bi se udeležili teh tečajev, naučili skupno sedem navodil od 35, vendar ste nedvomno do zdaj morda nadzorovali V / I vrata!

Bi poskušali spremeniti zanke zakasnitve, da bi hitreje upodobili LED-bliskavico - kakšna je najmanjša vrednost COUNT, da v bistvu vidite LED-bliskavico? Ali pa boste morda želeli vključiti tretjo ali dodatne zanke za zakasnitev po začetni, da stabilizirate LED. edinstvena konstanta za vsako zamudo.

Potem bi se lahko dejansko ukvarjali z zamiki za zakasnitev, da bi LED-bliskavico upodobili s točno določeno hitrostjo, na primer po sekundi. V naslednjem navodilu poglejmo, kako lahko uporabimo nekaj, kar se imenuje podprogram, da ohranimo program kompakten in osnovni. Podprogram je sestavni del kode ali programa, na katerega se lahko sklicujete, kdaj ga boste potrebovali. Podprogrami se uporabljajo v primerih, ko pogosto opravljate enako funkcijo.

Kaj so podprogrami

Prednosti uporabe podprograma so v tem, da bo verjetno enostavneje spremeniti vrednost enkrat v podprogramu, namesto, recimo, desetkrat v celotnem programu, poleg tega pa močno prispeva k zmanjšanju pomnilnika, ki ga porabi vaš program znotraj PIC. Preverili bomo podprogram:

Sprva moramo podprogramu določiti oznako in v tem primeru smo izbrali ROUTINE. Po tem vtipkamo kodo, ki bi jo radi izvajali kot običajno. Zato smo v našem utripajočem vodilnem programu izbrali zamudo. Nazadnje podprogram zaključimo s pritiskom na navodilo RETURN.

Za začetek podprograma kjer koli v našem programu hitro vtipkamo navodilo CALL in nato oznako podprograma.

To bomo obravnavali nekoliko poglobljeno. Ko pridemo do odseka našega programa, ki imenuje CALL xxx, v katerem je xxx ime naše podprograme, program preskoči kamor koli je nameščena podprogram xxx. Izvajajo se navodila v podprogramu.

Vsakič, ko je izvedeno navodilo RETURN, program preskoči in se vrne v naš glavni program na navodilo, ki sledi našemu navodilu CALL xxx.

Podobno podprogram lahko pokličete večkrat, kot želite, kar pojasnjuje, zakaj uporaba podprogramov zmanjša splošno trajanje našega programa.

Kljub temu morate vedeti nekaj dejavnikov. Sprva, tako kot pri našem glavnem programu, je treba pred njihovo uporabo potrditi vse konstante.

Te je mogoče potrditi v sami podprogrami ali neposredno na začetku glavnega programa. Predlagam vam, da na začetku svojega glavnega programa priznate vse, od takrat se zavedate, da so stvari v enakem položaju. Nato se prepričajte, da glavni program preskoči podprogram.

S tem mislim, da podprogram postavite neposredno ob zaključku vašega primarnega programa, razen če uporabite deklaracijo 'Pojdi', da preskočite, kje je podprogram, program nadaljuje in izvaja podprogram, ne glede na to, ali zahtevati ali drugače.

PIC ne bi ločeval med podprogramom in glavnim programom. Preverili bomo naš utripajoči vodilni program, vendar bomo tokrat uporabili podprogram za zanko zakasnitve. V idealnem primeru boste odkrili, kako manj zapleten je program, in ugotovili boste tudi, kako se podprogram praktično uporablja.

Sčasoma lahko opazite, da smo z uporabo podprograma za našo zakasnilno zanko morda zmanjšali dimenzije programa.

Vsakič, ko si zaželimo zakasnitve, po možnosti, ko LED sveti ali ugasne, v bistvu pokličemo podprogram zakasnitve. Po zaključku podprograma se program vrne na vrstico po naših navodilih 'Pokliči'. Na zgornji sliki vklopimo LED.

Po tem se obrnemo na podprogram. Nato se program vrne nazaj, da lahko izklopimo LED. Podprogram pokličemo še enkrat, le v primeru, da bi se podprogram končal, se program vrne in naslednje navodilo, ki ga prepozna, je 'pojdi na Start'. Za vse, ki vas zanima, je bil naš prvi program dolg 120 bajtov.

Z uporabo podprograma bi lahko zmanjšali velikost programa na 103 bajtov. To se ne bi moglo slišati tako fantastično, vendar glede na dejstvo, da imamo znotraj PIC le 1024 bajtov, koristi vsaka majhna količina.

V naslednjem navodilu si oglejmo branje s pristanišč.

Do zdaj smo sestavljali vrata A, da smo lahko vklopili in izklopili LED. Na tej točki bomo videli, kako bomo brali V / I zatiče na vratih.

Branje vhodno / izhodnih vrat

To je točno zato, da zagotovimo, da lahko povežemo zunanje vezje in vplivamo na morebitne specifične izhode, ki jih ponuja.

Če si želite zapomniti prejšnje tečaje, če želite vzpostaviti vhodno / izhodna vrata, smo morali skočiti z banke 0 na banko 1. Na začetku bomo to dosegli:

Na tej točki smo za vhod določili bit 0 vrat A. zdaj moramo preveriti, ali je čep visok ali nizek. Za to lahko uporabimo samo eno od dveh navodil:

BTFSC in BTFSS.

Navodilo BTFSC pomeni „Naredite bitni test v registru in bit, ki smo ga določili.

Če je 0, v tem primeru izpustimo nadaljnje navodilo “. BTFSS pomeni 'Naredite bitni test v registru in bit, ki ga določimo. V primeru, da je nastavljena na 1, zaobidemo nadaljnje navodilo.

Katero bomo uporabili, je odvisno od tega, kako natančno želimo, da se naš program odzove, medtem ko preučujemo vhodne podatke. Za ponazoritev, če samo čakamo na vnos 1, bomo morda lahko uporabili navodilo BTFSS na naslednji način:

Koda tukaj:

BTFSS PortA, 0 Začnite Nadaljujte tukaj:
:

Program bi se samo preusmeril na 'Carry on here', če je bit 0 na PortA načrtovan na 1.

Trenutno bomo napisali program, ki bi lahko naenkrat pozval LED, če pa je stikalo omejeno, bi LED utripal dvakrat počasneje.

Mogoče je, da se tega programa lotite sami, kljub temu smo seznam nekako vključili.

Lahko poskusite in avtor celotnega programa, da preverite, če ste razumeli načela. Uporabili bomo enakovredno vezje kot prej, z vključenim stikalom RA0 PIC in pozitivno tirnico naše oskrbe.

Tu smo dosegli, da vklopimo LED. Nato ugotovim, ali je stikalo zaprto.

V primeru, da je omejen, se naslednjič povežem z našo podprogramo zakasnitve. To nam zagotavlja enakovredno zamudo kot prej, vendar smo na tej točki dvakrat v stiku z njo.

Enako velja, kadar LED dioda ugasne. Če stikalo ni izklopljeno, imamo predhodno zabeležena obdobja vklopa in izklopa.

Ali sledite tem lekcijam od začetka, boste morda želeli dojeti, da ste trenutno odkrili deset od 35 navodil za PIC 16F84! In vsakega tega se naučimo zgolj z vklopom in izklopom LED.

Do zdaj smo sestavili, da PIC utripa in vklaplja LED.

Nato smo lahko s PIC vključili stikalo, s čimer smo spreminjali hitrost bliskavice.

Učinkovita uporaba pomnilniškega prostora

Edina težava je, da je program precej dolgotrajen in precej neučinkovit pomnilniški prostor. Medtem ko sem prvič vključeval ukaze, se mi je zdelo v redu, vendar bi moral obstajati enostavnejši način izvajanja. Pozitivno je, analizirali bomo, kako smo dobesedno vklapljali in izklapljali LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Najprej smo svoj w register napolnili z 02h, nato pa ga prenesli v naš PortA register za vklop LED. Za izklop smo spakirali w z 00h, nato pa ga prenesli v naš register PortA.

Med vsemi temi rutinami smo bili prisiljeni stopiti v stik s podprogramom, da smo lahko opazovali utripanje LED.

Zato smo morali nekajkrat prenesti dva sklopa informacij (enkrat v register w in nato v PORTA), dvakrat pa poklicati podprogram (enkrat za vklop in enkrat za izklop). Kako bi torej lahko to dosegli z dodatno učinkovitostjo? Zelo preprosto.

Uporabljamo drugačna navodila, znana kot XORF. Navodilo XORF deluje na funkciji Exclusive OR v registru, ki jo določimo s podatki, ki jih posredujemo. Verjamem, da moram pojasniti, kaj na svetu je Exclusive OR, preden nadaljujemo. V primeru, da imamo dva vhoda in en izhod, je vhod lahko le 1, če in dokler se vhoda razlikujeta. Medtem ko so enaki, bo rezultat verjetno 0. Sledi tabela resnic za posameznike, ki se odločijo, da jih bodo preverili:

A B F0 0 00 1 11 0 11 1 0

Na tej točki bomo preverili, kaj se dogaja, če B naredimo tako kot naš prejšnji izhod in preprosto spremenimo vrednost A:

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

Če ohranimo vrednost A enako kot 1 in jo z izhodom izključimo ALI, bi se izhod preklopil. Če tega ne morete opaziti iz tabele resnic, lahko spodaj vidite binarno uporabo:

0 Trenutni izhod
EX-OR z 1 1 novim izhodom
EX-OR z 1 0 novim izhodom

Mogoče lahko ugotovite, da bomo z ekskluzivnim OR-jem izhoda z 1 zdaj preklopili izhod z 0 na 1 na 0.
Zato za vklop in izklop naše LED diode potrebujemo le nekaj stavkov:

MOVLW 02h
XORWF VRATA, 1

Kaj natančno bomo dosegli, je dodajanje našega registra z 02h. V tem primeru smo ekskluzivni ALI določamo to številko, ne glede na to, kaj je na naši PortA. Če je bit 1 1, se bo spremenil v 0. V primeru, da je bit 1 0, se bo spremenil v 1. Preučimo to kodo enkrat ali dvakrat, da prikažemo, kako deluje binarno:

VRATA
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Pravzaprav nam ni treba vsakič naložiti enake vrednosti v svoj register w, zato je to mogoče doseči enkrat na začetku in preprosto preskočiti nazaj na naš preklopni ukaz. Poleg tega ne bi smeli popravljati vrednosti v našem registru PortA. Razlog? Seveda, ker je v primeru vklopa 1, ga lahko enostavno preklopimo. Jaz, drugače 0 pri vklopu, bi ga celo zdaj preklopili.

Zato bi radi videli našo novo oblikovano kodo. Prva predstavlja našo utripajočo LED kodo, druga pa tisto z dodatkom stikala:

Naj si zaželimo, da bi ugotovili, da smo s preprostim navodilom zdaj zmanjšali obseg našega programa. Resnica je, da smo prikazali, za koliko bi lahko zmanjšali svoje programe, v spodnji tabeli smo prikazali oba programa, samo to, kaj sta bila sestavljena, in njune dimenzije:

Razsežnosti programa (bajti)
Utripajoča LED original 120
Dodana utripajoča LED podprogram 103
Utripajoča LED XOR Uporabljena funkcija 91
LED s stikalom Original 132
Uporabljena LED s stikalom XOR Funkcija 124.

Zato nismo odkrili le nekaj novih navodil, poleg tega smo zagotovo tudi zmanjšali velikost našega skriptiranja!

Spodaj bomo analizirali, kako lahko premikate posamezne bite, izvedete določeno preprosto aritmetiko in podatkovne tabele.

Logični menedžerji

V zadnji vadnici sem predstavil operacijo Exclusive OR. Funkcija ExOR je razumljena kot logični operator.

V tej vadnici bom osvetlil dodatne logične operaterje, ki jih promovira PIC. V programih točk ne bo nobenega primera, vendar se bomo naučili enostavnih metod za uporabo operaterjev z uporabo majhnih področij kode.

IN Funkcija AND v bistvu analizira dva bita in poda 1, ali sta enaka, in 0, če sta značilna. Če smo na primer omenili 1 IN 1, je rezultat 1, v primeru, da smo razglasili 1 IN 0, pa bi bila posledica 0.

Ni treba posebej poudarjati, da smo sposobni ovrednotiti tudi besede, kot tudi vse, kar opravi funkcija AND, je pregledovanje obeh izrazov po delih. Spodnji primer prikazuje dve 8-bitni besedi, ki skupaj z izdelkom postaneta ANDed:

11001011
IN 10110011
Enako 10000011

Upam, da se strinjate, rezultat bo preprosto imel 1, kadar koli 2 1 v parih besed z roko v roki. Funkcijo AND lahko na primer uporabimo za preverjanje vrat.

Če preverjamo nekaj I / O zatičev, ki so povezani z vezjem, in bi morali paziti na določeno situacijo, v kateri je le nekaj zatičev visoko, v tem primeru lahko precej preberemo pristanišče, po katerem IN izid s stanjem, za katerega smo preučevali, enak zgornjemu primeru.

PIC nam ponuja dve sestavini za AND.
So ANDLW in ANDWF. ANDLW nam omogoča izvajanje funkcije AND s podrobnostmi o registru W in zneskom, ki ga določimo.

Sintaksa je: ANDLW, pri čemer je točno tisto, do česar gremo, in vsebina W-ja.

Posledica funkcije AND bi bila shranjena neposredno v register W.
ANDWF nam omogoča izvajanje funkcije AND na registru W in drugem registru, na primer PORT. Sintaksa je: ANDWF, d v katerem je register, nad katerim smo navdušeni, npr. PORTA in d prikazuje PIC, kamor bi morali postaviti rezultat. Če je d = 0, se rezultat vpiše v register W, pri d = 1 pa se končni rezultat shrani v register, ki smo ga določili. Spodnja dva dela kode prikazujeta dober primer vsake funkcije AND.

Inicialka preučuje stanje PORTA, v kateri moramo preveriti, ali je vhodnih vrednosti 1100. Rezultat lahko postavimo nazaj v register W

movlw 1100
ANDWF 05h, 0 Druga ilustracija lahko zdaj preveri vsebino registra W:
ANDLW 1100

ALI

Do zdaj smo odkrili eno ali funkcijo OR, natančneje XOR. Ta se razvije v 1, če dva bita nista enaka, ampak sta različna. Najdete lahko drugo funkcijo ALI, imenovano IOR, ki vključuje vključeno ALI. Ta funkcija bo ustvarila 1 v primeru, da je kateri koli bit 1, poleg tega pa, če je vsak bit enak 1. Spodaj je jasna tabela resnic, ki ponazarja to:

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

Kaj so aritmetični operaterji

DODAJ

Ta funkcija izpolni tisto, kar običajno zahteva. Prispeva dve številki! V primeru, da posledica dodajanja obeh številk preseže 8 bitov, bo v tem primeru verjetno nastavljena zastava CARRY. Zastava CARRY je na naslovu 03h bit 0.

Ko je ta bit načrtovan, sta potem številki presegli 8 bitov. Ko je 0, je v tem primeru posledica znotraj 8 bitov. Kot prej nam PIC ponuja dva stila ADD, natančneje ADDLW in ADDWF. Kot ste lahko predvidevali, je to podobno kot zgornja funkcija. ADDLW ponuja vsebino registra W v skladu z določbami. Sintaksa je: ADDLW ADDWF doda vsebino registra W in nekaterih drugih registrov, ki jih določimo.

Sintaksa je: ADDWF, d je kje

SUB

V tem trenutku mislim, da ne morete predvideti, kaj ta funkcija izvaja! Pravzaprav ste to sumili, ta funkcija
odšteje en bit od drugega. Tudi PIC nam ponuja dva okusa: SUBLW in SUBWF. Sintaksa je natančno podobna kot pri funkciji ADD, razen očitno, da namesto ADD vtipkate SUB!

Prirastek Če bi želeli v PIC vključiti 1 na številko, bi lahko popolnoma uporabili funkcijo ADD in uporabili številko ena. ~ Težava pri tem je v tem, da moramo sliko najprej umestiti v register W, nato pa jo uporabiti s kontrolnikom ADDLW 1, da jo povečamo. V primeru, da smo v register želeli vključiti 1, je lahko še slabše. Najprej moramo številko 1 vpisati v register W, nato uporabimo ADDWF, 1. Torej, na primer, da vključimo 1 na lokacijo 0C, recimo, bi morali imeti naslednji del skripta:

movlw 01
addwf 0c, 1

Obstaja lažji način vodenja tega. Izvajamo lahko ukaz INCF. Sintaksa je: INCF, d kjer je, register ali kraj, ki nas zadeva, in d prikazuje PIC, kamor bi morali postaviti rezultat. V primeru d = 0 je rezultat znotraj registra W, v primeru d = 1 pa je posledica nastavljena v registru, ki smo ga določili.

Z uporabo teh posameznih navodil lahko dejansko dobimo petdeset odstotkov kodiranja. V primeru, da bi želeli, da se izid obnovi v registru W, bi v tem primeru uporabili zgornji primerek, morda bi morali vključiti dodaten ukaz za preusmeritev elementov 0C nazaj v register W, nato pa register 0C postavite nazaj na št. ne glede na to, kaj je bilo.

Obstaja ukaz za prirast. Je INCFSZ. Ta ukaz lahko poveča register, ki ga določimo, če pa je register enak 0 po prirastku (ki se bo zgodil, ko bomo vključili od 1 do 127), bo PIC verjetno sprejel nadaljnje navodilo. Spodnji del kode odraža to:

Zanka incfsz 0C
Pojdi na zanko
:
:
Preostanek programa.

V zgornjem delu kode se 0C poveča za 1. Nato imamo v lasti navodilo, ki obvešča PIC, da se vrne na našo oznako z imenom Loop, in 0C znova poveča za 1. To se nadaljuje, dokler 0C ne doseže 127. V tem primeru se bo, ko 0C zvišamo za 1, 0C zdaj ujemal 0. Naše navodilo INCFSZ bi lahko PIC obvestilo, da izpusti nadaljnje navodilo, ki je v tem primeru goto izjava, zato bo PIC nadaljeval s preostalim delom programa.

Zmanjšanje

Doslej smo že razpravljali o funkciji zmanjšanja na prejšnjem treningu, zato je ne bom več pregledoval.

Dopolnitev

Končno navodilo v tej razpravi bi spremenilo vsak posamezen bit v registru, ki ga določimo. Sintaksa je: COMF, d kjer

Razumevanje bitnih operacij

To bi lahko na primer uporabili za hitro zamenjavo nožic vrat z izhoda na vhod itd. Bit-funkcije nam omogočajo oblikovanje enega samega bita znotraj izraza. Omogočajo nam nadaljevanje, nastavljanje in odstranjevanje posameznih bitov v registrih ali številkah, ki jih določimo.

Na koncu tega tečaja bomo razkrili program, zasnovan za ustvarjanje niza zaporednih luči, ki se nadaljujejo naprej in nato v obratni smeri. To smo opazili že prej, ko smo pregledali izključno funkcijo OR, pri čemer smo vrata ekskluzivno OR uredili z izrazom. Zdaj smo opazili nekaj bitnih funkcij, ko smo vzpostavili vrata na PIC, in

Naj ponovim njihovo uporabo tukaj.

BCF

To navodilo bo izbrisalo delček, ki smo ga določili v registru, ki smo ga določili. Sintaksa
je:
BCF,

To smo že uporabili za spremembo s strani 1 na stran 0 tako, da smo v registru STATUS odstranili delček. Z njim lahko prav tako popravimo bit na 0 v katerem koli drugem registru / lokaciji. Na primer, če bi želeli 3. bit v 11001101, shranjenem v odseku 0C, nastaviti na 0, bi lahko
vstavi:

BCF 0C, 03

BSF

To navodilo bi popravilo vsak bit, ki ga določimo na 1 v katerem koli registru, ki ga navedemo. To smo uporabili že prej, da smo nadaljevali od strani 0 do strani 1. Sintaksa je: BSF ,, in se uporablja v popolnoma enaki metodi kot BCF zgoraj.

BTFSCUs do sedaj smo lahko v registru nastavili ali počistili malo. Vendar si predstavljajte, če moramo v bistvu preveriti, ali je bit 1 ali 0 v registru?

Zagotovo je mogoče uporabiti BTFSC. V njem je naveden register bitnega testa F in preskoči, če je jasno. To navodilo bo analiziralo bit, ki smo ga določili v registru. V primeru, da je bit 0, bo ukaz PIC obvestil, naj posreduje naslednje navodilo.

To navodilo lahko uporabimo v primeru, da želimo preveriti zastavico, na primer zastavo za prenos. To nam prihrani, da moramo prebrati register STATUS in iskati posamezne bite, da se naučimo, katere zastave so pritrjene. 29 Če bi na primer želeli preveriti, ali je zastavica Carry nastavljena na 1, potem ko smo dodali 2 številki, bi lahko vnesli naslednje:

BTFSC 03h, 0
nadaljujte sem, če je nastavljeno na 1
ali tukaj, če je nastavljeno na 0

V primeru, da je status bita 1, bi bila v tem primeru izpolnjena navodila po BTFSC. V primeru, da je nastavljena na 0, se v tem primeru nadaljnje navodilo preskoči. Naslednji del eksponatov kode, v katerem bi se lahko uporabil:

Zanka:
:
:
BTFSC 03,0
Pojdi na zanko

V zgornji kodi bo PIC preprosto izstopil iz zanke, če je bit 0 registra STATUS (ali zastava Carry) definiran na 0. V nasprotnem primeru bi bil izveden ukaz goto.

BTFSS

V tem navodilu je naveden register bitnega testa F in preskoči, če je nastavljen. To je lahko primerljivo z navodilom BTFSC, razen da bi PIC izpustil nadaljnje navodilo, če je bit, ki smo ga ocenjevali, nastavljen na 1, namesto na 0.

CLRF

To navodilo bi določilo vse podrobnosti registra na 0. Sintaksa je:

CLRF
To smo že uporabili za nastavitev izhodov vrat na 0 z uporabo CLRF 85h. Poleg tega smo ga uporabili za pritrditev vrat, da vključijo vse nožice za izhod z uporabo CLRF
05h.

CLRW

To je lahko podobno navodilom CLRF, razen za brisanje registra W. Sintaksa je precej preprosta:

CLRW

RLF in RRF

Ta navodila bi v registru prevažala en sam rež levo (RLF) ali desno (RRF) v registru. Če bi na primer potrebovali 00000001 in zaposlili RLF, bi v tem primeru lahko imeli 00000010. Kaj se na tem mestu dogaja, če obstaja 10000000 in je uporabljeno navodilo RLF? Zagotovo bi bil 1 postavljen v nosilno zastavo. V primeru, da smo še enkrat uporabili navodilo RLF, se bo 1 znova pojavil na začetku. Podobno pa se zgodi pri navodilih RRF, vendar nasprotno. Primer v spodnji točki prikazuje to za navodilo RLF, v katerem lahko vidimo 8 bitov registra, kot tudi zastavo za prenos:

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
RLF 1 00000000
RLF 0 00000001

Primer programa

Zdaj bomo videli primer kode, ki jo lahko zberemo in poganjamo. Ustvarila bi svetlobo za zaporedje, ki se začne pri bitku PortA bit 0, ki gre do bita PortB 8 in
nato se vrne.
Priključite LED na vsakega od priključkov. Imeli bomo nekaj delčka
postopke, ki so navedeni v tej vadnici.

TIME EQU 9FH Spremenljivka za zakasnilno zanko.
PORTB EQU 06H Naslov B.
Naslov TRISB EQU 86H Port B Tristate.
PORTA EQU 05H Naslov A Naslov.
Naslov TRISA EQU 85H Port A Tristate.
STATUS EQU 03H Register izberite stran.
COUNT1 EQU 0CH register zank.
COUNT2 EQU 0DH Loop register.

STATUS BSF, 5 Pojdite na 1. stran
MOVLW 00H in nastavite
MOVWF TRISB na vratih A in B
MOVLW 00H za izhod,
MOVWF TRISA se nato vrnite v
STATUS BCF, 5. stran 0.
MOVLW 00H Clear Port A.
MOVWF VRATA

Začetek glavnega programa

RUNMOVLW
01H Nastavite prvi bit MOVWF
PORTB na pristanišču B.CALL
ODLOČITEV Počakajte nekaj časa KLIC
ODLOŽITEV
Premaknite bit na priključku B levo, nato pa zaustavite.RLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRLF
PORTB, 1 S tem se bit premakne v nosilno zastavo
Zdaj se pomaknite do priključka A in premaknite bit levo.RLF
PORTA, 1 Ta premakne bit z ničelne zastavice v PortACALL
DELAYCALL DELAYRLF
VRATA, 1 KLIC
POČASNI KLIC
DELAYRLF
VRATA, 1 KLIC
POČASNI KLIC
DELAYRLF
VRATA, 1 KLIC
POČASNI KLIC
ODLOŽITEV
Premaknite bit nazaj na vrata ARRF
VRATA, 1 KLIC
POČASNI KLIC
DELAYRRF
VRATA, 1 KLIC
POČASNI KLIC
DELAYRRF
VRATA, 1 KLIC
POČASNI KLIC
DELAYRRF
PORTA, 1 S tem se bit premakne v ničelno zastavico. Zdaj premaknite bit
nazaj na pristanišču BRRF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRRF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRRF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRRF
PORTB, 1 KLIC
DELAYCALL DELAYRRF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRRF
PORTB, 1 KLIC
POČASNI KLIC
DELAYRRF
PORTB, 1 KLIC
POČASNI KLIC
ODLOŽENJE Zdaj smo spet tam, kjer smo začeli, GOTO
TEČI gremo še enkrat.

V kompletu za usposabljanje obstaja odlična možnost, ki vam omogoča uporabo podatkovne tabele.

Podatkovna tabela je le seznam podatkovnih narekovajev, v katerem je vse pregledano na podlagi nekaj premislekov.
Na primer, lahko imate vezje, ki uporablja PIC, ki šteje, koliko primerov vhodni zatič postane visok v 1 sekundi. Po tem lahko številko prikažete na 7-segmentnem zaslonu.

Takoj, ko se sproži čas, začne PIC šteti, kolikokrat se pin pripelje visoko. Po eni sekundi obišče mizo in poišče podatke, na zaslonu mora prikazati številko, ki simbolizira število situacij, ki jih je zatič postavil visoko. To je lahko koristno, saj ne moremo določiti, kakšna bi bila številka, dokler PIC ne doseže svoje ocene.

Z uporabo tabele lahko omogočimo, da PIC določi, katero sliko bo upodobil. Na tej točki, preden vam še naprej pokažem, kako deluje tabela podatkov, vam bom morda moral povedati, da PIC med delovanjem programa ohranja pot kje se nahaja v programu, v katerem je.

Omogoča tistim, ki so izvedli določeno programiranje v jeziku BASIC. V nasprotnem primeru ne bodite zaskrbljeni, morda boste želeli še naprej spoznavati teorijo. Predvidevamo, da obstaja osnovni program, podoben spodnjemu:

10 LET K = 0
11 K = K + 1
12 ČE K> 10, POJDI 20 DRUGAČ GOTI 11
20 TISK K
21 KONEC

Program se začne pri 10. vrstici. Takoj, ko je K predviden do 0, se premakne naprej do 11. vrstice. Ko smo vključili 1 do K, nato nadaljujemo do 12. vrstice.

Na tej točki smo morda radovedni, če je K višji od 10. V primeru, da je, se nato odpravimo v 20. vrstico ali pa se vrnemo v 11. vrstico.

Vrstica 20 dokumentira K, vrstica 21 pa zaključuje program. BASIC uporablja statistične podatke vrstic, ki programerju pomagajo voditi evidenco o težavah, saj oznake niso dovoljene. PIC uporablja etikete za pobeg med cilji - ali lahko res?

Oznake uporabljamo za zagotovitev, da se zavedamo, kje so težave, pa tudi za to, da lahko na preprost način obvestimo PIC, kje naj iščemo.

Prav to, kar se zgodi, je, da PIC izkoristi števec notranje črte, imenovan programski števec. Pot programskega števca (okrajšano do osebnega računalnika) na cilju pomnilnika, kjer je trenutno navodilo.

Kadar koli obvestimo PIC, da obišče izbrano nalepko, ta razume mesto na pomnilniku in zato povečuje računalnik, dokler ne vidi tega cilja. To je popolnoma enak način, kot smo preverili zgoraj navedeni program BASIC. Spodaj je del kode s pomnilniškimi prostori ali elementi računalnika, poleg vsakega navodila:

Navodila za osebni računalnik0000 movlw 03
0001 movwf 0C
0002 Loop decfsc 0C
0003 goto Loop
0004 konec

V zgornji predstavitvi smo računalnik pritrdili na 0000. Na tem mestu imamo navodilo movlw 03. Ko PIC implementira te podatke, prirašča računalnik, tako da je naslednje navodilo optično prebrano. Na tej točki PIC gleda movwf 0C. Računalnik se še enkrat poveča.

Zdaj PIC preučuje decfsc 0C. V primeru, da podrobnosti 0C niso 0, se v tem primeru računalnik poveča za 1, pa tudi naslednje navodilo goto Loop obvesti računalnik, naj se vrne v položaj 0003, kjer je omenjena zanka. Če so podrobnosti 0C 0, potem računalniku svetujemo, da poveča za 2, preprosto izpustite nadaljnje navodilo.

Razumevanje podatkovnih tabel

S tem se računalnik postavi na položaj 0004, kjer se program konča. Cilje določi zbiralec in na splošno nas ne bi smelo skrbeti, kaj PC dosega. Dokler ne bomo ugotovili, da ga moramo pod nadzorom, tako kot med uporabo podatkovnih tabel. Najprimernejši način za opis delovanja tabele podatkov je začeti s ponazoritvijo.

PC enak 02
movlw 03
klicna miza
:
tabela addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
vrnitev

Začetno navodilo je dodelitev nalepke PC naslovu programskega števca (02h). Kmalu bomo vnesli vrednost 03h v register w. Po tem komuniciramo z mizo. Prva vrstica v tabeli podprograma povečuje podrobnosti registra W (03h) na števec programov.

To sproži, da se programski števec zviša za 3 ali drugače, stimulira programski števec, da nadaljuje 3 vrstice. Medtem ko števec prispe 3 vrstice navzdol, PIC prepozna ukaz retlw. Ta ukaz pošlje vrednost, ki ji sledi, v register W, nato pa se vrne iz podprograma. RETLW v bistvu pomeni vrnitev, dobesedno do W.

Glejte, za besedo Vrni sem postavil vejico. Ker smo v podprogramu, potrebujemo navodilo za vrnitev na njegovo površino. Zato RET v navodilih. Ko je navodilo RETLW številka, je to točno tisto, kar je vpisano v register W.

V tem primeru gre za sliko 3. V register W bi lahko označili poljubno količino, dokler bomo to sliko kombinirali s števcem programov v podprogramu tabele, bomo odkrili navodilo za ponovni vnos. Na zgornji sliki to pomeni, da imamo lahko katero koli število od 1 do 7. V primeru, da nadaljujemo mimo podprograma, bomo morda lahko zaključili z izvajanjem dodatnega odseka programa. Iz tega razloga je običajno pametno premakniti podatkovno tabelo natanko proti koncu programa PIC, zato bomo, če bomo v tem primeru prehiteli, vseeno prišli do zaključka programa.

Tema prekinitev bo morda najdaljša in najtežja.

Ne najdete nobenega zapletenega načina podrobnega opisovanja prekinitev, vendar boste z malo sreče proti koncu tega dela morda lahko uporabili prekinitve v svojih programih.
Oddelek smo ločili v 2 stopnji. To pomeni, da lahko temo ločite na odseke, prav tako pa vam zagotovite priročen delček za lažje razumevanje.

Kaj pravzaprav je prekinitev? Kot je izraz izraz, je prekinitev zagotovo tehnika ali signal, ki mikroprocesorju / mikrokrmilniku preprečuje, da bi se kaj drugega zgodilo.

Dovolite mi, da vam dam dnevno ilustracijo. Mislite, da se sproščate v svojem domu in se pogovarjate z drugo osebo. Kar naenkrat se oglasi telefon.

Nehate govoriti in primite telefon za pogovor s klicateljem. Ko vzpostavite telefonsko interakcijo, se odločite, da se boste še preden ste zazvonili, vrnili k pogovoru s posameznikom. Med klepetom z nekom je mogoče upoštevati glavno rutino, zvonjenje telefona povzroči motnje v pogovoru, prekinitev rutine pa je način govora po telefonu.

Medtem ko se telefonska razprava konča, se vrnete k svoji osnovni rutini klepeta. Na tej sliki je natančno prikazano, kako prekinete procesor, da začne ukrepati.

Primarni program deluje in izvaja določeno funkcijo v vezju, vendar se ob prekinitvi primarni program ustavi, medtem ko se izvaja drugačna rutina. rutina se konča, procesor se tako kot prej vrne na primarno rutino.

Razumevanje prekinitev

PIC ima 4 vire prekinitve. Lahko bi jih razdelili na nekaj skupin. Dva sta vira prekinitev, ki jih je mogoče navzven uporabiti za PIC, medtem ko sta druga dva notranja procesa. Tu naj pojasnim dve zunanji vrsti. Druga dva bomo opisali v različnih vadnicah, ko bomo prišli do časovnikov in shranjevanja podatkov.

Če si ogledate pin-out PIC-a, boste opazili, da je pin 6 RB0 / INT. Na tej točki je RB0 očitno vrata B bit 0. INT predstavlja, da bi ga lahko tudi konfigurirali kot zunanji prekinitveni zatič. Poleg tega se za prekinitve lahko uporabljajo tudi zatiči vhoda 4 do 7 (zatiči 10 do 13). Preden lahko uporabimo zatiče INT ali druge priključke B, moramo opraviti dve nalogi. Najprej moramo obvestiti PIC, da bomo uporabili prekinitve.

Nato moramo določiti, kateri pin B bomo uporabljali kot prekinitev in ne kot I / O pin. V PIC lahko najdete register, imenovan INTCON, in je na naslovu 0Bh. V tem registru boste odkrili 8 bitov, ki jih je mogoče omogočiti ali onemogočiti. Bit 7 INTCON-a je znan kot GIE. To je Global Interrngupt Enable. Če to določite na 1, PIC obveščate, da bomo uporabili prekinitev.

Bit 4 INTCON-a je znan kot INTE, INTerrupt Enable. Če ta bit postavite na 1, PIC-u sporoči, da bo RB0 prekinitveni zatič. Konfiguriranje bita 3, ki se imenuje RBIE, obvesti PIc, da bomo uporabili bite priključka B od 4 do 7. Na tej točki PIC razume, kdaj je ta zatič lahko visok ali nizek, mora ustaviti svoje delovanje in nadaljevati s prekinitvijo. rutina. Na tej točki moramo obvestiti PIC, ali bo prekinitev verjetno na naraščajočem robu (0V do + 5V) ali spuščenem robu (+ 5V do 0V) pretvorbe signala ali ne.

Preprosto povedano, ali želimo, da se PIC prekine vsakič, ko se signal premakne z nizke na visoko ali z visoke na nizko. S prestopništvom lahko ugotovimo, da je to postavljeno na naraščajoči rob.

'Sprožitev' roba je predvidena v dodatnem registru, imenovanem OPTION register, na naslovu 81h. Bit, nad katerim smo navdušeni, je bit 6, ki ga pogosto imenujemo INTEDG.

Če to nastavite na 1, sproži PIC motnje na montažnem robu (privzeto stanje), nastavitev na 0 pa spodbudi PIC, da moti na drsnem robu. Če želite, da se PIC aktivira na naraščajočem robu, vam tega bitka zagotovo ni treba storiti.

Na tej točki je na žalost register možnosti v banki 1, kar pomeni, da z veseljem spreminjamo iz banke 0 v banko 1, nastavimo bit v registru možnosti, potem pa se vrnemo v banko 0. Ključno tukaj je izpolniti vsak bit banke 1 se registrira v enem stavku, na primer pri določanju pristaniških zatičev, po tem pa se vrne v banko 0, če ste končali.

V redu, zato smo obvestili PIC, kateri pin bo verjetno prekinitev in kje se bo sprožil rob, kaj se dogaja v programu in PIC vsakič, ko pride do prekinitve? Zgodi se nekaj stvari. Najprej je na sporedu ‘zastava’.

To notranjemu procesorju PIC sporoči, da je prišlo do prekinitve. Nato števec programov (o katerem sem govoril v prejšnji vadnici) nasveti na določen naslov v PIC-u. Hitro preverimo vse to posamično. Oznaka prekinitve V našem registru INTCON je bit 1 oznaka prekinitve, imenovana INTF. Takrat, kadar koli pride do kakršne koli prekinitve, bo ta zastavica verjetno pritrjena na 1.

Kadar ni prekinitve, se zastavica postavi na 0. Tako kot skoraj vse dosežke. Na tej točki morda premišljujete, v čem je smisel? Seveda, čeprav je ta zastavica predvidena na 1, PIC ne more in se ne bo odzval na novo prekinitev. Zato izrazimo, da povzročimo prekinitev. Oznaka bo verjetno pritrjena na 1, PIC pa bo morda šel v našo rutino za obdelavo prekinitve.

Ko ta zastavica ni bila pritrjena na 1 in je PIC smel še naprej odgovarjati na prekinitev, bi lahko nato z neprekinjenim pulziranjem zatiča PIC vrnil na začetek naše prekinitvene rutine in je nikakor ni dopolnil. Če se vrnem na mojo ponazoritev telefona, je to podobno dviganju telefona in takoj, ko nadaljujemo z razpravo, začne spet zvoniti, ker želi druga oseba govoriti z vami.

Priporočljivo je, da opravite en dialog, nato pa znova primite telefon in se pogovorite z naslednjim. S to zastavico lahko najdete majhen problem. Čeprav PIC to zastavico hitro nastavi na 1, je ne nastavi znova 0! To dejavnost mora izvajati programer - torej vi. To je mogoče brez truda doseči, saj sem prepričan, to pa je treba doseči, ko PIC izvede prekinitveno rutino.

Lokacija pomnilnika Kadar koli najprej vključite PIC ali, če pride do ponastavitve, števec programov nasveti, da naslovi 0000h, kar bi lahko takoj na začetku programskega pomnilnika. Toda v primeru prekinitve bo programski števec navedel naslov 0004h.

Zato moramo med sestavljanjem programa, ki bo imel prekinitve, najprej obvestiti PIC, da preskoči naslov 0004h in ohraniti rutino prekinitev, ki se začne na naslovu 0004h ločeno od preostalega dela programa.

Za izvedbo je to lahko brez težav. Sprva začnemo program z ukazom, znanim kot ORG. Ta ukaz označuje izvor ali začetek. Držimo se ga z naslovom. Ker se PIC začne na naslovu 0000h, vtipkamo ORG 0000h. Po tem moramo obiti naslov 0004h. To dosežemo z navodilom GOTO, skupaj z nalepko, ki nasveti našemu primarnemu programu.

Po tem se tega ukaza GOTO držimo še z enim ORG, ta trenutek z naslovom 0004h. Po tem ukazu vstavimo rutino prekinitev. V tem trenutku bomo morda lahko vnesli našo prekinitveno rutino naravnost po drugem ukazu ORG ali pa bomo lahko postavili stavek GOTO, ki kaže na prekinitveno rutino.

Resnično je povezano z možnostjo z vaše strani. Če želimo PIC, ki ga ponuja, ob zaključku rutine prekinitev obvestiti, moramo ukaz RTFIE postaviti proti koncu rutine. Ta ukaz pomeni vrnitev iz prekinitvene rutine. Medtem ko PIC to opazi, programski števec kaže na končni položaj PIC, preden je prišlo do prekinitve. Spodaj smo določili kratek odsek kode, ki prikazuje zgoraj:

Obstaja nekaj stvari, o katerih morate biti obveščeni pri uporabi prekinitev. Začetno je običajno, da če v svojem primarnem programu in prekinitveni rutini uporabljate enak register, upoštevajte, da se bodo podatki registra, ko bo prekinitev, najverjetneje spremenili.

Na primer, uporabimo register w za posredovanje podatkov v primarni program Port A, zato lahko v rutini prekinitev dodatno uporabite register w za preusmeritev podatkov z enega cilja na drugega.

Če niste previdni, bo register w vseboval zadnjo vrednost, ki jo je prejel, medtem ko je bila v rutini prekinitve, zato bodo po vrnitvi iz prekinitve te informacije dostavljene v pristanišče A in ne vrednosti, ki ste jo imeli prej prišlo je do prekinitve.

Način tega je, da za trenutek shranite podrobnosti registra w, preden ga znova uporabite v prekinitveni rutini. Drugo je dejstvo, da lahko najdete zamudo med tem, ko pride do ene prekinitve, in kdaj lahko nastopi naslednja. Medtem ko razumete, ima PIC zunanjo uro, ki bi lahko bila kristal ali pa bi lahko bila kombinacija uporov in kondenzatorjev.

Ne glede na frekvenco te ure, jo PIC deli s 4, nato pa to izkoristi za notranji čas. Na primer, če imate na vaš PIC kristal 4MHz, bo ta izvedel navodila na 1MHz. Ta notranji čas je znan kot cikel navodil. Na tem mestu podatkovni list trdi (nedvomno v manjšem tisku), da morate med prekinitvami omogočiti 3 do 4 kroge navodil.

Jaz bi omogočil 4 kroge. Razlog za zamudo je, da PIC zahteva čas, da preskoči na naslov prekinitve, zastavico in se vrne stran od rutine prekinitve. Zato imejte to v mislih, če delate z nadomestnim vezjem, da aktivirate prekinitev za PIC.

Na tej točki je točka dejstvo, da če za prekinitev uporabite bite 4 do 7 v pristanišču B. Na vratih B ne morete izbrati določenih nožic, ki bi delovale kot prekinitev.

Torej, če dovolite te nožice, jih je verjetno mogoče dobiti. Zato na primer ne morete imeti preprosto bitov 4 in 5 - bitov 6 in 7 bosta verjetno hkrati opolnomočena. Kaj točno je namen pridobivanja štirih bitov, ki predstavljajo prekinitev? Zagotovo imate morda vezje, priključeno na PIC, v primeru, da gre kdo od štirih vrstic visoko, v tem primeru je to morda težava, na katero morate PIC takoj vplivati.

Ilustracija tega bi lahko bil domači varnostni alarm, pri katerem so štirje senzorji povezani z zatiči vhoda 4 do 7. Vsak poseben senzor lahko zahteva, da PIC sproži alarm, rutina signalizacije alarma pa je rutina prekinitve. To prihrani stalno preverjanje pristanišč in PIC dovoli, da nadaljuje z različnimi zadevami. V naslednji vadnici bomo sestavili program za upravljanje prekinitve.

V zadnji vadnici smo obravnavali veliko osnov, zato menim, da je napočil čas, da smo sestavili svoj prvi program.

Program, ki ga bomo napisali, bo prešteval število primerov, ko vklopimo stikalo, in nato prikazal število.

Program bi štel od 0 do 9, vidno na 4 LED v binarni obliki, skupaj z vhodom ali prekinitvijo pa bo verjetno na RB0.

Najpomembnejša stvar, ki jo moramo izvesti, je obvestiti PIC, da preskoči naslov, na katerega kaže programski števec, kadarkoli pride do prekinitve.

Opazili boste, da uporabljamo edinstveno metodo prikazovanja šestnajstiških števil. Preden sem se zgodil, uporabim F9h, v katerem je h označil šestnajstiško. Lahko bi to zapisali kot 0xF9, kar je struktura, ki jo bomo uporabljali odslej.

Zdaj moramo PIC-u povedati, da bomo uporabili prekinitve in kot prekinitveni zatič uporabljamo pin 6 RB0:

bsf INTCON, 7GIE - Globalna prekinitev (1 = omogoči)
bsf INTCON, 4INTE - RB0 prekinitev omogočena (1 = omogoči)
Za vsak slučaj bom očistil zastavico prekinitve (nikoli ne zaupam ničesar!)
bcf INTCON, 1INTF - Počisti bit zastavice za vsak slučaj

Trenutno moramo vzpostaviti naša 2 pristanišči. Upoštevajte, da ker zdaj uporabljamo RB0 kot prekinitveni zatič, je treba to določiti kot vhod:

Uporabili bomo spremenljivko z imenom COUNT za shranjevanje števila števcev stikal. Lahko bi preprosto povečali vrednost na vratih A, vendar boste videli, zakaj uporabljam spremenljivko, ko pišemo svojo prekinitveno rutino.

Zato je sestavljen naš glavni program in na tej točki moramo obvestiti PIC, kako naprej, kadar pride do prekinitve. V tem primeru bo naša prekinitev verjetno stikalo. Samo tisto, kar bi radi, je, da PIC ustreza nastavljivemu COUNT vsakič, ko je stikalo omejeno.

Kljub temu želimo samo prikazati, kolikokrat se stikalo izklopi z 0 na 9. Zgoraj sem izjavil, da bi lahko vrednost Port na Port A preprosto povečali vsakič, ko pride do prekinitve. Vendar ima vrata A 5 bitov, v primeru, da bomo vrata le povečali, bomo imeli največ 31. Obstaja nekaj razlag, zakaj sem se odločil, da ne premaknem do 31.

Sprva bomo uporabili 7-segmentni zaslon, ki bi lahko šel največ od 0 do 15 (od 0 do F v šestnajstiški). Nato vam želim pokazati še nekaj aritmetičnih ukazov, na katere ste naleteli v zadnjih nekaj lekcijah.

Zato bomo nadaljevali z našo prekinitveno rutino. Trenutno je prvo, kar moramo doseči, na kratko shraniti podrobnosti našega registra w, saj to uporabljamo za preusmeritev vsebine COUNT v PORTA. V primeru, da ga ne shranimo, bomo v tem primeru zaradi naše aritmetike lahko dostavili povsem drugačno številko. Zato najprej naredimo to:

V tem trenutku razumemo, ali je vrednost COUNT 9 ali več. Kar moramo zdaj doseči, je, če je COUNT več kot 9, ga postavimo nazaj na 0 ali pa se vrnemo v glavni program, da zagotovimo, da ga lahko dostavimo v vrata A. Ukaz BTFSS bi, kot veste,
navodilo v primeru, da je zastavica za prenos predvidena, tj. COUNT = 10:

Edino, kar moramo zdaj storiti, je skupno vnesti in določiti vrednosti za naše konstante, ki jih lahko izvedemo že na začetku našega programa.

Vsakič, ko vklopite stikalo, bodo LED diode v binarnem načinu odštevale od 0000 do 1010, nato pa nazaj na 0000.

Naslednja slika prikazuje vezje, združljivo z zgoraj razloženo kodo. Zanimivo boste ugotovili, da je bil v zasnovo vključen časovni kondenzator. To je lepa majhna poteza, s katero se lahko svobodno izognete vključitvi kondenzatorja, če ga v tem času nimate s seboj.

Tu se kapacitivnost prikaže preko zapuščene kapacitivnosti preko oscilatorja in ozemljitve.
Seveda se morda ne zdi zelo inteligenten način, da bi se izognili kondenzatorju, praktično, ker se lahko zaostala vrednost razlikuje glede na določene pogoje.

Drug odsek, ki ga lahko opazimo v vezju, je omrežje za odkrivanje prek stikala. To preprečuje motnje med mehanskim preklapljanjem in preprečuje, da bi se PIC zmedel, če je bilo preklapljanje eno ali večkratno.




Prejšnja: Programabilna dvosmerna veriga časovnika motorja Naprej: Kako delujejo vezja Buck-Boost