PIC-õpetus - registritest katkestusteni

Proovige Meie Instrumenti Probleemide Kõrvaldamiseks





Enne PIC-i programmeerimise üksikasjadesse jõudmist on kõigepealt oluline õppida paar head programmeerimismeetodit.

Registrite mõistmine

Alustuseks oletame, et sisestate (semikooloni) programmi mis tahes punkti, kompilaator ignoreerib kõiki selle semikooloni järel ilmnevaid funktsioone, kuni loomulikult tõuseb kelk tagasi asendisse.



Ülaltoodud funktsioon võimaldab meil lisada kommentaare või märkusi nii, et neist ei saaks programmi osa, kuid see hõlbustab meil programmi tuvastamist kõrval olevate kommentaaride abil. Kommentaaride esitamine on soovitatav IC-de programmeerimisel.

Järgmine oluline asi kursusel on määrata erinevatele konstantidele nimed (õpiksite neid hiljem üksikasjalikumalt õppima). See muudab ka hõlpsamaks aru saamise, millele kirjutatakse, või seotud väärtuste kohta, selle asemel et segi ajada lisatud numbritega.



Eeltoodu peab toimuma kohe tuvastamiseks tegelike nimede kujul, näiteks COUNT. Oluline on märkida, et siin kasutatakse kõiki suurtähti selle eristamiseks ja et see näitab ka pidevat väärtust.


Nagu näeme, tehakse ülaltoodud semikoolonitest valmistatud kasti kujul, see muudab selle lihtsalt puhtamaks. Lisaks proovige dokumenteerida ka programm paberil, see tava aitab asjadest järk-järgult aru saada.

2. Registrid.

PIC-i register on valdkond, mis aktsepteerib kirjalikke üksikasju ja võimaldab sellest ka lugeda. Võite seda võrrelda paberilehega, kus saate sisu üle visualiseerida ja lisada, kirjutades selle üle.

Alloleval joonisel on kujutatud tüüpilist registrifailide kaarti, mis on varjatud PIC16F84-s. Vorming pole midagi, mida PIC-is tegelikult seatakse, see lihtsalt näitab, kuidas bitid võivad kiibis paikneda, ja mõistaks mõnda kaasatud käsku.

Näete, et see jaguneb põhimõtteliselt pangaks 0 ja pangaks 1. Pank 1 vastutab PIC-i tegeliku töö kontrollimise eest, näiteks saab ta PIC-i televiisorile, millised pordis A olevad bitid on sisenditeks ja millised väljunditeks.

2. pank on mõeldud lihtsalt teabega manipuleerimiseks.

Mõistame seda järgmise näite abil:

Oletame, et soovime PortA kõrgel määrata ühe biti. Selleks peame kõigepealt minema pangale 1, kus määratakse väljundina pordis A määratud bit või pin. Pärast seda pöördume tagasi panga 0 juurde ja edastame loogika 1 (bitt 1) ​​selle konkreetse tihvti juurde.

Kõige tavalisemad registrid, mida me 1. pangas kasutada soovime, on STATUS, TRISA ja TRISB.

STATUS aitab meil naasta panka 0, TRISA võimaldab meil valida, millised pordis A olevad tihvtid on väljundid ja millised võivad olla sisendid, samas kui TRISB hõlbustab pordis B väljundi ja sisendnõela vahel valimist. Panga 0 SELECT register võimaldab kasutajal panga 1 poole pöördumiseks.

Võtame kogu kontseptsiooni kokku järgmise kirjeldusega:

STATUS:

Pangalt 0 pangale 1 vahetamiseks käsime registrit STATUS. Seda saab rakendada, seades registri STATUS biti nr 5 väärtuseks 1. Pangale 0 tagasi naasmiseks määrame STATUS-registri biti 5 väärtusele 0. STATUS-register asub aadressil 03h, siin h tähistab numbrit võib olla kuueteistkümnendsüsteemis.

TRISA ja TRISB:

Need asuvad vastavalt aadressidel 85h ja 86h. Tihvti programmeerimiseks väljundina või sisendina edastame registri konkreetsele bitile lihtsalt nulli või ühe. Nüüd võib seda teha kahel viisil, binaarse või Hexi kaudu. Kui parameetrit ei saa teisendada, võib ta väärtuste rakendamiseks kasutada teaduslikku kalkulaatorit.

Nüüd on meil sadamas A 5 tihvti, mis vastab 5 tihvtile. Kui kavatseme ühe tihvti sisendina fikseerida, edastame konkreetse biti tähe '1'.

Juhul, kui tahtsime väljunditeks määrata ühe tihvti, määraksime konkreetse tihvti väärtuseks „0“. Need bitid vastavad täpselt bittidele vastavatele bittidele või täpsemalt on bitt 0 RA0, bitt 1 oleks RA1, bitt 2 = RA2 ja nii edasi. Saame sellest aru nii:

Oletame, et soovite parandada väljunditena RA0, RA3 ja RA4 ning RA1 / RA2 kui i / ps, seda saates 00110 (06h). Kontrollige, kas bitt 0 on paremal, nagu siin näidatud:

Port A pin RA4 RA3 RA2 RA1 RA0

Biti number 4 3 2 1 0

Binaarne 0 0 1 1 0

Sama kehtib ka TRISBi kohta.

PORTA ja PORTB

Ühe väljundnõela kõrgest eemaldamiseks pakume meie PORTA või PORTB registris lihtsalt vastava bitti väärtusega „1”. Identset protseduuri võib järgida ka TRISA ja TRISB registrite puhul. Enne kui me läheme oma esimese näite kodeerimisele, mõistame lihtsalt mitmete registrite kupee, nimelt w ja f.

W ja F

W-register on tavaline register, mis võimaldab teil omistada mis tahes väärtuse. Niipea kui määrate W-le suuruse, võite selle jätkata, lisades selle teisele väärtusele või lihtsalt teisaldada. Kui määratakse teine ​​väärtus, kirjutatakse üksikasjad lihtsalt W-le üle.

F-register edastab oma kirjalikud asjad registrile. Me nõuaksime, et see F register määraks väärtuse registrile, võib olla üle STATUS või TRISA registrite, kuna need ei võimalda meil väärtusi neile otse panna. Näidisprogramm

Uurime järgmist näidekoodi, mis näitab meile, kuidas ülaltoodud juhiseid rakendatakse, ja näeme ka mõningaid kursuse juhiseid.

Alustame pordi A parandamisest, nagu eespool arutletud.

Selleks peame liikuma pangalt 0 pangale 1, selleks tehakse STATUS-register, mis asub aadressil 03h, bitid 5 kuni 1.

BSF 03h, 5

BSF tähendab bitikomplekti F. Selle juhise järel kasutame kahte numbrit - 03h, mis on registri aadress STATUS, ja numbrit 5, mis vastab biti numbrile.

Niisiis, mida me ütleme, on 'Määra bitt 5 aadressil 03h väärtusele 1'.

Oleme nüüd 1. pangas.

MOVLW 00110b

Paneme kahendväärtuse 00110 (täht b tähendab, et number on binaarne) oma üldotstarbelisse registrisse W. Ma oleksin muidugi võinud seda teha ka kuusnurgaga, sellisel juhul oleks meie juhis järgmine:

LIIKUMINE 06h

Mõlemad toimivad. MOVLW tähendab ‘Move Literal Value Into W’, mis inglise keeles tähendab järgneva väärtuse panemist otse W-registrisse.

Nüüd peame pordi seadistamiseks selle väärtuse lisama oma TRISA registrisse:

MOVWF 85h

See juhis näitab 'Teisalda W sisu järgmisesse registriaadressisse', antud juhul viitab aadress TRISA-le.

Meie TRISA register kannab joonist 00110 või graafiliselt:

Port A pin RA4 RA3 RA2 RA1 RA0

Binaarne 0 0 1 1 0

Sisend / väljund O O I I O

Nii et nüüd on meil oma A-pordi nööpnõelad, peame naasma panka 0, et ühte teavet kohandada.

BCF 03h, 5

Selle juhisega saavutatakse BSF-i tagurpidi. See tähendab 'Bit Clear F'. Numbripaar, mis vastab, on registri aadress, siin on register STATUS, samuti bitiarv, antud juhul bitt viis. See, mis meil täpselt praegu valmis on, on meie jaoks määratletud viie bitiga

STATUS registreeru 0-ni

Oleme sel hetkel naasnud pangas 0.
Järgmine on kood ühes plokis:

BSF 03h, 5 Minge panga 1 juurde
MOVLW 06h Pange 00110 W-sse
MOVWF 85h Liiguta 00110 TRISA peale
BCF 03h, 5 Tule tagasi panka 0

Viimase juhendi raames kinnitasime teile viisi, kuidas PIC-is IO-pordi tihvtid luua, et need oleks võimalik sisendiks või väljundiks.

Selle kursuse kaudu lubage mul aidata teil andmeid pordidesse saata.

Andmete saatmine sadamatesse

Järgmises õpetuses lõpetame LED-i sisselülitamise ja kustutamise, mis koosneb täielikust programmi üksikasjadest ja otsesest skeemist, et näeksite PIC-i täitmist täpselt nii, nagu me seda eeldame.

Ärge proovige oma PIC-i kokku panna ja programmeerida allolevate tulemustega, kuna need on ainult illustratiivsed. Esialgu loome väljundiks pordi A bit 2:

Selle võiks eelmise juhendamise põhjal ära tunda. Ainus erinevus võiks olla. Oleme fikseerinud väljundina kõik A-nööpnõelad, toimetades 0-seisundi kolmeseisundi registrisse. Mida ta nüüd tegema peab, on LED sisse lülitada.

Me saavutame selle, planeerides ühe tihvti (selle, mille LED on ühendatud) kõrge. Teisiti öeldes rakendame tihvtile tähte ‘1’. Täpselt nii toimitakse (vaadake kommentaare, et iga rea ​​kohta selgitust saada):

Seetõttu oleme nüüd saavutanud LED-i ühe korra sisse ja välja lülitamise. Soovime, et LED lülituks seejärel pidevalt välja.

Selle saavutame programmi hankimisega, et naasta algusesse. Selle saavutame, luues algselt sildi juba oma programmi alguses, teavitades seejärel programmi sinna tagasi minema. Täpsustame sildi üsna otse.

Sisestame termini, näiteks öelge START, sisestage järgmine kood:

Nagu on näidatud, mainisime väljendit ‘Start’ algselt kohe programmi alguses.

Järgmisena mainisime programmi kõige lõpus selgelt ‘goto Start’. Goto-käsk täidab just seda, mida ta deklareerib.

See programm lülitaks LED-i järjekindlalt sisse ja välja alati, kui lülitame vooluahela sisse, lülitudes välja, kui eemaldame elektri. Võib juhtuda, et peaksime oma programmi uuesti kontrollima:

Kindlasti oleme kommentaarid välja jätnud, kuid siiski võime juhiseid ja numbreid järgida.

See võib hiljem olla veidi mõistatuslik, kui proovite programmi tõrkeotsingut teha ja koodi kirjutamise ajal olete kõik aadressid meelde jätnud.

Kuigi kommentaarid võidakse paigutada paigale, võib see veidi segaseks muutuda. Selleks on vaja numbreid nimetada ja see võib toimuda täiendava juhisega: 'equ' 'equ' käsk viitab sellele, et mõned asjad võivad olla võrdsed mõne muu kraamiga.

See ei pruugi olla käsk PIC-le, pigem kokkupanijale. See käsk hõlbustab nime määramist registriaadressi asukohale või konstandi programmeerimisterminile.

Loome oma programmi jaoks mõned konstandid ja oleme ka tunnistajaks, kui palju sirgjooneliselt see programmi loeb.

Nüüdseks oleme fikseerinud püsiväärtused, mida võime jätkata, seadistades need oma programmi. Enne nende kasutamist tuleb määrata püsiväärtused.

seepärast veenduge, et paigutaksite need alati programmi algusesse. Kirjutame programmi uuesti välja, välja arvatud kommentaarid, et võrrelda varasemat märgistust uusimaga.

Võib-olla märkate, et konstandid võimaldavad programmist veidi kergemini aru saada, kuid oleme endiselt kommentaarideta, muretsemata, kuna me pole veel lõpetanud.

Meie vilkuva LED-programmi puhul võib olla väike varjukülg.
Iga juhise lõpuleviimiseks on vaja 1 kellajada. Kui kasutame 4MHz kristalli, nõuab iga käsk 1 / 4MHz või 1uS lõpetamist.

Kuna oleme kasutanud vaid viit juhist, siis LED aktiveerub siis 5uS-is. See võib olla inimeste jaoks liiga kiire märkamiseks, lisaks näib, et LED on täielikult sisse lülitatud.

Selle asemel peaksime saavutama takistuse LED-i sisselülitamise ja LED-i väljalülitamise vahel. Pärssimise teooria on see, et loeme varasemast kogusest tagasi, nii et kui see jõuab nulli, lõpetame loendamise.

Nullväärtus tähistab viivituse lõppu ja me töötame oma protsessi kogu programmi vältel. Seetõttu peame kõigepealt määrama konstandi, mida meie loendurina kasutada.

Mõistkem see konstant COUNT. Pärast seda peame kindlaks määrama, kui olulisest arvust loendamist alustada. Kindlasti on suurim näitaja, mida me võiksime lisada, 255 või FFh kuusnurgas. Nagu ma varasemas õpetuses rääkisin, määrab equ-käsk registriolukorrale avaldise.

See tähendab, et olenemata sellest, millise koguse me oma COUNT eraldame, sobiks see registri üksustega. Juhul kui proovime määrata väärtuse FFh, saame vea, kui jõuame programmi kompileerida.

Põhjus on asukoht FFh, mistõttu me ei pääse sellele juurde. Seega, kuidas me peame määrama tõelise numbri? Kindlasti nõuab see väikest külgmist mõtlemist.

Kui võib-olla määraksime oma COUNT näiteks aadressile 08h, näitaks see põhilist eesmärgi registri sihtkohta. Vaikimisi on puutumata aladeks seatud FFh. Järelikult, kui COUNT viib kell 08h, näete FFh väärtust, kui me esimest korda sisse lülitame. Sellegipoolest, mina, sina, kuidas saaksime COUNT teise numbri juurde määrata? Kõik, mida me rakendame, on kõigepealt hinnangu teisaldamine sellesse sihtkohta.

Näiteks oletame, et soovisime, et COUNT väärtus oleks 85 h, me ei saa mainida COUNT võrdset 85 tundi, kuna see on Port-A kolmepoolse registri asukoht. Täpselt see, mida me saavutame, on järgmine: movlw 85h 85h väärtus W registris movwf 08h

Nüüd teisaldage see meie 08h registrisse. Järgnevalt, kui väljendame COUNT ekv 08h, vastab COUNT väärtusele 85h. Õrn, kas pole! Seetõttu määrame esialgu oma konstandi: COUNT võrdne 08h. Pärast seda peame seda arvu ühe võrra vähendama, kuni see muutub nulliks.

Nii juhtub lihtsalt, et on olemas üks käsk, mis on mõeldud selle saavutamiseks meie jaoks, kasutades selleks „goto” ja silti.

Käsk, mida rakendame, on järgmine: DECFSZ COUNT, 1 Selles juhises on kirjas: „Vähenda registrit (siin see on COUNT) komaga jälitatava numbri võrra. Kui saavutame nulli, hüpake kaks kohta ette. ”Leiame selle kõigepealt tegevuses, enne kui asetame selle kursusele.

See, mille oleme teinud, on esialgu meie konstantse arvu COUNT kuni 255. Järgnev segment paigutab sildi nimega LABEL meie käsu decfsz lähedal.

Decfsz COUNT, 1 vähendab COUNT väärtust ühe võrra ja säilitab lõpptulemuse otse arvuks COUNT. Lisaks kontrollib see, kas COUNT väärtuseks on 0.

Kui ei, siis käivitab see sel juhul programmi järgmisele reale liikumise. Nüüd on meil deklaratsioon „goto”, mis viib meid tagasi decfsz-juhiste juurde.

Juhul, kui COUNT väärtus on võrdne, annab decfsz-käsu tulemusena meie programm 2 punkti edasi ja saadetakse sinna, kus oleme väitnud 'Jätka siin'.

Seetõttu, kuna võite jälgida, oleme loonud programmi, et enne jätkamist istuda etteantud aja jooksul ühes kohas. Seda võiks nimetada viivitussilmuseks.

Viivitussilmuste mõistmine

Juhul kui vajame suuremat viivitust, võiksime jätkata ühe tsükli järgmiseks. Lisasilmused pikendasid viivitust. Olgem vähemalt kaks, eeldades, et tahame jälgida LED-välklampi. Me paigutame need viivitusaasad oma programmi ja saavutame selle, muutes selle tõeliseks programmiks, lisades kommentaare:

Selle programmi on võimalik kompileerida, pärast mida PIC. Ilmselt veenduge, et proovite vooluringi kontrollida, kas see tõesti toimib. Järgnevalt on toodud skeem, mille peaksite koostama kohe, kui olete PIC-i programmeerinud.


Hästi tehtud, oleksite võinud tegelikult koostada oma esimese PIC-programmi, samuti ehitada vooluahela LED-i vilkumiseks ja välja lülitamiseks. Seni, kui olete nende kursuste läbinud, võite olla õppinud kokku seitse õpetust 35st, kuid kahtlemata olete seni juhtinud sisend- / väljundporte!

Kas prooviksite muuta viivitusaasasid, et muuta LED-välklamp kiiremaks - mis näib olevat COUNT minimaalne väärtus, et sisuliselt LED-välklamp näha? Või võib-olla soovite LED-i allapoole stabiliseerimiseks lisada esialgse peale kolmanda või täiendava viivituse. kordumatu konstant iga viivitusaasa jaoks.

Võimalik, et võiksite siis viivitusaasadega tegeleda, et LED-välklamp muutuks kindla kiirusega, näiteks sekundi pärast. Järgmise juhendaja jooksul vaatame, kuidas suudame kasutada midagi alamprogrammina tuntud programmi kompaktse ja põhi säilitamiseks. Alamprogramm on lahutamatu osa koodist või programmist, millele võidakse viidata kui ja millal seda vaja võib minna. Alamprogramme kasutatakse juhtudel, kui täidate sageli sama funktsiooni.

Mis on alamprogrammid

Alamprogrammi kasutamise eelised on see, et tõenäoliselt on lihtsam muuta väärtust üks kord alamprogrammi sees, näiteks kümme korda kogu programmi kaudu, samuti aitab see oluliselt vähendada teie programmi tarbitava mälu taset PIC. Vaatame alamprogrammi:

Esialgu peame oma alamprogrammile määrama ja sellises olukorras oleme valinud RUTIIN. Pärast seda sisestame koodi, mida soovime tavapäraselt läbi viia. Sellepärast oleme valinud viivituse meie vilkuva LED-i programmis. Lõpuks lõpetame alamprogrammi, sisestades käsu RETURN.

Alamprogrammi alustamiseks kõikjal meie programmis sisestame kiiresti käsu CALL ja seejärel alamprogrammi tähise.

Me kaalume seda veidi põhjalikumalt. Kui oleme jõudnud programmi jaotisse CALL xxx, kus xxx on meie alamprogrammi nimi, hüppab programm kõikjale, kuhu alamprogramm xxx on installitud. Alamprogrammi sees olevad juhised viiakse läbi.

Kui käsk RETURN on täidetud, hüppab programm tagasi meie põhiprogrammi juurde meie CALL xxx käsule järgneva käsu juurde.

Sarnast alamprogrammi on võimalik mitu korda helistada, nagu soovite, mis selgitab, miks alamprogrammide kasutamine vähendab meie programmi üldist kestust.

Sellest hoolimata peaksite teadma paari tegurit. Esialgu, nagu ka meie põhiprogrammi puhul, tuleb enne nende kasutamist kinnitada kõik konkreetsed konstandid.

Neid võidakse tunnustada alamprogrammis või otse põhiprogrammi alguses. Soovitan teil tunnustada kõike oma põhiprogrammi alguses, sellest ajast alates mõistate, et asjad on identses seisus. Järgmisena tuleks veenduda, et põhiprogramm jätaks alamprogrammi üle.

Sellega ma vihjan, et kas peaksite alamprogrammi paigutama otse oma põhiprogrammi lõppu, välja arvatud juhul, kui kasutate alamprogrammi asukohast hüppamiseks deklaratsiooni „Goto”, jätkaks programm ja rakendaks alamprogrammi olenemata sellest, kas te seda nõuda või muul viisil.

PIC ei eristaks alamprogrammi ja põhiprogrammi. Vaatame oma vilkuvat led-programmi, kuid seekord kasutame viivitusahelaks alamprogrammi. Ideaalis saate teada, kui palju vähem keeruline programm tundub, samuti võite leida, kuidas alamprogramm praktiliselt rakendub.

Lõpuks võite täheldada, et viivitussilmuseks alamprogrammi kasutamisel võisime programmi mõõtmeid vähendada.

Iga kord, kui soovime viivitust, võib-olla siis, kui LED on sisse või välja lülitatud, nimetame viivitust põhimõtteliselt alamprogrammiks. Alamprogrammi lõppedes viib programm tagasi meie reale „Helista” vastava rea ​​juurde. Ülaltoodud joonisel paneme LED-i põlema.

Pärast seda võtame ühendust alamprogrammiga. Seejärel tuleb programm tagasi, et saaksime LED-i välja lülitada. Me kutsume alamprogrammi veel kord, juhuks kui alamprogramm võib olla lõpule jõudnud, tuleb programm tagasi ja järgnev käsk, mille ta tunneb, on „goto Start”. Kõigi huvitatud inimeste jaoks oli meie esimene programm 120 baiti pikk.

Alamprogrammi abil saaksime oma programmi mahtu vähendada 103 baidini. See ei saa tunduda nii fantastiline, kuid arvestades asjaolu, et meil on PIC-is kokku ainult 1024 baiti, on sellest kasu kõigil väikestel kogustel.

Järgmise juhendaja jooksul kontrollime sadamate lugemist.

Siiani oleme komponeerinud porti A, et saaksime LED-i sisse ja välja lülitada. Siinkohal näeme, kuidas hakkame sadamates olevaid I / O-tihvte lugema.

Sisend- / väljundportide lugemine

See on täpselt selleks, et tagada välise vooluringi ühendamine ja selle pakutavate konkreetsete väljundite mõjutamine.

Kui peaksite meie varasematest kursustest meelde jätma, kui soovite sisend- / väljundporte luua, pidime hüppama pangalt 0 pangale 1. Me saavutame selle esialgu:

Sel hetkel on meil sisestatud pordi A bitt 0. nüüd peame uurima, kas tihvt on kõrge või madal. Selle saavutamiseks võib kasutada ainult ühte kahest juhisest:

BTFSC ja BTFSS.

BTFSC käsk tähistab nii „Tehke registris natuke testi kui ka meie määratud bitti.

Kui see on 0, jätame sel juhul järgneva käsu välja. ” BTFSS tähendab 'Tee natuke testi registris ja natuke, mille loome. Kui see on seatud väärtusele 1, siis möödume järgnevast käsklusest.

Millist neist kasutame, määrab täpselt see, kuidas soovime, et meie programm vastaks sisendi uurimisel. Näiteks, kui me lihtsalt ootame sisendi väärtust 1, siis võime BTFSS-käsku kasutada järgmisel viisil:

Koodige siin:

BTFSS PortA, 0Goto start Jätkake siin:
:

Programm lülitub lihtsalt 'Carry on here' peale tingimusel, et PortA bitt 0 on kavandatud 1-le.

Praegu kirjutame programmi, mis võib LED-i kiirendada ühe kiirusega, kuid kui lüliti on piiratud, vilguks see LED-i kaks korda aeglasemalt.

Võimalik, et saate seda programmi iseseisvalt kasutada, siiski oleme selle loendi kuidagi lisanud.

Võite proovida ja kirjutada kogu programmi, et kontrollida, kas olete põhimõtetest aru saanud. Kasutame samaväärset vooluahelat nagu varem, kaasates PIC-i külge kinnitatud lüliti ja meie varustuse positiivse rööpa.

Siin oleme saavutanud LED-i sisselülitamise. Järgnevalt määran, kas lüliti on suletud.

Kui see on piiratud, siis järgmisena ühendan meie viivituse alamprogrammiga. See annab meile samaväärse viivituse kui varem, kuid võtame siinkohal ühendust kaks korda.

Sama kehtib ka siis, kui LED ei põle. Juhul kui lüliti pole kinni, on meil varasemad andmed sisse- ja väljalülitamise perioodid salvestatud.

Kas olete neid õppetunde algusest peale jälginud, võiksite saada aru, et olete PIC 16F84 35 juhisest kümme avastanud! Ja igaüks neist juhtub õppima lihtsalt LED-i sisse- ja väljalülitamise teel.

Siiani oleme koostanud, et PIC vilguks LED-i sisse ja välja.

Seejärel suutsime PIC-iga lüliti lisamisega, muutes seetõttu välgu kiirust.

Mäluruumi tõhus kasutamine

Ainus küsimus on see, et programm on üsna pikk ja mäluruumi üsna ebaefektiivne. See tundus ok, kui käske esimest korda kaasasin, kuid selle täitmiseks peaks olema lihtsam viis. Positiivselt on see, et analüüsime, kuidas me LEDi sõna otseses mõttes sisse ja välja lülitasime.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Alguses toppisime oma w-registri 02h-ga, pärast seda kandsime selle meie LED-i sisselülitamiseks meie PortA registrisse. Selle väljalülitamiseks pakkisime w-ga 00h, misjärel nihutasime selle meie PortA registrisse.

Kõigi nende rutiinide vahel olime sunnitud võtma ühendust alamprogrammiga, et oleks võimalik jälgida LED-i vilkumist.

Seetõttu pidime paar korda edastama kaks infokomplekti (üks kord w-registrisse ja siis PORTA-sse) ning kaks korda alamprogrammi (üks kord sisse, siis üks välja). Seega, kuidas saaksime selle saavutada suurema efektiivsusega? Väga lihtne.

Kasutame teistsugust käsku, mida nimetatakse XORF-iks. XORF-i käsk töötab registris funktsiooni Exclusive OR, mille määrame meie pakutava infoga. Usun, et pean enne jätkamist selgitama, mis maailmas on ainuõige VÕI. Kui meil on kaks sisendit ja üks väljund, saab sisendiks olla ainult 1, kui kaks sisendit erinevad. Kuigi need on samad, on väljund tõenäoliselt 0. Järgnev on tõetabel isikute jaoks, kes otsustavad neid kontrollida:

A B F0 0 00 1 11 0 11 1 0

Siinkohal kontrollime, mis toimub, kui renderdame B just nagu meie varasem väljund ja muudame lihtsalt A väärtust:

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

Kui säilitame väärtuse A sama kui 1 ja me välistame selle koos väljundiga, lülitatakse väljund. Juhul, kui te ei leia seda tõetabelist, võib allpool näha binaarset:

0 Praegune väljund
EX-VÕI 1 1 uue väljundiga
EX-VÕI 1 0 uue väljundiga

Võib-olla leiate, et eksklusiivse OR-i teisendamise korral üksusega muudame väljundi nüüd 0-st 1-ni.
Seega vajame LED-i sisse- ja väljalülitamiseks vaid paari lauset:

LIIKUMINE 02h
XORWF UKS, 1

Täpselt saavutame oma w-registri lisamise 02h-ga. Sel juhul oleme selle numbri ainuõiguslikud VÕI, hoolimata sellest, mis meie PortA-s on. Kui bitt 1 on 1, muutub see väärtuseks 0. Juhul kui bitt 1 on 0, muutub see väärtuseks 1. Uurime seda koodi üks või kaks korda, et kuvada, kuidas see binaarne töötab:

UKS
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Me ei pea tegelikult iga kord sama väärtust oma w-registrisse laadima, seetõttu on võimalik see üks kord alguses täita ja lihtsalt tagasi oma lülituskäskluse juurde minna. Lisaks ei peaks me oma PortA registris väärtust parandama. Põhjus? Kindlasti, kuna juhul, kui sisselülitamisel on see 1, saame seda lihtsalt ümber lülitada. Mina, alternatiivina 0 sisselülitamisel, lülitaksime selle ka nüüd ümber.

Seetõttu soovite näha meie äsja moodustatud koodi. Esimene tähistab meie vilkuvat LED-koodi, teine ​​aga lülitit lisavat koodi:

Soovime, et leiate, et lihtsalt ühe lihtsa juhise abil oleme nüüd oma programmi mahtu kärpinud. Tõsi on see, et kuvamaks, kui palju saaksime oma programme vähendada, oleme allpool toodud tabelis näidanud kahte koostatud programmi ja nende mõõtmeid:

Programmi muutmise mõõtmed (baiti)
Vilkuv LED Original 120
Vilkuv LED-alamprogramm lisati 103
Vilkuv LED XOR-funktsioon on kasutatud 91
Lülitiga LED Original 132
Lülitiga LED-funktsiooniga LED-funktsioon on kasutatud 124.

Seetõttu oleme mitte ainult avastanud mõned uudsed juhised, vaid kindlasti vähendanud ka skriptide suurust!

Allpool analüüsime, kuidas saate üksikuid bitte liigutada, teostada teatud sirgjoonelist aritmeetikat ja andmetabeleid.

Loogilised juhid

Viimases õpetuses tutvustasin operatsiooni Exclusive OR. ExOR-funktsiooni mõistetakse loogilise operaatorina.

Selles õpetuses valgustan täiendavaid loogilisi operaatoreid, mida PIC reklaamib. Punktprogrammides ei esine mingeid juhtumeid, kuid õpime operaatorite kasutamiseks lihtsaid meetodeid, rakendades väikeseid koodialasid.

AND funktsioon AND analüüsib põhimõtteliselt kahte bitti ja annab 1, kas need on samad, ja 0, kui need on eristavad. Näiteks kui mainisime 1 JA 1, on tulemus 1, kui aga deklareerime 1 JA 0, oleks tagajärg 0.

Ütlematagi selge, et oleme võimelised ka sõnu hindama, samuti täidab AND-i funktsioon kahe termini järk-järgult ülevaatamist. Allpool toodud näide demonstreerib kahe 8-bitise sõna muutumist tootega AND-ks:

11001011
JA 10110011
Võrdub 10000011

Loodan, et olete nõus, tulemusel on lihtsalt üks, kui 2 1 on üksteisega käsikäes kahe sõnaga. Oleme võimelised kasutama funktsiooni AND, näiteks portide kontrollimiseks.

Juhul, kui kontrollime mõnda vooluahelaga ühendatud sisend- / väljundtihvti, peaksime silma peal hoidma konkreetset olukorda, kus ainult mõned tihvtid on kõrgel, saame sel juhul üsna palju lugeda port, mille järel JA tulemus tingimusega, mida oleme uurinud, on identne ülaltooduga.

PIC pakub meile AND-i kahte koostisosa.
Need on ANDLW ja ANDWF. ANDLW lubab meil täita AND-funktsiooni koos W-registri üksikasjadega ja summa, mille me määrame.

Süntaks on järgmine: ANDLW, kuhu me täpselt läheme, ja W sisu.

Funktsiooni AND tagajärjed salvestatakse otse W-registrisse.
ANDWF lubab meil teostada W-registris funktsiooni AND ja teises registris, näiteks PORT. Süntaks on: ANDWF, d, mis on register, millest oleme vaimustuses, nt. PORTA ja d näitavad PIC-i, kuhu peaksite tulemuse asetama. Kui d = 0, pannakse tulemus W-registrisse ja d = 1-st salvestatakse lõpptulemus meie määratud registrisse. Kaks allpool olevat koodiosa näitavad head näidet igast funktsioonist AND.

Esialgne uurib PORTA olekut, mille käigus peame kontrollima, kas sisendite arv on 1100. Saame tulemuse W-registrisse tagasi paigutada

movlw 1100
ANDWF 05h, 0 Teine joonis võib nüüd kontrollida W-registri sisu:
ANDLW 1100

VÕI

Oleme nüüdseks avastanud ühe OR-funktsiooni, täpsemalt XOR-i. Sellest saab 1, kui kaks bitti ei ole ühesugused, vaid erinevad. Leiate teise OR-funktsiooni nimega IOR, mis on kaasav OR. See funktsioon genereerib 1 juhul, kui kumbki bitt on 1, kuid lisaks sellele, kui kõik bitid on 1. Allpool on selge tõetabel selle illustreerimiseks:

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

Mis on aritmeetikaoperaatorid

LISAMA

See funktsioon täidab seda, mida tavaliselt väidab. See annab kaks numbrit! Juhul kui kahe numbri liitmise tagajärg ületab 8 bitti, seatakse sel juhul tõenäoliselt KANDE lipp. Lipp CARRY asub aadressil 03h bit 0.

Kui see bitt on ajastatud, ületasid need kaks numbrit 8 bitti. Kui see on 0, asub sel juhul tagajärg 8 bitti. Nagu varemgi, pakub PIC meile kahte ADD stiili, täpsemalt ADDLW ja ADDWF. Nagu võisite oletada, sarnaneb see ülaltoodud funktsiooniga. ADDLW pakub W-registri sisu sellele, mille me ette näeme. Süntaks on järgmine: ADDLW ADDWF lisab W-registri ja mõne muu meie määratud registri sisu.

Süntaks on: ADDWF, d on koht

SUB

Siinkohal ei saa vist eeldada, mida see funktsioon täidab! Tõepoolest, te kahtlustasite seda, seda funktsiooni
lahutab ühe bitti teisest. Jällegi pakub PIC meile kahte maitset: SUBLW ja SUBWF. Süntaks on täpselt sarnane funktsiooniga ADD, välja arvatud see, et ilmselt sisestate ADD asemel SUB!

Kasv Juhul, kui sooviksime PIC-sse lisada numbri 1, saaksime absoluutselt kasutada funktsiooni ADD ja kasutada number üks. ~ Selle raskus on see, et peame kõigepealt paigutama figuuri W-registrisse, seejärel kasutama selle suurendamiseks ADDLW 1-juhtelementi. Juhul, kui soovisime lisada ühe registrisse, võib see veel hullem olla. Esmalt peame sisestama numbri 1 W-registrisse, pärast seda kasutage ADDWF-i 1. Seega, näiteks 1 lisamiseks asukohta 0C, peaksime näiteks omama järgmist skripti osa:

movlw 01
addwf 0c, 1

Selle teostamiseks on olemas lihtsam meetod. Saame täita käsku INCF. Süntaks on: INCF, d kus on register või koht, milles me muretseme, ja d näitab PIC-i, kuhu peaksite tulemuse asetama. Juhul, kui d = 0, on tulemus W-registris ja juhul, kui d = 1, määratakse tagajärg meie määratud registrisse.

Selle individuaalse juhise abil suudame tegelikult kodeerida viiskümmend protsenti. Kui me soovisime tulemust W-registrisse taastada, siis oleksime pidanud ülalnimetatud juhul kasutama lisakäsku 0C üksuste tagasi W-registrisse nihutamiseks, misjärel asetage 0C-register tagasi mis see oli.

On olemas kasvukäsk. See on INCFSZ. See käsk võib suurendada meie poolt ette nähtud registrit, kuid kui register on pärast juurdekasvu võrdne 0 (see juhtub, kui lisame 1 kuni 127), siis läbib PIC tõenäoliselt järgmise käsu. Allpool olev osa koodist peegeldab seda:

Silmus incfsz 0C
Mine aasa
:
:
Ülejäänud programm.

Eeltoodud koodi osas suurendatakse 0C väärtust 1. Järgmisena on meil käsk, mis teavitab PIC-i naasma meie sildi nimega Loop ja suurendama 0C uuesti 1-ga. See jätkub seni, kuni 0C on võrdne 127. Selles olukorras, kui suurendame 0C võrra 1, vastab 0C nüüd 0-le. Meie INCFSZ-i käsk võib PIC-d väga hästi teavitada järgmise käsu väljajätmisest, mis antud juhul on goto-deklaratsioon, seega jätkab PIC ülejäänud programmi jätkamist.

Kahanemine

Nüüdseks oleme kahanemisfunktsiooni varasemates koolitustes arutanud, seetõttu ei vaata ma seda enam üle.

Täiendada

Selle arutelu viimane juhis muudaks registris kõik meie määratud bitid vastupidiseks. Süntaks on: COMF, d milles

Bittoperatsioonide mõistmine

Seda saab kasutada näiteks pordi tihvtide kiireks vahetamiseks väljundist sisendisse ja nii edasi. Bittfunktsioonid võimaldavad meil kujundada avaldises ühe biti. Need võimaldavad meil jätkata, määrata ja vabaneda üksikutest bittidest registrites või numbrites, mille oleme määranud.

Selle kursuse lõpus avalikustame programmi, mis on loodud järjestikuste tulede komplekti loomiseks, mis liiguvad edasi, siis vastupidi. Me täheldasime seda varem saavutatud, kui uurisime ainuõigusliku funktsiooni OR, kus me ainult ekspresseerisime pordid avaldisega. Oleme PIC - i pordide loomisel märganud mõnda bitifunktsiooni ja

Lubage mul korrata nende kasutamist siin.

BCF

See juhis pühib natuke ära, mille määrame meie määratud registris. Süntaks
on:
BCF,

Me kasutasime seda varem, et muuta lehekülgedelt 1 lehekülgedele 0, eemaldades STATUSe registrist natuke. Samuti saame seda kasutada, et fikseerida natuke 0-le mis tahes erinevas registris / asukohas. Näiteks kui me sooviksime jaotises 0C salvestatud 11001101 kolmanda biti seada väärtusele 0, võime seda teha
lisada:

BCF 0C, 03

BSF

See käsk fikseerib iga meie poolt määratud biti 1-ni igas registreeritud registris. Me kasutasime seda varem, et liikuda lehelt 0 leheküljele 1. Süntaks on: BSF ,, ja seda kasutatakse täpselt samasuguses meetodis nagu ülaltoodud BCF.

BTFSCU Kuni praeguseni saime registris natuke seadistada või kustutada. Kujutage siiski ette, kas peame põhimõtteliselt kontrollima, kas bitt on registris 1 või 0?

Kindlasti on BTFSC-d võimalik kasutada. See ütleb Bit Test Register F ja jätke vahele, kui see on selge. Selles juhises analüüsitakse bitti, mille määrame registrisse. Kui bitt on 0, teavitaks käsk PIC-d järgmise käsu läbimisest.

Võime seda juhist kasutada juhul, kui soovime kontrollida lippu, näiteks kandelippu. See säästab, et peame lugema registrit STATUS ja otsima üksikuid bitte, et teada saada, millised lipud on fikseeritud. Näiteks kui me soovisime pärast 2 numbri lisamist kontrollida, kas Carry lipp on seatud 1-le, siis võiksime sisestada järgmise:

BTFSC 03h, 0
jätkake siin, kui see on seatud väärtusele 1
või siin, kui see on seatud väärtusele 0

Juhul kui biti olek on 1, täidetakse sel juhul BTFSC-le järgnev käsk. Kui see on seatud väärtusele 0, jäetakse järgmine käsk vahele. Järgmist koodi eksemplari osa, milles seda võidakse kasutada:

Silmus:
:
:
BTFSC 03,0
Mine aasa

Ülaltoodud koodis väljub PIC lihtsalt silmusest, kui STATUS-registri bitt 0 (või Carry lipp) on määratud väärtusele 0. Või muidu viiakse läbi käsk goto.

BTFSS

Selles juhises on märgitud biti testi register F ja jäta vahele, kui see on määratud. See võib olla võrreldav BTFSC käsuga, peale selle jätaks PIC järgmise käsu välja, kui meie poolt hinnatud bittiks seatakse 0 asemel 1.

CLRF

See käsk fikseerib kogu registri üksikasjad väärtuseks 0. Süntaks on:

CLRF
Kasutasime seda varem, et seadistada sadamate väljundiks 0, rakendades CLRF 85h. Lisaks kasutasime seda portide fikseerimiseks, et kaasata CLRF-i abil kõik väljundis olevad tihvtid
05h.

CLRW

See võib sarnaneda CLRF-käsuga, välja arvatud juhul, kui tühjendatakse W-register. Süntaks on üsna lihtne:

CLRW

RLF ja RRF

Need suunad transpordiksid registris natuke üksiku pesa vasakule (RLF) või paremale (RRF) registris. Näiteks kui meil on vaja 00000001 ja me kasutasime RLF-i, võiksime sel juhul omada ka 00000010. Mis siis edasi toimub, kui on 10000000 ja rakendasime RLF-käsu? Kindlasti oleks 1 paigutatud kandelipule. Kui me rakendaksime RLF-i käsklust veel kord, ilmuks 1 alguses uuesti tagasi. Samasugused toimuvad RRF-i juhiste puhul, aga vastupidiselt. Allpool toodud juhtum näitab seda RLF-käsu puhul, kus meil on näha registri 8 bitti ja ka kandelipp:

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

Näidisprogramm

Nüüd näeme näite koodi, mida saab kompileerida ja juhtida. See genereeriks järjestuse valguse, mis algab PortA bitist 0, minnes PortB bitti 8 ja
siis tagasi.
Haakige LED-id iga pordi tihvti külge. Meil on natuke osa
selles õpetuses toodud protseduurid.

TIME EQU 9FH Muutuv viivitusaasale.
PORTB EQU 06H sadama B aadress.
TRISB EQU 86H Port B Tristate'i aadress.
PORTA EQU 05H Port Aadress.
TRISA EQU 85H port A Tristate'i aadress.
STATUS EQU 03H Lehe valimise register.
COUNT1 EQU 0CH Loop register.
COUNT2 EQU 0DH silmusregister.

BSF STATUS, 5 Minge 1. lehele
MOVLW 00H ja seadistage
MOVWF TRISB nii A kui ka B sadamad
MOVLW 00H väljundiks,
MOVWF TRISA naaseb seejärel lehele
BCF STATUS, 5 lk 0.
MOVLW 00H Selge port A.
MOVWF UKS

Põhiprogrammi algus

RUNMOVLW
01H Määrake esimene bitMOVWF
PORTB sadamas B. CALL
VIIVITUS Oodake veidiKÕNE
VIIVITUS
Liigutage pordil B olevat bitti vasakule ja seejärel peatage.RLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
SADAM, 1KÕNE
VIIVEKÕNE
DELAYRLF
PORTB, 1 See liigutab bitti kandelipusse
Nüüd liikuge porti A ja liikuge natuke vasakule .RLF
PORTA, 1 See nihutab bitti nullilipust PortACALL-i
VIIVISKUTSE VIIVITUSRLF
UKS, 1KÕNE
VIIVEKÕNE
DELAYRLF
UKS, 1KÕNE
VIIVEKÕNE
DELAYRLF
UKS, 1KÕNE
VIIVEKÕNE
VIIVITUS
Liigutage bitt tagasi ARRF-i
UKS, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
UKS, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
UKS, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
PORTA, 1 See liigutab biti nullilipusse Nüüd liigutage bitti
tagasi sadamasse BRRF
SADAM, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
SADAM, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
SADAM, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
SADAM, 1KÕNE
VIIVEKÕNE VIIVITUSRRF
SADAM, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
SADAM, 1KÕNE
VIIVEKÕNE
VIIVITUSRF
SADAM, 1KÕNE
VIIVEKÕNE
VIIVITUS Nüüd oleme tagasi seal, kus alustasime, GOTO
JOOKS lähme uuesti.

Koolituskomplektis on suurepärane võimalus, mis võimaldab teil kasutada andmetabelit.

Andmetabel on vaid andmepakkumiste loend, kus kõik vaadatakse üle mõnest kaalutlusest lähtuvalt.
Näiteks võib teil olla vooluahel, mis kasutab PIC-i, mis loendab juhtumite arvu, mille sisendnõel muutub 1 sekundiga kõrgeks. Pärast seda saate numbri eksponeerida 7 segmendi ekraanil.

Niipea kui ajastus on alanud, hakkab PIC loendama, mitu korda tihvt läheb kõrgeks. Ühe sekundi pärast külastab ta tabelit ja vaatab üles andmed, millele ta peab kuvama numbri, mis sümboliseerib tihvtide kõrgeid olukordi. See võib olla kasulik, kuna me ei määra kindlaks, milline näitaja võiks olla, enne kui PIC on oma hinnangu teinud.

Tabeli abil saame PIC-l määrata, millist joonist kujutada. Siinkohal, enne kui ma teile jätkuvalt näitan, kuidas andmetabel töötab, pean võib-olla teile ütlema, et PIC säilitab programmi toimimise ajal selle asukoha asukohta.

See hõlbustab neid, kes on BASIC-is programmeerinud. Vastasel juhul ärge muretsege, võiksite jätkata teooria tundmaõppimist. Kujutage ette, et on olemas BASIC-programm, mis sarnaneb allpool esitatud programmiga:

10 AASTAT K = 0
11 K = K + 1
12 KUI K> 10 SIIS SAI 20 MUU JÄTKUD 11
20 PRINT K
21 LÕPP

Programm algab reast 10. Niipea, kui K on planeeritud 0-ni, liigub see edasi reale 11. Pärast seda, kui oleme lisanud 1-st K-ni, jätkame pärast seda rida 12.

Siinkohal võime olla uudishimulikud, kui K on suurem kui 10. Juhul kui see on nii, suundume järgmisena reale 20 või muidu naaseme reale 11.

Rida 20 dokumenteerib K ja rida 21 lõpetab programmi. BASIC kasutab reastatistikat, et aidata programmeerijal pidada arvestust probleemide kohta, kuna sildid pole lubatud. PIC kasutab sihtkohtade vahel põgenemiseks silte - või saab see tõesti?

Kasutame silte, et olla kursis probleemide asukohaga, ning tagada, et suudaksime PIC-d lihtsal viisil teavitada, kust otsida.

Täpselt toimub see, et PIC kasutab ära siseliini loendurit, mida nimetatakse programmiloenduriks. Programmi loendur (lühendatult PC-ks) mälu sihtkohast, kus see käsk asub.

Alati, kui teavitame PIC-d valitud sildi külastamisest, saab ta aru mälupunktist ja suurendab seetõttu arvutit, kuni ta mälu sihtkohta näeb. See on täpselt sama meetod, mida kontrollime ülalolevat programmi BASIC. Allpool on koodijupp, kus iga juhise kõrval on mäluruumid või arvuti üksused:

Arvuti juhised0000 movlw 03
0001 movwf 0C
0002 Silmus decfsc 0C
0003 goto Loop
0004 lõpp

Eespool toodud näites oleme fikseerinud arvuti 0000-le. Sellel on käsk movlw 03. Kui PIC on need andmed rakendanud, suurendab see arvutit, et järgnevat käsku skannida. Sel hetkel vaatab PIC movwf 0C. Arvutit suurendatakse uuesti.

Nüüd PIC uuringud decfsc 0C. Juhul kui 0C üksikasjad pole 0, suurendatakse sel juhul arvutit 1 võrra ning järgmine käsk Goto Loop annab arvutile teada, et naaseb asendisse 0003, mis on nimetatud silmus. Kui 0C üksikasjad on 0, soovitatakse arvutil suurendada 2 võrra, jättes järgnevad juhised lihtsalt välja.

Andmetabelite mõistmine

See asetab arvuti positsiooni 0004, kus programm lõpeb. Sihtkohad määrab kokkupanija ja me ei peaks üldjuhul muretsema, mida arvuti saavutab. Kuni leiame vajaduse see kontrolli alla saada täpselt nii, nagu me seda teeme andmetabelite kasutamisel. Andmetabeli toimimise kirjeldamiseks on kõige mugavam alustada illustratsioonist.

PC equ 02
movlw 03
kõnetabel
:
tabeli addwf arvuti
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
tagasi

Esialgne juhis on silt PC eraldamine programmiloenduri aadressiga (02h). Varsti pärast 03h väärtuse sisestamist w-registrisse. Pärast seda suhtleme lauale. Alamprogrammitabeli eesmine rida suurendab W-registri (03h) üksikasju programmiloendurile.

See käivitab programmiloenduri tõsta 3 võrra või teisiti öeldes stimuleerib programmiloendurit jätkama 3 rida. Kui loendur saabub 3 rida allapoole, tunnistab PIC käsu retlw. See käsk saadab sellele järgneva väärtuse W-registrisse, misjärel see tuleb alamprogrammist tagasi. RETLW tähistab põhimõtteliselt tagasitulekut, sõna otseses mõttes W-le.

Vt. Panin koma sõna Tagasi järele. Kuna oleme alamprogrammis, vajame selle pinnale käsku Tagastamine. Seetõttu RET juhendis. Pärast seda, kui RETLW on käsk number, sisestatakse see täpselt W-registrisse.

Sel juhul on see joonis 3. Me võiksime W-registrisse määrata mis tahes koguse, kui tabeli alamprogrammis on see arv ühendatud programmiloenduriga, avastame retlw-käsu. Ülaloleval illustratsioonil tähendab see, et me võime omada suvalist arvu vahemikus 1 kuni 7. Kui jätkame alamprogrammist mööda, võime lõpetada programmi täiendava osa. Sel põhjusel on andmete tabeli paigutamine täpselt PIC-programmi lõpu poole nutikas käik, seega kui sel juhul ületame, jõuame programmi lõppu ikkagi.

Katkestuste teema võib olla pikim ja kõige raskem läbida.

Te ei leia ühtegi lihtsat katkestuste üksikasjaliku kirjeldamise meetodit, kuid väikese osaõnne korral võite selle osa lõpupoole katkestusi ka oma programmidesse rakendada.
Oleme jaotanud lõigu kaheks etapiks. See tähendab, et teemat saaks jaotada osadeks, et oleksite hõlpsasti mõistetav.

Mis täpselt on katkestus? Kindlasti, nagu termin näitab, on katkestus tehnika või signaal, mis takistab mikroprotsessorit / mikrokontrollerit toimimast, et juhtuda võiks midagi muud.

Lubage mul teha teile igapäevane illustratsioon. Arvate, et lõõgastute oma kodus ja vestlete teise inimesega. Korraga kõlab telefon.

Lõpetate rääkimise ja haarate telefoni, et helistajaga rääkida. Kui olete telefoni teel suhelnud, otsustate enne telefoni helistamist pöörduda tagasi inimese poole. Kellegagi lobisedes on võimalik arvestada peamise rutiiniga, telefonihelin häirib teie vestlust ja rutiinipaus on telefonis rääkimise meetod.

Kuigi telefoniarutelu saab otsa, siis pöördute tagasi oma esmase vestlusrutiini juurde. See illustratsioon on täpselt see, kuidas protsessor toimingutega katkestada.

Esmane programm töötab, täites teatud funktsioone vooluringis, kuid katkestuse korral seiskub esmane programm teise rutiini sooritamise ajal. rutiin lõpeb, liigub protsessor peamise rutiini juurde nagu varemgi.

Katkestuste mõistmine

PIC-l on 4 katkestuse allikat. Neid sai jagada paariks rühmaks. Kaks neist on katkestuste allikad, mida saab kasutada PIC-i jaoks väljapoole, teised kaks on sisemised protsessid. Lubage mul siin kaks välist tüüpi selgitada. Ülejäänud kahte kirjeldatakse erinevates õpetustes, kui jõuame taimeriteni ja salvestame andmeid.

Kui peaksite PIC-i väljavõtet kontrollima, märkate, et tihvt 6 on RB0 / INT. Siinkohal on RB0 selgelt pordi B bit 0. INT tähistab, et see võib samuti olla konfigureeritud välise katkestustihvtina. Lisaks võib katkestuste jaoks kasutada ka sadama B kontakte 4 kuni 7 (tihvte 10 kuni 13). Enne kui saame kasutada INT-i või mõnda muud Port B tihvti, peame täitma kaks ülesannet. Kõigepealt peame PIC-le teatama, et kasutame katkestusi.

Järgmisena peame määrama, millist pordi B tihvti me kasutame pigem katkestuse kui I / O-tihvtina. PIC-i seest leiate registri, mida nimetatakse INTCONiks, ja see asub aadressil 0Bh. Selles registris leiate 8 bitti, mis võivad olla lubatud või keelatud. INTCONi bitt 7 on tuntud kui GIE. See on ülemaailmse lubamise lubamine. Selle parandamine väärtusele 1 annab PIC-ile teada, et kasutame katkestust.

INTCONi bitt 4 on tuntud kui INTE, Interrupt Enable. Selle biti viimine ühele annab PIC-le teada, et RB0 saab olema katkestustihvt. Biti 3 konfigureerimine, nimega RBIE, teavitab PIc-d, et hakkame kasutama pordi B bitte 4–7. Siinkohal saab PIC aru, millal see tihvt võib olla kõrge või madal, peab selle esitus peatama ja jätkama katkestusega rutiinne. Siinkohal peame PIC-i teavitama, kas katkestus toimub tõenäoliselt signaali tõusvas servas (0 V kuni + 5 V) või langevas servas (+ 5 V kuni 0 V) ​​või mitte.

Lihtsamalt öeldes, kas me soovime, et PIC katkestaks iga kord, kui signaal liigub madalast kõrgemale või kõrgelt madalale. Kuritegevuse tõttu saab selle tõestada tõusvale servale asetamiseks.

Serva „käivitamine” on ajastatud ülespoole registrisse OPTION, nimega aadress 81h. Natuke, millest oleme vaimustuses, on bitt 6, mida sageli nimetatakse INTEDG-ks.

Selle määramine väärtusele 1 paneb PIC-i häirima paigaldusserva (vaikeseisund) ja selle väärtuseks 0 seadmine stimuleerib PIC-i libiseval serval häirima. Kui soovite, et PIC aktiveeruks tõusvas servas, ei pea te kindlasti selle bitiga midagi tegema.

Siinkohal on kahjuks optsiooniregister pangas 1, mis tähendab, et pärast seda, kui naasete panka 0, on meil hea meel muuta panga 0 asemel panga 1 vahel, määrata bitt optsioonide registris. Siin on peamine teha iga bitt panga 1 registreerub ühe streigiga, näiteks pordi tihvtide loomisega, pärast seda naaseb panka 0, kui olete valmis.

Hea, järelikult oleme PIC-ile teatanud, milline tihvt on tõenäoliselt katkestus ja millise serva käivitada, mis toimub programmis ja PIC-is igal ajal, kui katkestus juhtub? Paar kraami toimub. Kõigepealt on kavas ‘lipp’.

See teavitab PIC-i sisemist protsessorit katkestuse toimumisest. Edasi annab programmiloendur (millest rääkisin eelmises õpetuses) näpunäiteid PIC-i konkreetsele aadressile. Vaatame need kõik kiiresti läbi. Katkestuse lipp Meie INTCON-i registris on bitt 1 katkestuse lipp, nimega INTF. Kui fikseeritakse katkestusi, fikseeritakse see lipp tõenäoliselt väärtusele 1.

Kui katkestust ei toimu, asetatakse lipp väärtusele 0. Nagu ka peaaegu kõik saavutatakse. Sel hetkel võite mõelda selle üle, et mis mõte sellel on? Kindlasti, kuigi PIC-i tähtaeg on 1, ei suuda PIC teisele katkestusele reageerida ega reageeri. Seetõttu väljendame, et me katkestame. Lipp fikseeritakse tõenäoliselt 1-le ja PIC võib katkestuse töötamiseks minna meie rutiini.

Kui see lipp ei olnud fikseeritud väärtusele 1 ja PIC-il lubati jätkata katkestusele vastamist, võib tihvti pidev pulseerimine hoida PIC-i naasmise katkestusrutiini algusesse ja mitte mingil juhul seda lõpule viia. Naastes minu telefoni illustreerimise juurde, on see sarnane telefoni tõstmisega ja kohe, kui selle üle arutlema asute, hakkab see uuesti helisema, kuna teine ​​inimene soovib teiega rääkida.

Soovitav on lõpetada üks dialoog, seejärel haarata telefon uuesti, et rääkida järgneva inimesega. Selle lipuga leiate väikese probleemi. Kuigi PIC määrab selle lipu kiiresti väärtusele 1, ei määra see seda uuesti 0-ks! Seda tegevust peab tegema programmeerija - s.t sina. Seda saab vaevata saavutada, kuna olen kindel, et see on vajalik ja see tuleb saavutada pärast seda, kui PIC on katkestusrutiini läbi viinud.

Mälu asukoht Alati, kui PIC sisse lülitate, või kui lähtestamine on olemas, annab programmiloendur näpunäiteid aadressile 0000h, mis võib programmimälu alguses olla kiire. Kuid katkestuse korral näitab programmiloendur aadressi 0004h.

Seega, kui me koostame oma programmi, millel on katkestused, peame kõigepealt teavitama PIC-i, et hüpata üle aadressile 0004h, ja säilitada katkestamise rutiin, mis algab aadressist 0004h, ülejäänud programmist eraldi.

Selle esitamine võib olla probleemivaba. Esialgu alustame oma programmi käsuga ORG. See käsk tähistab päritolu või algust. Püsime selle juures aadressiga. Kuna PIC algab aadressil 0000h, sisestame ORG 0000h. Pärast seda peame mööda aadressi 0004h. Selle saavutame, pannes GOTO-juhise, millele on lisatud silt, mis annab näpunäiteid meie põhiprogrammile.

Pärast seda järgime seda GOTO käsku veel ühe ORG-ga, hetkel aadressiga 0004h. Pärast seda käsku sisestame oma katkestuse rutiini. Siinkohal võime ehk sisestada oma katkestusrutiini otse teise ORG-käsu järgi või suudame paigutada GOTO-lause, mis osutab katkestusrutiinile.

See on tõesti seotud teie poolse valikuvõimalusega. Pakutava PIC-i teavitamiseks jõudsime katkestusrutiini lõppu, peame käsu RTFIE rutiini lõpupoole suunama. See käsk tähistab katkestamise rutiinist naasmist. Kuigi PIC seda märkab, näitab programmiloendur PIC-i lõplikku positsiooni enne katkestuse toimumist. Ülaltoodu kuvamiseks oleme allpool loonud lühikese jaotise koodist:

Katkestuste kasutamisel peaksite teavitama paarist. Esialgne kipub olema selline, et kui kasutate oma põhiprogrammis ja katkestuste režiimis identset registrit, pidage meeles, et registri üksikasjad muutuvad tõenäoliselt katkestuse toimumisel.

Näiteks kasutagem w-registrit andmete edastamiseks pordi A põhiprogrammi, seetõttu võite andmete registrist ühest sihtpunktist teise suunamiseks kasutada ka katkestusrutiinis olevat w-registrit.

Kui te ei ole ettevaatlik, sisaldab w-register viimast väärtust, mille ta sai katkestusrutiinis olles, nii et katkestusest naastes edastatakse see teave A-porti, mitte enne, kui teil varem oli tekkis katkestus.

Selle ümber on w-registri üksikasjade hetkesalvestamine enne seda, kui seda uuesti katkestusrutiinis kasutate. Teine on asjaolu, et leiate viivituse ühe katkestuse toimumise ja järgneva vahel. Kuigi saate aru, on PIC-il väliskell, mis võib olla kristall või takisti-kondensaatori kombo.

Sõltumata selle kella sagedusest jagab PIC selle 4-ga, pärast mida see kasutab sisemist ajastust. Näiteks juhul, kui teie PIC-iga on ühendatud 4MHz kristall, täidaks PIC antud juhul juhiseid sagedusel 1MHz. See sisemine ajastus on tuntud kui juhiste tsükkel. Siinkohal väidab andmeleht (kahtlemata väiksuses), et peate lubama katkestuste vahel 3 kuni 4 käsuringi.

Minu eesmärk oleks lubada 4 vooru. Viivituse põhjuseks on see, et PIC nõuab aega, et hüpata katkestuse aadressile, lipule ja jõuda tagasi katkestuse rutiinist. Seetõttu hoidke seda meeles, kui töötate PIC-i katkestuse aktiveerimiseks alternatiivse vooluringiga.

Siinkohal on punkt asjaolule, et kui kasutate katkestusena porti B bitte 4–7. Te ei saa valida sadamas B konkreetseid tihvte, et need katkestusena toimiksid.

Seega, kui lubate neid tihvte, võivad need tõenäoliselt kõik saada. Seetõttu ei saa teil näiteks lihtsalt olla 4. ja 5. bitti - tõenäoliselt antakse volitused 6. ja 7. korraga. Mis on eesmärk saada neli bitti katkestust tähistama? Kindlasti võib teil olla PIC-i külge ühendatud vooluring, juhul kui keegi neljast reast läheb kõrgele, võib see olla probleem, mida peate PIC-i koheselt mõjutama.

Selle üks näide võib olla kodu valvesignalisatsioon, milles neli andurit on ühendatud pordi B tihvtidega 4 kuni 7. Iga konkreetne andur võib PIC-i käivitada alarmi ja häire signaalimise rutiin on katkestamise rutiin. See säästab sadamate pidevat kontrollimist ja võimaldab PIC-l jätkata erinevate küsimustega. Järgmises õpetuses koostame katkestuse haldamiseks programmi.

Viimase õpetuse raames käsitlesime palju põhitõdesid, seetõttu tunnen, et on kätte jõudnud aeg, kus koostasime oma esimese programmi.

Programm, mille kirjutame, loendaks kordade arvu, kui lülitame sisse ja eksponeerime siis numbri.

Programm loendaks vahemikku 0 kuni 9, vaadatuna 4 LED-il binaarkujul koos sisendi või katkestusega tõenäoliselt RB0-l.

Number, mida peame läbi viima, on PIC-i teavitamine katkestuse korral hüpata üle aadressile, millele programmiloendur osutab.

Märkate, et kasutame kuueteistkümnendarvude kuvamiseks ainulaadset meetodit. Enne kui ma juhtusin, rakendage F9h, milles h tähistas kuueteistkümnendkohti. Võiksime selle kirjutada kui 0xF9, mis on struktuur, mida me edaspidi kasutame.

Nüüd peame PIC-ile ütlema, et kasutame katkestusi ja katkestusnõelana kasutame RB0 tihvti 6:

bsf INTCON, 7GIE - globaalse katkestuse lubamine (1 = lubamine)
bsf INTCON, 4INTE - RB0 katkestuse lubamine (1 = lubamine)
Kustutan katkestuse lipu igaks juhuks (ma ei usalda kunagi midagi!)
bcf INTCON, 1INTF - Kustuta igaks juhuks lipubitt

Praegu peame looma oma kaks sadamat. Pidage meeles, et kuna kasutame nüüd RB0 katkestusnõelana, tuleb see sisendina kindlaks määrata:

Lülitite arvu salvestamiseks kasutame muutujat nimega COUNT. Võiksime lihtsalt suurendada väärtust sadamas A, kuid saate aru, miks ma kasutan muutujat, kui kirjutame oma katkestusrutiini.

Seetõttu on meie põhiprogramm koostatud ja siinkohal peame PIC-d teavitama, kuidas katkestuse korral edasi minna. Selles näites on meie katkestus tõenäoliselt lüliti. Just see, mida me sooviksime, et PIC oleks iga kord, kui lüliti on piiratud, on üks reguleeritava COUNT väärtusest.

Sellegipoolest soovime lihtsalt näidata, kui palju kordi lüliti lülitub vahemikku 0 kuni 9. Eespool ütlesin, et võime katkestuse korral lihtsalt suurendada A-pordi väärtust. Pordil A on siiski 5 bitti, juhul kui me lihtsalt suurendame sadamat, on meil suurim arv 31. On paar selgitust, miks ma valisin 31-le mitte liikumise.

Esialgu kasutame 7-segmendilist ekraani, mis võib kõige rohkem minna vahemikku 0 kuni 15 (0 kuni F kuusnurgas). Järgmisena soovin teile lisaks näidata mõnda aritmeetilist käsku, mille otsa te eelmistes õppetundides komistasite.

Seetõttu jätkame oma katkestamise rutiiniga. Esiteks peame esmalt oma registri üksikasjad lühidalt salvestama, kuna oleme rakendanud seda COUNT sisu PORTA-le nihutamiseks. Kui me seda ei salvesta, võime sel juhul oma aritmeetika tõttu edastada täiesti erineva arvu. Seetõttu teeme selle kõigepealt ära:

Siinkohal saame aru, kas COUNT väärtus on 9 või rohkem. Just see, mida peame nüüd täitma, on see, kui COUNT on suurem kui 9, asetage see tagasi 0-le või pöörduge tagasi põhiprogrammi, et tagada selle jõudmine porti A. BTFSS-käsk, kuna saate aru, kas järgnev
juhis juhul, kui kandelipp on ajastatud, st COUNT = 10:

Ainus asi, mis nüüd teha on, on kollektiivne sisestamine ja meie konstantidele väärtuste määramine, mida saame täita kohe oma programmi alguses.

Iga kord, kui aktiveerite sisselülitamise, loendatakse LED-id binaarselt vahemikus 0000 kuni 1010 ja seejärel tagasi 0000.

Järgmine joonis näitab ülaltoodud koodiga ühilduvat skeemi. Huvitav on see, et ajastuskondensaator on disaini lisatud. See on kena väike nipp, mille kaudu saate vabalt vältida kondensaatori lisamist juhuks, kui teil pole selle aja jooksul ühtegi.

Siin hakkab mahtuvus mängima ostsillaatori tihvti ja maapinda läbiva hulkuva mahtuvuse kaudu.
Muidugi ei pruugi see tunduda väga arukas viis kondensaatori vältimiseks, kuna hulkuv väärtus võib antud tingimustes erineda.

Veel üks osa, mida vooluringis võib täheldada, on üle lüliti leviv võrk. See väldib häireid mehaanilise vahetamise ajal ja väldib PIC-i segadust, kui ümberlülitamine oli üks või mitu lülitit.




Eelmine: Programmeeritav kahesuunaline mootori taimer Järgmine: kuidas Buck-Boost ahelad töötavad