PIC pamoka - nuo registrų iki pertraukimų

Išbandykite Mūsų Instrumentą, Kaip Pašalinti Problemas





Prieš pradedant smulkias PIC programavimo detales, pirmiausia svarbu išmokti keletą gerų programavimo metodų.

Registrų supratimas

Pirmiausia tarkime, kad bet kurioje programos vietoje įvedate (kabliataškį), kompiliatorius ignoruos visus, atsirandančius po šios kabliataškio, kol, žinoma, vežimėlis grįš į padėtį.



Pirmiau pateikta funkcija leidžia mums pridėti komentarų ar pastabų taip, kad jie netaptų programos dalimi, tačiau palengvina programos atpažinimą šalia pateikiamų komentarų pagalba. Programuojant bet kurį IC, rekomenduojama pateikti komentarus.

Kitas svarbus dalykas kurse yra priskirti vardus įvairioms konstantoms (jas išmoksite vėliau įmantriai). Taip lengviau suprasti, kas rašoma, ar apie susijusias vertes, užuot supainiojus su įtrauktais skaičiais.



Pirmiau minėti dalykai turi būti atliekami kaip tiesioginio atpažinimo vardai, pvz., COUNT. Svarbu pažymėti, kad čia naudojamos visos didžiosios raidės, kad tai būtų aišku, taip pat nurodoma, kad tai yra pastovi vertė.


Kaip matome, aukščiau nurodyta yra padaryta dėžutės, pagamintos iš kabliataškių, pavidalu, todėl jis atrodo švaresnis. Be to, pabandykite dokumentuoti programą ir popieriuje, ši praktika padės suprasti dalykus iš eilės.

2. Registrai.

PIC registras yra sritis, kuri priima rašytinę informaciją ir leidžia ją skaityti. Galite palyginti jį su popieriaus lapu, kuriame galite vizualizuoti turinį ir pridėti, jį perrašydami.

Žemiau pateiktame paveikslėlyje pavaizduotas tipinis registro failų žemėlapis, įterptas į PIC16F84. Formatas nėra kažkas, kas iš tikrųjų nustatoma PIC viduje, jis tiesiog nurodo, kaip bitai gali būti išdėstyti lusto viduje, ir suprasti keletą susijusių komandų.

Matote, kad jis iš esmės yra padalintas į 0 banką ir 1 banką. 1 bankas yra atsakingas už faktinio PIC veikimo kontrolę, pavyzdžiui, jis paskambina PIC, kurie bitai A uoste yra priskirti kaip įėjimai, o kurie - kaip išėjimai.

2 bankas skirtas tik manipuliuoti informacija.

Supraskime tai pateikdami šį pavyzdį:

Tarkime, kad mes norime priskirti vieną bitą „PortA high“. Tam pirmiausia turėtume eiti į 1 banką, kad nustatytumėte nurodytą bitą ar kaištį A prievade išvesties forma. Po to mes grįšime į 0 banką ir pristatysime logiką 1 (1 bitą) į tą konkretų kaištį.

Labiausiai paplitę registrai, kuriuos norėtume naudoti 1 banke, yra STATUS, TRISA ir TRISB.

BŪKLĖ padeda mums grįžti į 0 banką, TRISA leidžia mums pasirinkti, kurie A prievado kaiščiai yra išėjimai ir kurie gali būti įėjimai, o TRISB palengvina pasirinkimą tarp išėjimo ir įvesties kaiščių B prievade. SELECT registras BANK 0 leidžia vartotojui apversti 1 banką.

Apibendrinkime visą sąvoką taip:

BŪKLĖ:

Norėdami pereiti nuo 0 banko prie 1 banko, mes komanduojame STATUS registrą. Tai įgyvendinama nustatant STATUS registro 5 bitą į 1. Norėdami grįžti atgal į 0 banką, STATUS registro 5 bitą priskiriame 0. STATUS registro vieta yra 03h adresas, čia h žymi skaičių gali būti šešioliktainis.

TRISA ir TRISB:

Jie yra atitinkamai 85h ir 86h adresais. Norėdami programuoti kaištį kaip išvestį ar įvestį, mes tiesiog perduodame nulį arba vieną į tam tikrą registro bitą. Dabar tai gali būti padaryta dviem būdais, naudojant dvejetainį arba „Hex“. Jei nepavyksta konvertuoti parametro, jis arba ji gali kreiptis į mokslinį skaičiuoklį, kad būtų galima pritaikyti reikšmes.

Dabar A uoste turime 5 kaiščius, kurie atitinka 5 kaiščius. Jei ketiname pataisyti vieną iš kaiščių kaip įvestį, konkrečiam bitui pateikiame „1“.

Jei norėtume priskirti vieną iš kaiščių kaip išvestį, konkretų kaištį nustatytume į „0“. Bitai yra tikslūs, atitinkantys bitus, arba tiksliau bitai 0 yra RA0, 1 bitai būtų RA1, 2 bitai = RA2 ir pan. Supraskime tai taip:

Tarkime, kad norite ištaisyti RA0, RA3 ir RA4 kaip išvestis, o RA1 / RA2 kaip i / ps, tai padarysite siųsdami 00110 (06h). Patikrinkite, ar 0 bitas yra dešinėje, kaip nurodyta čia:

Uostas A PIN RA4 RA3 RA2 RA1 RA0

Bitų skaičius 4 3 2 1 0

Dvejetainis 0 0 1 1 0

Tas pats pasakytina ir apie TRISB.

PORTA ir PORTB

Norėdami pašalinti vieną iš išvesties kaiščių aukštai, mes tiesiog siūlome „1“ į atitinkamą bitą mūsų PORTA arba PORTB registre. TRISA ir TRISB registrams taip pat gali būti taikoma ta pati procedūra. Prieš pradėdami savo pirmąjį kodavimo pavyzdį, supraskime daugiau kelių registrų kupė, ty: w ir f.

W ir F

W registras yra įprastas registras, leidžiantis priskirti bet kurią pasirinktą vertę. Kai tik priskirsite dydį W, galite tęsti tai pridėdami prie kitos vertės arba tiesiog ją perkeldami. Priskyrus kitą vertę, duomenys paprasčiausiai perrašomi į W.

F registras persiunčia savo rašytinius reikalus registrui. Reikalautume, kad šis „F“ registras priskirtų vertę registrui, gali būti virš STATUSO ar TRISA registrų, nes tai neleis mums jų tiesiogiai perkelti. Programos pavyzdys

Panagrinėkime šį pavyzdinį kodą, kuris parodys, kaip aukščiau nurodyta instrukcija yra įgyvendinta, ir taip pat liudys keletą instrukcijų, esančių kurso metu.

Pradėkime ištaisydami A prievadą, kaip aptarta aukščiau.

Tam turime pereiti nuo 0 banko prie 1 banko, tai daroma sukūrus STATUS registrą, esantį 03h adresu, nuo 5 iki 1 bitų.

BSF 03h, 5

BSF reiškia bitų rinkinį F. Po šios instrukcijos naudojame du skaičius - 03h, kuris yra STATUSO registro adresas, ir skaičių 5, kuris atitinka bitų numerį.

Taigi, tai, ką mes sakome, yra „Nustatyti 5 bitą adresu 03h į 1“.

Dabar esame 1 banke.

MOVLW 00110b

Dvejetainę vertę 00110 (raidė b reiškia, kad skaičius yra dvejetainis) mes įtraukiame į savo bendrosios paskirties registrą W. Aš, žinoma, galėjau tai padaryti šešioliktainiu, tokiu atveju mūsų nurodymas būtų:

MOVLW 06h

Arba veikia. „MOVLW“ reiškia „Perkelti pažodinę vertę į W“, o tai angliškai reiškia reikšmę, kuri seka tiesiogiai, į „W“ registrą.

Dabar norėdami nustatyti uostą, turime įtraukti šią vertę į savo TRISA registrą:

MOVWF 85 val

Šioje instrukcijoje nurodoma „Perkelti W turinį į registrą, kuris seka“, šiuo atveju adresas susijęs su TRISA.

Mūsų TRISA registras šiuo metu turi 00110 pav. Arba pateiktą grafiškai:

Uostas A PIN RA4 RA3 RA2 RA1 RA0

Dvejetainis 0 0 1 1 0

Įvestis / išvestis O O I I O

Taigi dabar mes turime „Port A“ kaiščius, turime grįžti į 0 banką, kad pakoreguotume vieną iš informacijos.

BCF 03h, 5

Šiuo nurodymu atliekama atvirkštinė BSF. Tai reiškia „Bit Clear F“. Pora skaičių, atitinkančių, yra registro adresas, čia - STATUSO registras, taip pat bitų skaičius, šiuo atveju penkių bitų skaičius. Tai, ką tiksliai baigėme šiuo metu, yra apibrėžęs penktą bitą

STATUS registruokitės į 0

Šiuo metu grįžome į 0 banką.
Šis kodas yra visas viename bloke:

BSF 03h, 5 Eikite į 1 banką
MOVLW 06h Įdėkite 00110 į W
MOVWF 85h Perkelkite 00110 į TRISA
BCF 03h, 5 Grįžkite į 0 banką

Pagal paskutinę instrukciją mes patvirtinome jums būdą, kaip nustatyti IO prievado kaiščius PIC, kad juos būtų galima įvestis ar išvestis.

Per šį kursą leiskite man padėti jums siųsti duomenis į uostus.

Duomenų siuntimas į uostus

Kitoje pamokoje mes baigsime mirksėdami šviesos diodą įjungti ir išjungti, kurį sudaro išsami programos informacija ir paprasta grandinės schema, kad galėtumėte pamatyti, kaip PIC atlieka būtent tai, ko mes tikimės.

Nebandykite sujungti ir užprogramuoti savo PIC su žemiau pateiktais rezultatais, nes tai tik iliustracijos. Iš pradžių kaip išvestį sukursime 2 prievadą:

Tai galima atpažinti iš ankstesnių instrukcijų. Vienintelis skirtumas galėtų būti: Mes ištaisėme kiekvieną A kaiščių kaištį, pristatydami 0 val. Į trijų būsenų registrą. Taigi, ką jis dabar turi padaryti, tai įjungti šviesos diodą.

Tai pasiekiame suplanavę vieną iš kaiščių (tą, kurio šviesos diodas yra prijungtas). Kitaip tariant, kaištį pritaikome „1“. Tai atliekama tiksliai taip (laikykitės komentarų, kad paaiškintumėte kiekvieną eilutę):

Todėl tai, ką dabar pasiekėme, yra vieną kartą įjungti ir išjungti šviesos diodą. Mes norime, kad LED nuolat įsijungtų.

Tai pasiekiame įgiję programą, kad galėtume grįžti į pradžią. Tai pasiekiame iš pradžių nustatydami žymą savo programos pradžioje, po to informuodami programą, kad ji tęstųsi ten. Mes žymime žymę gana paprastai.

Mes įveskite terminą, tarkime START, tada įveskite kodą:

Kaip parodyta, iš pradžių minėjome frazę „Pradėti“ iškart programos pradžioje.

Toliau, pačioje programos pabaigoje mes aiškiai paminėjome „goto Start“. „Goto“ instrukcija atlieka tik tai, ką deklaruoja.

Ši programa nuolat įjungia ir išjungia šviesos diodą, kai tik įjungiame grandinę, linkusi išsijungti, kai tik pašalinsime elektrą. Gali būti, kad turėtume dar kartą patikrinti savo programą:

Mes tikrai praleidome komentarus, tačiau vis tiek galime laikytis instrukcijų ir numerių.

Vėliau tai gali būti šiek tiek painu, jei bandysite pašalinti programos triktis ir rašydami kodą įsiminsite visus adresus.

Nors komentarai gali būti dedami vis dar, jie gali šiek tiek sugriūti. Tam reikės įvardinti skaičius ir tai gali būti padaryta atlikus papildomą instrukciją: „equ“ „equ“ instrukcija rodo, kad kai kurie dalykai gali būti lygūs kitoms medžiagoms.

Tai gali būti ne PIC, o surinkėjo instrukcija. Ši instrukcija palengvina vardo priskyrimą registro adreso vietai arba konstantą programavimo terminui.

Mes nustatysime keletą savo programos konstantų ir taip pat paliudysime, kiek tiesmukai ji skaito programą.

Nuo šiol mes nustatėme pastovias vertes, kurias galime atlikti nustatydami jas į savo programą. Prieš jas naudojant reikia nurodyti pastovias vertes.

todėl būtinai visada padėkite juos programos pradžioje. Mes dar kartą perrašysime programą, išskyrus komentarus, kad galėtume palyginti ankstesnį ženklinimą su naujausiu.

Galbūt jūs pastebėsite, kad konstantos leidžia šiek tiek lengviau suprasti programą, tačiau mes vis dar neturime komentarų, tačiau nesijaudinkite, nes mes dar nebaigėme.

Gali būti nedidelis mūsų mirksinčios LED programos trūkumas.
Kiekvienai instrukcijai atlikti reikia 1 laikrodžio sekos. Jei mes naudojame 4MHz kristalą, kiekviena instrukcija reikalauja 1 / 4MHz arba 1uS pabaigos.

Kadangi mes naudojome tik penkias instrukcijas, šviesos diodas įsijungia, tada išjungiamas 5uS. Tai gali būti per greitai, kad žmonės pastebėtų, be to, atrodys, kad šviesos diodas yra visiškai įjungtas.

Tai, ką turėtume pasiekti, yra slopinimas tarp šviesos diodo įjungimo ir šviesos diodo išjungimo. Slopinimo teorija yra ta, kad mes skaičiuojame nuo ankstesnio kiekio, taigi, kai jis pasiekia nulį, mes mesti skaičiavimą.

Nulio reikšmė reiškia vėlavimo išvadą, ir mes dirbame savo procesą visos programos metu. Todėl pirmiausia turime nustatyti konstantą, kurią naudosime kaip skaitiklį.

Pavadinkime šią konstanta COUNT. Po to turime nustatyti, nuo kokio skaičiaus reikia pradėti skaičiuoti. Be abejo, didžiausia figūra, kurią galėtume įtraukti, yra 255 arba FFh šešioliktainėje.

Tai reiškia, kad nesvarbu, kokį kiekį paskirstysime savo COUNT, jis atitiks registro elementus. Jei bandysime nustatyti vertę FFh, suklysime, kai tik sukursime programą.

Priežastis yra vieta FFh, todėl negalime prie jos prieiti. Todėl kaip mes turime nurodyti tikrą skaičių? Be abejo, tam reikės šiek tiek apmąstyti iš šono.

Pavyzdžiui, jei mes paskirsime savo COUNT adresą, pvz., 08h, tai parodys pagrindinį tikslinį registro tikslą. Pagal numatytuosius nustatymus nepaliestos sritys nustatomos kaip FFh. Taigi, jei COUNT rezultatas bus 08h, jūs susidursite su FFh verte, kol mes pirmą kartą įjungsime. Nepaisant to, aš, jūs, kaip mes galime nustatyti COUNT prie kito skaičiaus? Viskas, ką mes taikome, yra tai, kad pirmiausia „perkelsime“ vertinimą į šią paskirties vietą.

Tarkime, tarkime, kad mes norėjome, kad COUNT reikšmė būtų 85h, negalime paminėti COUNT ekvivalento 85h, nes tai yra trejų valstybių registro padėtis A uoste. Būtent tai, ką mes atliekame, yra: Movlw 85h 85h reikšmė W registre movwf 08h

Dabar perkelkite jį į mūsų 08h registrą. Vėliau, jei mes išreiškiame COUNT ekv. 08h, COUNT atitiks 85h vertę. Subtilu, ar ne! Todėl iš pradžių mes nustatome savo konstantą: COUNT ekv. 08h. Turime sumažinti šį skaičių vienu, kol jis taps nulis.

Taip atsitinka, kad egzistuoja viena instrukcija, skirta mums tai padaryti naudojant „goto“ ir žymą.

Nurodymas, kurį mes taikysime, yra toks: DECFSZ COUNT, 1 Šioje instrukcijoje nurodoma: „Dekretuokite registrą (čia tai COUNT) skaičiumi, kuris seka kablelį. Jei pasieksime nulį, šokite į priekį dviem taškais. “Pirmiausia rasime tai veikti, prieš įdėdami į savo kursą.

Tai, ką mes atlikome, iš pradžių nustato mūsų pastovų skaičių nuo COUNT iki 255. Tolesnis segmentas žymi žymą, vadinamą LABEL, netoli mūsų decfsz nurodymo.

Decfsz COUNT, 1 sumažina COUNT reikšmę vienu ir išlaiko galutinį rezultatą tiesiai į COUNT. Be to, jis patikrina, ar COUNT vertė 0.

Jei ne, tai tokiu atveju sukelia programos perkėlimą į kitą eilutę. Dabar mes turime „goto“ deklaraciją, kuri grąžina mus į mūsų decfsz nurodymą.

Jei COUNT reikšmė yra lygi, tada decfsz instrukcijos rezultatas yra tai, kad mūsų programa peršoks 2 vietas į priekį ir bus siunčiama ten, kur mes teigėme „Pereiti čia“.

Todėl, kadangi jūs galite pastebėti, mes parengėme programą, kad prieš tęsdami iš anksto nustatytą laiką sėdėtumėte vienoje vietoje. Tai galima pavadinti vėlavimo kilpa.

Supratimas apie vėlavimo kilpas

Jei mums reikia didesnio delsimo, galime tęsti vieną kilpą kita. Papildomos kilpos, pratęsė vėlavimą. Leiskite mums bent du, darant prielaidą, kad norime stebėti šviesos diodų blykstę. Įdėsime šias vėlavimo kilpas į savo programą ir atliksime tai padarydami tikrą programą pateikdami komentarus:

Šią programą galima sukompiliuoti, po kurios programos PIC. Akivaizdu, kad bandote grandinę patikrinti, ar ji iš tikrųjų veikia. Toliau pateikiama grandinės schema, kurią turėtumėte susikurti iškart užprogramavę PIC.


Gerai padaryta, jūs iš tikrųjų galėtumėte sudaryti savo pirmąją PIC programą, taip pat sukonstruoti grandinę, kad mirksėtų šviesos diodas. Iki šiol, jei baigėte šiuos kursus, galbūt išmokote iš viso septynias instrukcijas iš 35, tačiau, be abejonės, iki šiol galbūt kontroliuojate įvesties / išvesties prievadus!

Ar bandytumėte pakeisti delsos kilpas, kad LED blykstė būtų greitesnė - kokia yra mažiausia COUNT reikšmė, kad iš esmės matytų LED blykstę? Arba galbūt norėsite įtraukti 3-ią ar papildomą vėlinimo kilpą po pradinės, kad stabilizuotumėte šviesos diodą. unikali kiekvienos vėlavimo kilpos konstanta.

Tada galėtumėte iš tikrųjų suvaldyti vėlavimo kilpas, kad LED blyksėtų tam tikru greičiu, pavyzdžiui, po sekundės. Kitoje instrukcijoje pažiūrėkime, kaip mes galime panaudoti tai, kas vadinama paprograme, kad išlaikytume kompaktišką ir pagrindinę programą. Paprogramė yra neatsiejama kodo arba programos dalis, kuri gali būti vadinama ir kada jums to gali prireikti. Potvarkiai naudojami tais atvejais, kai jūs dažnai atliekate tą pačią funkciją.

Kas yra paprogramės

Subrutino naudojimo pranašumai yra tai, kad greičiausiai bus paprasčiau pakeisti vertę patekus į paprogramę, o ne, tarkim, dešimt kartų per visą jūsų programą, taip pat tai labai prisideda prie jūsų programos sunaudojamos atminties lygio sumažinimo programoje. PIC. Mes patikrinsime paprogramę:

Iš pradžių turime nurodyti savo paprogramę ir šioje situacijoje pasirinkome „RUTINE“. Mes po to įveskite kodą, kurį norėtume atlikti kaip įprasta. Štai kodėl mes pasirinkome mirksinčios LED programos vėlavimą. Galiausiai mes užbaigiame paprogramę įvesdami RETURN instrukciją.

Norėdami pradėti paprogramę iš bet kurios mūsų programos vietos, greitai įveskite instrukciją CALL ir paskui paprogramę.

Mes apsvarstysime tai šiek tiek giliau. Kai tik atvyksime į programos skyrių CALL xxx, kuriame xxx yra mūsų paprogramės pavadinimas, programa pereis į bet kurią xxx paprogramės dalį. Nurodymai vykdomi paprogramės viduje.

Kai tik įvykdoma instrukcija RETURN, programa grįžta prie pagrindinės programos prie nurodymo, atlikto po mūsų CALL xxx instrukcijos.

Galima kelis kartus paskambinti panašiu paprogramiu, kaip norėtumėte, o tai paaiškina, kodėl paprogramių naudojimas sutrumpina bendrą mūsų programos trukmę.

Nepaisant to, yra keli veiksniai, kuriuos turėtumėte žinoti. Iš pradžių, kaip ir mūsų pagrindinėje programoje, reikia naudoti bet kurias konkrečias konstantas, kad galėtumėte jomis naudotis.

Tai gali būti patvirtinta pačiame paprogramyje arba tiesiogiai pagrindinės programos pradžioje. Siūlau jums viską pripažinti pagrindinės programos pradžioje, nuo tada pripažįstate, kad viskas yra vienodoje padėtyje. Tada turėtumėte įsitikinti, kad pagrindinė programa praleidžia paprogramę.

Tai, ką turiu omenyje, turėtumėte įdėti paprogramę tiesiai į savo pagrindinės programos pabaigą, išskyrus atvejus, kai naudojate „Goto“ deklaraciją, kad pereitumėte nuo to, kur yra paprogramė, programa tęstų ir įgyvendintų paprogramę, nepaisant to, ar jūs to reikalauti ar kitaip.

PIC neskirtų paprogramės ir pagrindinės programos. Mes patikrinsime savo mirksinčią vedamą programą, tačiau šį kartą vėlavimo ciklui naudosime paprogramę. Idealiu atveju sužinosite, kiek mažiau sudėtinga atrodo programa, taip pat galite sužinoti, kaip paprogramė taikoma praktiškai.

Galų gale galite pastebėti, kad naudodami paprogramę savo uždelsimo ciklui, mes galime sumažinti programos matmenis.

Kiekvieną kartą, kai trokštame vėlavimo, galbūt tada, kai šviesos diodas įsijungia arba išsijungia, vėlavimą iš esmės vadiname paprogramiu. Pasibaigus paprogramei, programa grįžta prie eilutės, vadovaudamasi mūsų 'Skambinimo' instrukcija. Aukščiau pateiktoje iliustracijoje įjungiame šviesos diodą.

Mes po to susisiekiame su paprograme. Tada programa grįžta, kad galėtume išjungti šviesos diodą. Mes dar kartą vadiname paprogramę, tik tuo atveju, jei paprogramė gali būti baigta, programa grįžta, o paskesnė instrukcija, kurią ji atpažįsta, yra „goto Start“. Visiems, kurie gali būti suinteresuoti, mūsų pirmoji programa buvo 120 baitų ilgio.

Naudodami paprogramę galėtume sumažinti savo programos dydį iki 103 baitų. Tai negali skambėti taip fantastiškai, tačiau atsižvelgiant į tai, kad PIC viduje turime tik 1024 baitus, kiekviena nedidelė suma yra naudinga.

Per kitą instrukciją patikrinkime skaitymą iš uostų.

Iki šiol kūrėme A prievadą, kad galėtume įjungti ir išjungti šviesos diodą. Šiuo metu mes pamatysime, kaip skaitysime įvesties / išvesties kaiščius uostuose.

Įvesties / išvesties prievadų skaitymas

Tai yra būtent tai, kad užtikrintume galimybę susieti išorinę grandinę ir paveikti bet kokius jos siūlomus rezultatus.

Jei įsimintumėte iš ankstesnių mūsų kursų, jei norite sukurti įvesties / išvesties prievadus, mums reikėjo pereiti iš 0 banko į 1 banką. Iš pradžių tai atliksime:

Šiuo metu įvesties nustatėme A prievado 0 bitą. dabar turime ištirti, ar kaištis yra aukštas, ar žemas. Norėdami tai pasiekti, galite naudoti tik vieną iš dviejų nurodymų:

BTFSC ir BTFSS.

BTFSC instrukcija reiškia „Atlikite bitų bandymą registre ir mūsų paskirtą bitą.

Jei tai yra 0, tokiu atveju mes praleidžiame paskesnę instrukciją “. BTFSS reiškia „Atlikite bitų bandymą registre ir nustatome bitą. Jei jis nustatytas į 1, tada mes apeiname tolesnę instrukciją.

Kurį iš jų naudojame, lemia tiksliai tai, kaip mes norime, kad mūsų programa reaguotų, kol studijuojame indėlį. Kaip pavyzdį, jei mes tik laukiame, kad įvestis būtų 1, tada galime naudoti BTFSS instrukciją tokiu būdu:

Kodas čia:

„BTFSS PortA“, „0“ Pradėti Pradėkite toliau:
:

Programa tiesiog pereis prie „Carry on here“ su sąlyga, kad „PortA“ 0 bitas yra suplanuotas į 1.

Šiuo metu mes parašysime programą, kuri galėtų paskatinti šviesos diodą vienu greičiu, tačiau, jei jungiklis yra uždarytas, jis mirksi du kartus lėčiau.

Galbūt šią programą galite atlikti patys, vis tiek kažkaip įtraukėme sąrašą.

Galite pabandyti ir sukurti visą programą, kad patikrintumėte, ar supratote principus. Mes naudosime lygiavertę grandinę kaip ir anksčiau, įtraukdami PIC jungiklį, pritvirtintą RA0 ir teigiamą mūsų tiekimo bėgį.

Tai, ką mes čia padarėme, yra įjungti šviesos diodą. Vėliau nustatau, ar jungiklis yra uždarytas.

Jei jis bus ribotas, tada prisijungsiu prie mūsų vėlavimo paprogramės. Tai suteikia mums lygiavertį vėlavimą kaip ir anksčiau, tačiau šiuo metu su juo susisiekiame du kartus.

Tas pats pasakytina ir tada, kai šviesos diodas nedega. Jei jungiklis nėra uždarytas, mes įrašome ankstesnius įjungimo ir išjungimo laikotarpius.

Ar laikėtės šių pamokų nuo pat pradžių, galbūt norėsite suprasti, kad šiuo metu atradote dešimt iš 35 PIC 16F84 instrukcijų! Kiekvieną jų išmokstama tik įjungiant ir išjungiant šviesos diodą.

Iki šiol mes sukūrėme tai, kad PIC mirksi šviesos diodu.

Vėliau mes galėjome su savo PIC, įtraukdami jungiklį, todėl keisdami blykstės greitį.

Efektyvus atminties vietos naudojimas

Vienintelis klausimas yra tai, kad programa yra gana ilga ir gana neefektyvi atminties. Atrodė gerai, kai pirmą kartą įtraukiau komandas, tačiau turėtų būti lengvesnis jų vykdymo būdas. Teigiamai mes analizuosime, kaip pažodžiui įjungėme ir išjungėme šviesos diodą.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Iš pradžių mes užpildėme savo registrą 02h, po to perkėlėme jį į mūsų PortA registrą, kad įjungtume šviesos diodą. Norėdami jį išjungti, mes pakavome w su 00h, o tada perkėlėme jį į mūsų „PortA“ registrą.

Tarp visų šių įpročių mes buvome priversti susisiekti su paprogramiu, kad galėtume stebėti, kaip mirksi šviesos diodas.

Todėl porą kartų turėjome persiųsti du informacijos rinkinius (vieną kartą į „w“ registrą, tada į „PORTA“), taip pat du kartus paskambinti paprogramei (vieną kartą įjungti, tada vieną išjungti). Taigi, kaip mes galėtume tai pasiekti pridėtiniu efektyvumu? Labai paprasta.

Mes naudojame kitą instrukciją, žinomą kaip XORF. XORF instrukcija veikia Išskirtinė ARBA funkcija registre, kurią nurodome kartu su mūsų teikiama informacija. Manau, kad turiu paaiškinti, kas pasaulyje yra išskirtinis ARBA, prieš tęsdami. Jei turime du įėjimus ir vieną išėjimą, įvestis gali būti tik 1, jei abu įėjimai skiriasi. Nors jie yra vienodi, išvestis greičiausiai bus 0. Toliau pateikiama tiesos lentelė asmenims, nusprendusiems tai patikrinti:

A B F0 0 00 1 11 0 11 1 0

Šiuo metu mes patikrinsime, kas vyksta, jei mes padarysime B, kaip ir ankstesnę išvestį, ir tiesiog pakeisime A vertę:

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

Jei išlaikysime A reikšmę, kaip ir 1, ir mes išskirsime ARBA ją su išvestimi, išvestis pasikeis. Jei to nepastebite iš tiesos lentelės, žemiau tai galima pamatyti naudojant dvejetainį:

0 Dabartinis išėjimas
EX-ARBA su 1 1 nauja išvestimi
EX-ARBA su 1 0 naujų rezultatų

Gal galite sužinoti, kad išimdami OR išvestį su 1, mes dabar pakeisime išvestį nuo 0 iki 1 į 0.
Taigi, norint įjungti ir išjungti mūsų šviesos diodą, mums reikia tik kelių sakinių:

MOVLW 02h
XORWF DURYS, 1

Tai, ką tiksliai pasieksime, yra pridėti savo w registrą su 02h. Tokiu atveju mes esame išskirtiniai ARBA užsisakydami šį numerį, nesvarbu, kas yra mūsų „PortA“. Jei 1 bitas yra 1, jis pasikeis į 0. Jei 1 bitas yra 0, jis pasikeis į 1. Panagrinėkime šį kodą vieną ar du kartus, norėdami parodyti, kaip jis veikia dvejetainis:

DURYS
00010
„xorwf 00000“
xorwf 00010
„xorwf 00000“
xorwf 00010

Iš tikrųjų nereikia kiekvieną kartą įkelti vienodos vertės į savo „w“ registrą, todėl tai įmanoma atlikti vieną kartą pradžioje ir paprasčiausiai grįžti prie perjungimo komandos. Be to, neturime nustatyti vertės „PortA“ registre. Priežastis? Be abejo, kadangi įjungus maitinimą jis yra 1, galime jį lengvai perjungti. Aš, arba 0 įjungimo įjungimo, mes net dabar jį pakeistume.

Todėl norėtumėte pamatyti mūsų naujai suformuotą kodą. Pirmasis rodo mūsų mirksintį LED kodą, o antrasis rodo tą, kuriame yra jungiklis:

Norime, kad pamatytumėte, jog paprasčiausiai pasinaudoję viena lengva instrukcija mes sumažinome savo programos mastą. Tiesa, norėdami parodyti, kiek mes galėtume sumažinti savo programas, mes parodėme dvi programas, tik tai, kas buvo sudaryta, ir jų matmenis žemiau esančioje lentelėje:

Programos keitiklio matmenys (baitai)
Mirksintis LED originalus 120
Mirksintis LED paprogramė pridėta 103
Mirksinti LED XOR funkcija naudojama 91
LED su jungikliu Originalus 132
LED su jungikliu XOR funkcija naudojama 124.

Todėl ne tik atradome keletą naujų instrukcijų, bet, be abejo, sumažinome scenarijų dydį!

Toliau mes analizuosime, kaip jūs galite judėti atskirais bitais, atlikti tam tikrą nesudėtingą aritmetiką, taip pat duomenų lenteles.

Loginiai vadybininkai

Paskutinėje pamokoje pristatiau operaciją „Išskirtinis ARBA“. ExOR funkcija suprantama kaip loginis operatorius.

Šioje pamokoje sužinosiu papildomus loginius operatorius, kuriuos reklamuoja PIC. Taškinėse programose nebus jokių atvejų, tačiau mes išmoksime paprastų operatorių naudojimo metodų, taikydami mažus kodo plotus.

AND funkcija AND iš esmės analizuoja du bitus ir pateikia 1, ar jie yra vienodi, ir 0, jei jie yra skiriamieji. Pavyzdžiui, jei paminėtume 1 IR 1, rezultatas būtų 1, o tuo atveju, jei deklaruotume 1 IR 0, pasekmė būtų 0.

Nereikia nė sakyti, kad mes taip pat galime įvertinti žodžius, taip pat visa AND funkcija, kurią atlieka po truputį, peržiūri abu terminus. Žemiau pateiktas pavyzdys parodo, kaip du 8 bitų žodžiai tampa ANDed kartu su produktu:

11001011
IR 10110011
Lygus 10000011

Tikiuosi, kad sutinkate, rezultatas tiesiog turės 1, kai 2 1s susikibs vienas su kitu poroje žodžių. Mes galime naudoti AND funkciją, pavyzdžiui, patikrinti uostus.

Jei tikriname keletą įvesties / išvesties kaiščių, susietų su grandine, turėtume stebėti tam tikrą situaciją, kai tik keli iš kaiščių yra aukšti, tokiu atveju mes galime beveik perskaityti uostas, po kurio IR rezultatas su sąlyga, kurią mes nagrinėjome, tapatus aukščiau nurodytam atvejui.

PIC pateikia du IR komponentus.
Jie yra ANDLW ir ANDWF. ANDLW leidžia mums atlikti AND funkciją su W registro duomenimis ir suma, kurią mes nurodome.

Sintaksė yra: ANDLW, kurioje yra būtent tai, ko mes einame, ir W turinys.

AND funkcijos pasekmė būtų įrašyta tiesiai į W registrą.
ANDWF leidžia mums atlikti AND funkciją W registre ir kitame registre, pavyzdžiui, UOSTAS. Sintaksė yra: ANDWF, d, kuriame yra registras, kuriuo esame entuziastingi, pvz. PORTA, o d parodo PIC, kur turėtumėte nustatyti rezultatą. Jei d = 0, rezultatas įrašomas į W registrą, o iš d = 1 galutinis rezultatas įrašomas į mūsų nurodytą registrą. Dvi žemiau pateiktos kodo dalys rodo gerą kiekvienos AND funkcijos pavyzdį.

Inicialas nagrinėja PORTA būseną, kurioje turime patikrinti, ar įvestys yra 1100. Rezultatą galime grąžinti atgal į W registrą.

„movlw 1100“
Antroji iliustracija dabar gali patikrinti W registro turinį:
ANDLW 1100

ARBA

Mes jau atradome vieną ARBA funkciją, tiksliau XOR. Tai išsivysto į 1, jei du bitai nėra vienodi, bet skiriasi. Galite rasti kitą ARBA funkciją, vadinamą IOR, tai yra imtinai OR. Ši funkcija sugeneruos 1, jei bet kuris bitas yra 1, bet papildomai, jei kiekvienas bitas yra 1. Žemiau pateikiama aiški tiesos lentelė, iliustruojanti tai:

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

Kas yra aritmetiniai operatoriai

PAPILDYTI

Ši funkcija atlieka tai, ko paprastai reikalauja. Tai duoda dvi figūras! Jei dviejų skaičių pridėjimo pasekmė viršija 8 bitus, tokiu atveju tikriausiai bus nustatyta „CARRY“ vėliava. „CARRY“ vėliava yra adresu 03h bit 0.

Kai šis bitas yra suplanuotas, tada du skaičiai viršijo 8 bitus. Kai jis yra 0, tokiu atveju pasekmė yra per 8 bitus. Kaip ir anksčiau, PIC pateikia mums du ADD stilius, konkrečiai ADDLW ir ADDWF. Kaip galėjote manyti, tai panašu į pirmiau pateiktą funkciją. ADDLW siūlo W registro turinį tam, kurį mes nurodome. Sintaksė yra tokia: ADDLW ADDWF pridėkite W registro ir kai kurių kitų mūsų paskirtų registrų turinį.

Sintaksė yra: ADDWF, d yra kur

SUB

Šiuo metu, manau, jūs negalite numanyti, ką ši funkcija atlieka! Iš tiesų, jūs įtarėte tai, šią funkciją
atima vieną bitą iš kito. Vėlgi, PIC suteikia mums 2 skonius: SUBLW ir SUBWF. Sintaksė yra tiksliai panaši į funkciją ADD, išskyrus akivaizdų, kad vietoj ADD įrašote SUB!

Padidėjimas Jei norėtume į PIC įtraukti 1 skaičių, galėtume visiškai pasinaudoti funkcija ADD ir naudoti skaičių vienas. ~ Sunkumas yra tas, kad pirmiausia turime įdėti figūrą į W registrą, vėliau naudoti ADDLW 1 valdiklį jai padidinti. Jei mes norėtume įtraukti 1 į registrą, tai gali būti dar blogiau. Pirmiausia turime įrašyti skaičių 1 į W registrą, po to naudokite ADDWF, 1. Taigi, pavyzdžiui, norėdami įtraukti 1 į 0C vietą, tarkime, turėtume turėti šią scenarijaus dalį:

movlw 01
addwf 0c, 1

Yra lengvesnis būdas tai atlikti. Mes galime vykdyti komandą INCF. Sintaksė yra tokia: INCF, d kur yra registras arba vieta, kuri mums rūpi, ir d rodo PIC, kur turėtumėte išdėstyti rezultatą. Jei d = 0, rezultatas yra W registre, o jei d = 1, pasekmė nustatoma mūsų nurodytame registre.

Naudodami šią individualią instrukciją, mes galime iš tikrųjų penkiasdešimt procentų kodavimo. Jei norėtume, kad rezultatas būtų atkurtas W registre, tokiu atveju panaudojant aukščiau pateiktą pavyzdį, galbūt reikėjo įtraukti papildomą komandą, kad 0C elementai būtų perkelti atgal į W registrą, o po to 0C registrą grąžinkite į ne kokia ji buvo.

Yra prieaugio komanda. Tai INCFSZ. Ši komanda gali padidinti registrą, kurį mes nustatėme, tačiau jei registras bus lygus 0 po prieaugio (tai įvyks, kai mes įtrauksime nuo 1 iki 127), po to PIC tikriausiai perduos tolesnę instrukciją. Žemiau nurodyta kodo dalis tai atspindi:

Kilpa incfsz 0C
Eiti į kilpą
:
:
Likusi programos dalis.

Pirmiau pateiktoje kodo dalyje 0C bus padidintas 1. Toliau mes turime instrukciją, kurioje informuojama PIC grįžti į mūsų žymą, pavadintą Loop, ir vėl padidinti 0C 1. Tai tęsiasi tol, kol 0C bus lygus 127. Šiomis aplinkybėmis, kai padidinsime 0C 1, 0C dabar atitiks 0. Mūsų INCFSZ instrukcija galėtų labai gerai informuoti PIC, kad ji praleistų paskesnę instrukciją, kuri šiuo atveju yra goto deklaracija, taigi PIC eis į priekį su likusia programa.

Sumažėjimas

Mes jau aptarėme mažinimo funkciją ankstesniuose mokymuose, todėl daugiau jos nebetaisysiu.

Papildyti

Paskutinis šios diskusijos nurodymas pakeis kiekvieną mūsų nurodytą registro bitą. Sintaksė yra: COMF, d kur

Bitų operacijų supratimas

Tai galėtų būti panaudota, pavyzdžiui, norint greitai pakeisti uosto kaiščius iš išvesties į įvestį ir pan. Bitų funkcijos leidžia mums suformuoti vieną bitą išraiškoje. Jie leidžia mums tęsti, nustatyti ir atsikratyti atskirų bitų registruose ar numeriuose, kuriuos mes nurodome.

Baigę šį kursą, mes atskleisime programą, skirtą sukurti eilės žibintų rinkinį, kuris eina į priekį, tada atvirkščiai. Mes pastebėjome, kad tai įvykdyta anksčiau, kai ištyrėme išskirtinę OR funkciją, kurioje mes išimtinai nukreipėme uostus su išraiška. Iki šiol pastebėjome keletą bitų funkcijų, kai nustatėme PIC uostus, ir

Leiskite man pakartoti jų naudojimą čia.

BCF

Ši instrukcija šiek tiek ištrins, ką mes nurodysime savo paskirtame registre. Sintaksė
yra:
BCF,

Mes tai panaudojome anksčiau, kad pakeistume nuo 1 iki 0 puslapio, pašalindami truputį iš STATUS registro. Mes taip pat galime tai naudoti norėdami šiek tiek pataisyti 0 bet kuriame kitame registre / vietoje. Pavyzdžiui, jei mes norėtume nustatyti 3 bitą 11001101, išsaugotą 0C skyriuje, į 0, mes galime tai padaryti
Įdėti:

BCF 0C, 03

BSF

Ši instrukcija atitiks bet kurį nurodytą bitą iki 1 bet kuriame mūsų nurodytame registre. Mes tai panaudojome anksčiau, norėdami pereiti nuo 0 iki 1 puslapio. Sintaksė yra: BSF ,, ir naudojama tiksliai tokiu pačiu metodu, kaip ir aukščiau pateiktas BCF.

BTFSCU Iki šiol galėtume nustatyti ar išvalyti šiek tiek registre. Tačiau įsivaizduokite, ar mums iš esmės reikia patikrinti, ar bitai registre yra 1 ar 0?

Žinoma, galima naudoti BTFSC. Jame nurodoma „Bit Test Register F“ ir praleisti, jei aišku. Šioje instrukcijoje bus analizuojamas bitas, kurį nurodome registre. Jei bitas yra 0, instrukcija informuos PIC, kad išlaikytų tolesnę instrukciją.

Šią instrukciją galime panaudoti tuo atveju, jei norėtume patikrinti vėliavą, pavyzdžiui, nešiojimo vėliavą. Tai padeda mums perskaityti STATUS registrą ir ieškoti atskirų bitų, kad sužinotume, kurios vėliavos yra fiksuotos. 29 Pavyzdžiui, jei mes norėtume patikrinti, ar „Carry“ vėliava nustatyta į 1, kai mes pridėjome 2 skaičius, tada galėtume įvesti:

BTFSC 03h, 0
tęskite čia, jei nustatyta į 1
arba čia, jei nustatyta į 0

Jei bitų būsena yra 1, tokiu atveju po BTFSC nurodyta instrukcija būtų baigta. Jei jis nustatytas į 0, tada kita instrukcija praleidžiama. Toliau nurodyta kodo dalis, kurioje jis gali būti naudojamas:

Kilpa:
:
:
BTFSC 03,0
Eiti į kilpą

Ankstesniame kode PIC paprasčiausiai išeis iš kilpos, jei STATUSO registro 0 bitas (arba „Carry“ vėliava) bus apibrėžtas į 0. Arba kitaip bus vykdoma komanda „goto“.

BTFSS

Šioje instrukcijoje nurodoma „Bit Test Register F“ ir „Praleisti, jei nustatyta“. Tai gali būti palyginama su BTFSC instrukcija, išskyrus tai, kad PIC praleistų paskesnę instrukciją, jei mūsų vertinamas bitas būtų nustatytas 1, o ne 0.

CLRF

Ši instrukcija nustatys visą registro informaciją iki 0. Sintaksė yra:

CLRF
Mes tai panaudojome anksčiau, norėdami nustatyti uostų išvestį į 0, taikydami CLRF 85h. Be to, mes jį panaudojome, kad sutvarkytume uostus, kad į juos būtų įtraukti visi kaiščiai naudojant CLRF
05h.

CLRW

Tai gali būti panaši į CLRF instrukciją, išskyrus W registro išvalymą. Sintaksė yra gana paprasta:

CLRW

RLF ir RRF

Šios kryptys šiek tiek perkelia registrą į vieną lizdą į kairę (RLF) arba į dešinę (RRF). Pvz., Jei mums reikėjo 00000001 ir mes naudojome RLF, tokiu atveju mes galėtume turėti 00000010. Kas tada vyksta, jei yra 10000000 ir pritaikėme RLF nurodymą? Žinoma, 1 būtų pastatytas nešiojimo vėliavoje. Jei mes dar kartą pritaikytume RLF instrukciją, 1 vėl pasirodytų pradžioje. Panašiai, tačiau priešingai, vyksta RRF nurodymas. Žemiau pateiktas atvejis tai parodo RLF instrukcijai, kurioje mes galime pamatyti 8 registro bitus ir nešimo vėliavą:

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

Programos pavyzdys

Dabar pamatysime kodo pavyzdį, kurį galima sukompiliuoti ir valdyti. Tai sukurtų sekos šviesą, prasidedančią nuo „PortA“ 0 bitų, pereinant prie „PortB“ 8 ir 8 bitų
paskui grįžęs.
Prijunkite šviesos diodus prie kiekvieno iš prievado kaiščių. Mes turėsime šiek tiek
šioje pamokoje nurodytos procedūros.

TIME EQU 9FH Kintamas vėlavimo kilpai.
PORTB EQU 06H B prievado adresas.
TRISB EQU 86H B prievado Tristate adresas.
PORTA EQU 05H Uostas A adresas.
TRISA EQU 85H uostas A Tristate adresas.
STATUS EQU 03H Puslapio pasirinkimo registras.
COUNT1 EQU 0CH kilpų registras.
COUNT2 EQU 0DH kilpų registras.

BSF STATUSAS, 5 Eikite į 1 puslapį
MOVLW 00H ir nustatykite
MOVWF TRISB A ir B uostai
MOVLW 00H į išvestį,
Tada grįžkite į MOVWF TRISA
BCF STATUSAS, 5 puslapis 0.
„MOVLW 00H Clear Port A“.
MOVWF DURYS

Pagrindinės programos pradžia

RUNMOVLW
01H Nustatykite pirmąjį bitąMOVWF
PORTB uoste B.CALL
VĖLAVIMAS Palaukite šiek tiekKVIETIMAS
DELSIMAS
Perkelkite bitą B prievade kairėn, tada pristabdykite .RLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1CALL
VĖLAVIMAS
DELAYRLF
PORTB, 1 Tai perkelia antgalį į nešimo vėliavą
Dabar pereikite į A prievadą ir perkelkite šiek tiek kairę
PORTA, 1 Tai perkelia bitą nuo nulio žymos į PortACALL
DELAYCALL DELAYRLF
DURYS, 1 SKAMBINIMAS
VĖLAVIMAS
DELAYRLF
DURYS, 1 SKAMBINIMAS
VĖLAVIMAS
DELAYRLF
DURYS, 1 SKAMBINIMAS
VĖLAVIMAS
DELSIMAS
Perkelkite bitą atgal į „ARRF Port“
DURYS, 1 SKAMBINIMAS
VĖLAVIMAS
DELĖJIMAS
DURYS, 1 SKAMBINIMAS
VĖLAVIMAS
DELĖJIMAS
DURYS, 1 SKAMBINIMAS
VĖLAVIMAS
DELĖJIMAS
PORTA, 1 Tai perkelia bitą į nulinę vėliavą. Dabar perkelkite antgalį
atgal į BRRF uostą
PORTB, 1CALL
VĖLAVIMAS
DELĖJIMAS
PORTB, 1CALL
VĖLAVIMAS
DELĖJIMAS
PORTB, 1CALL
VĖLAVIMAS
DELĖJIMAS
PORTB, 1CALL
ATIDELTI SKAMBINIMĄ
PORTB, 1CALL
VĖLAVIMAS
DELĖJIMAS
PORTB, 1CALL
VĖLAVIMAS
DELĖJIMAS
PORTB, 1CALL
VĖLAVIMAS
DELĖJIMAS Dabar mes grįžome ten, kur pradėjome, GOTO
PABĖDĖK vėl eikime.

Mokymų rinkinyje yra puiki galimybė, leidžianti naudoti duomenų lentelę.

Duomenų lentelė yra tik duomenų citatų sąrašas, kuriame viskas apžvelgiama remiantis keletu aplinkybių.
Pavyzdžiui, galite turėti grandinę, naudojančią PIC, kuris skaičiuoja atvejų, kai įvesties kaištis tampa didelis per 1 sekundę. Po to numerį galite parodyti 7 segmentų ekrane.

Kai tik laikas prasideda, PIC pradeda skaičiuoti, kiek kartų kaištis eina aukštai. Po 1 sekundės jis apsilanko lentelėje ir pažvelgia į duomenis, ekrane turi parodyti skaičių, simbolizuojantį kaiščių aukštą padėtį. Tai gali būti naudinga, nes mes nenustatome, koks gali būti skaičius, kol PIC neatliks savo įvertinimo.

Naudodamiesi lentele, mes galime leisti PIC nustatyti, kurią figūrą pavaizduoti. Šiuo metu, prieš jums toliau rodant, kaip veikia duomenų lentelė, gali tekti jums pasakyti, kad PIC palaiko programos buvimo vietą, kol ji veikia.

Tai palengvina tuos, kurie atliko tam tikrą programavimą BASIC. Priešingu atveju nesijaudinkite, galbūt norėsite ir toliau mokytis apie teoriją. Įsivaizduokite, kad yra BASIC programa, panaši į pateiktą žemiau:

10 METŲ K = 0
11 K = K + 1
12 JEI K> 10 TAD GOTO 20 KITA GOTO 11
20 SPAUSDINK K
21 PABAIGA

Programa prasideda 10 eilutėje. Kai tik numatoma, kad K bus 0, ji pereis į 11 eilutę. Įtraukę 1 į K, po to einame į 12 eilutę.

Šiuo metu mums gali būti įdomu, ar K yra didesnis nei 10. Jei taip, mes einame toliau į 20 eilutę, arba grįžtame prie 11 eilutės.

20 eilutėje dokumentuojama K, o 21 eilutėje užbaigiama programa. „BASIC“ naudoja tiesioginę statistiką, kad programuotojas galėtų lengviau registruoti problemas, nes etiketės nėra įgaliotos. PIC naudoja etiketes, kad galėtų pabėgti tarp paskirties vietų - ar tikrai gali?

Mes naudojame etiketes tam, kad žinotume, kur yra problemos, ir kad galėtume paprastu būdu informuoti PIC, kur ieškoti.

Būtent PIC naudojasi vidinių linijų skaitikliu, vadinamu Programos skaitikliu. Programos skaitiklis (sutrumpintas kaip PC) atminties paskirties vieta, kur yra ši instrukcija.

Kai informuojame PIC, kad jis apsilankytų pasirinktoje etiketėje, jis supranta atminties vietą ir todėl padidina kompiuterį, kol pamato tą atminties vietą. Tai tiksliai tas pats metodas, kaip mes patikriname aukščiau pateiktą programą BASIC. Žemiau yra kodo segmentas, kuriame yra atminties vietos arba kompiuterio elementai, šalia kiekvienos instrukcijos:

Kompiuterio instrukcija0000 movlw 03
0001 movwf 0C
0002 kilpa decfsc 0C
0003 goto kilpa
0004 pabaiga

Aukščiau pateiktoje demonstracijoje mes nustatėme kompiuterį į 0000. Čia yra instrukcija „movlw 03“. Kai PIC įdiegia šiuos duomenis, jis didina kompiuterį, kad būtų nuskaityta paskesnė instrukcija. Šiuo metu PIC rodo movwf 0C. Kompiuteris vėl didinamas.

Dabar PIC tyrimai decfsc 0C. Tuo atveju, kai 0C duomenys nėra 0, tokiu atveju kompiuteris padidinamas 1, taip pat tokia instrukcija „goto Loop“ informuoja kompiuterį grįžti į 0003 poziciją, kuri yra minėta kilpa. Jei 0C duomenys yra 0, tada asmeniniam kompiuteriui patariama didinti 2, tiesiog praleiskite tolesnę instrukciją.

Duomenų lentelių supratimas

Tai padaro kompiuterį 0004 padėtyje, kur programa baigiama. Paskirties vietas nustato surinkėjas, ir mums paprastai neturėtų rūpėti, ką pasiekia kompiuteris. Iki tol mes suprantame, kad reikia jį kontroliuoti taip pat, kaip ir naudojant duomenų lenteles. Patogiausias būdas apibūdinti duomenų lentelės veikimą yra pradėti nuo iliustracijos.

PC equ 02
movlw 03
skambučių lentelė
:
stalo priedas PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
07
grįžti

Pradinė instrukcija skiria etiketę PC su programos skaitiklio adresu (02h). Netrukus įvesime 03h reikšmę į w registrą. Mes po to bendraujame prie stalo. Pagrindinė paprogramių lentelės eilutė padidina W registro duomenis (03h) prie programos skaitiklio.

Tai paskatina programos skaitiklį pakelti 3 arba, kitaip tariant, skatina programos skaitiklį eiti žemyn 3 eilutėmis. Kol skaitiklis pasiekia 3 eilutes žemyn, PIC atpažįsta komandą retlw. Ši komanda siunčia ją sekančią vertę į W registrą, o po to grįžta iš paprogramės. RETLW iš esmės reiškia grįžimą, pažodinį W.

Žr. Padėjau kablelį po žodžio „Grįžti“. Kadangi mes esame paprogramėje, mums reikia grąžinimo nurodymo, kad į jį patektų. Todėl RET instrukcijoje. Po RETLW instrukcija yra skaičius, ir tai yra būtent tai, kas įtraukta į W registrą.

Šiuo atveju tai yra 3 paveikslas. Mes galime nurodyti bet kokį kiekį W registrui, jei lentelės paprogramėje šis skaičius derinamas su Programos skaitikliu, mes atrasime retlw instrukciją. Ankstesnėje iliustracijoje tai reiškia, kad mes galime turėti bet kokį skaičių nuo 1 iki 7. Jei pereisime per paprogramę, galbūt galėsime atlikti papildomą programos skyrių. Dėl šios priežasties duomenų lentelę įdėti tiksliai į PIC programos pabaigą paprastai yra protingas žingsnis, todėl jei tokiu atveju viršysime, mes vis tiek pasieksime programos išvadą.

Pertraukimų tema gali būti ilgiausia ir sunkiausia.

Negalite rasti jokio nesudėtingo pertraukimų detalizavimo būdo, tačiau šiek tiek pasisekus šios dalies pabaigoje galite pritaikyti pertraukas į savo programas.
Skirstėme skyrių į 2 etapus. Tai reiškia, kad norite atskirti temą į skyrius, taip pat suteikti jums patogią funkciją, kad galėtumėte lengvai suprasti.

Kas iš tikrųjų yra pertraukimas? Be abejo, kaip rodo terminas, pertraukimas yra technika arba signalas, kuris neleidžia mikroprocesoriui / mikrovaldikliui atlikti bet kokio dalyko, kad galėtų atsitikti kažkas kitoks.

Leiskite man kasdien pateikti iliustraciją. Pagalvokite, kad atsipalaiduojate savo namuose, kalbate su kitu žmogumi. Staiga nuskamba telefonas.

Baigiate kalbėti ir griebiate telefoną, kad pakalbėtumėte su skambinančiuoju. Užmezgę pokalbį telefonu, nusprendžiate grįžti prie pokalbio su asmeniu, kol telefonas dar neskambėjo. Galima apsvarstyti pagrindinę kasdienybę, kol kalbatės su kuo nors, telefono skambėjimas sutrikdo jūsų pokalbį, o rutinos pertrauka yra būdas kalbėti telefonu.

Nors pokalbis telefonu baigiasi, grįžkite prie savo pagrindinės pokalbių tvarkos. Ši iliustracija tiksliai nurodo procesoriaus veiksmus.

Pagrindinė programa veikia, vykdydama tam tikrą grandinės funkciją, tačiau įvykus pertraukai, pagrindinė programa sustoja, kol atliekama kita rutina. rutina baigiasi, procesorius grįžta prie pirminės rutinos, kaip ir anksčiau.

Suprasti pertraukimus

PIC turi 4 pertraukimo šaltinius. Juos buvo galima suskirstyti į porą grupių. Du yra pertraukimų šaltiniai, kurie gali būti naudojami išorėje PIC, o kiti du yra vidiniai procesai. Leiskite man čia patikslinti du išorinius tipus. Kiti du bus aprašyti skirtingose ​​mokymo programose, kai pasieksime laikmačius ir kaupsime duomenis.

Jei patikrinsite PIC kištuką, pastebėsite, kad 6 kaištis yra RB0 / INT. Šiuo metu RB0 yra aiškiai B prievado bitai 0. INT reiškia, kad jis taip pat gali būti sukonfigūruotas kaip išorinis pertraukimo kaištis. Be to, B prievado kaiščiai nuo 4 iki 7 (kaiščiai nuo 10 iki 13) taip pat gali būti naudojami pertraukimams. Kad galėtume panaudoti INT ar kitą „Port B“ kaiščius, turime atlikti dvi užduotis. Pirmiausia turime informuoti PIC, kad naudosime pertraukas.

Tada turime nurodyti, kurį B prievado kaištį naudosime kaip pertraukimą, o ne kaip įvesties / išvesties kaištį. PIC viduje galite rasti registrą, vadinamą INTCON, kuris yra adresu 0Bh. Šiame registre rasite 8 bitus, kurie gali būti įjungti arba išjungti. INTCON 7 bitas yra žinomas kaip GIE. Tai yra „Global Interrngupt Enable“. Pataisius tai į 1, PIC informuojama, kad mes taikysime pertrauką.

INTCON 4 bitas yra žinomas kaip INTE, „Interrupt Enable“. Įvedus šį bitą į 1, PIC praneša, kad RB0 bus pertraukimo kaištis. Konfigūruojant 3 bitą, vadinamą RBIE, PIc informuojama, kad naudosime B prievado 4–7 bitus. Šiuo metu PIC supranta, kada šis kaištis gali būti aukštas ar žemas, turi sustabdyti tai, ką jis atlieka, ir tęsti pertraukimą rutina. Šiuo metu mes privalome informuoti PIC, ar pertraukimas greičiausiai bus signalo transformacijoje, kylančioje (nuo 0 V iki + 5 V), ar nuo kritimo krašto (nuo + 5 V iki 0 V).

Paprasčiau tariant, ar mes norėtume, kad PIC pertrauktų kiekvieną kartą, kai signalas pereina iš žemos į aukštą, arba iš aukšto į žemą. Nusikalstant, tai gali būti nustatyta, kad ji būtų padėta ant kylančio krašto.

Krašto „suveikimas“ suplanuotas papildomame registre, vadinamame OPTION registru, adresu 81h. Bitumas, dėl kurio esame entuziastingi, yra 6 bitas, dažnai vadinamas INTEDG.

Nustačius šią reikšmę į 1, PIC trikdo montavimo kraštą (numatytoji būsena), o nustatant jį į 0, PIC stimuliuojamas trikdyti slankiuoju kraštu. Jei norėtumėte, kad PIC suaktyvėtų kylančiame krašte, jums tikrai nereikia nieko daryti šiam truputiui.

Šiuo metu, deja, opcionų registras yra 1 banke, tai reiškia, kad mums patinka keisti nuo 0 banko iki 1 banko, nustatyti bitą „Opcionų“ registre, po to, kai grįšite į 0 banką. Čia svarbiausia atlikti kiekvieną bitą 1 banko registruojasi vienu streiku, pvz., nustato uosto kaiščius, po to grįš į 0 banką, jei baigsite.

Puiku, todėl mes pranešėme PIC, kuris kontaktas greičiausiai bus pertraukimas ir kur suveikti, kas vyksta programoje ir PIC bet kuriuo metu, kai įvyksta pertraukimas? Vyksta pora daiktų. Pirmiausia numatyta „vėliava“.

Tai informuoja vidinį IPS procesorių, kad įvyko pertraukimas. Toliau programos skaitiklis (apie kurį kalbėjau ankstesnėje pamokoje) pateikia patarimus konkrečiu PIC adresu. Greitai patikrinkime visa tai atskirai. Pertraukimo žymė Mūsų INTCON registre 1 bitas yra pertraukimo vėliava, vadinama INTF. Šiuo metu, kai tik atsiras pertrauka, ši vėliava greičiausiai bus nustatyta į 1.

Kai nėra pertraukos, vėliava dedama į 0. Taip pat beveik viskas pasiekiama. Šiuo metu galite svarstyti „kokia prasmė?“ Žinoma, net jei ši vėliava suplanuota iki 1, PIC negali ir nereaguos į kitą pertraukimą. Todėl išreikškime, kad įvykdome pertrauką. Vėliava greičiausiai bus nustatyta į 1, o PIC gali pereiti prie mūsų įprasto darbo dėl pertraukimo.

Kai ši vėliava nebuvo nustatyta į 1, o PIC buvo leista toliau atsakyti į pertraukimą, tada nuolat impulsuodamas kaištį, PIC galėjo grįžti į mūsų pertraukimo rutinos pradžią ir jokiu būdu neužbaigti jos. Grįžtant prie mano telefono iliustracijos, tai panašu į telefono pakėlimą ir iškart pradėjus jį aptarti vėl ima skambėti, nes kitas asmuo nori su tavimi kalbėti.

Patartina užbaigti vieną dialogą, tada dar kartą paimti telefoną, kad galėtumėte kalbėtis su paskesniu asmeniu. Su šia vėliava galite rasti nedidelę problemą. Nors PIC greitai nustato šią žymę į 1, ji nenustato jos vėl 0! Ta veikla turi užsiimti programuotojas - t. Y. Jūs. Tai galima padaryti be jokių pastangų, nes esu tikras, kad manau, ir tai reikia pasiekti, kai PIC atliks pertraukimo procedūrą.

Atminties vieta Kiekvieną kartą, kai iš pradžių įjungiate PIC arba jei yra atstatymas, Programos skaitiklis nurodo adresą 0000h, kuris gali būti nedelsiant pradedamas programos atminties pradžioje. Bet jei įvyktų pertrauka, programos skaitiklis nurodytų adresą 0004h.

Taigi, kol mes kuriame savo programą, kurioje bus pertraukimai, pirmiausia turime informuoti PIC, kad peršoktų adresą 0004h, ir palaikyti pertraukimo režimą, kuris prasideda adresu 0004h, atskirai nuo likusios programos dalies.

Tai atlikti gali būti be rūpesčių. Iš pradžių mes pradedame savo programą naudodami komandą, vadinamą ORG. Ši komanda nurodo kilmę arba pradžią. Mes laikomės jo su adresu. Kadangi PIC prasideda adresu 0000h, įveskite ORG 0000h. Po to turime aplenkti adresą 0004h. Mes tai įgyvendiname įdėdami GOTO instrukciją kartu su etikete, kuri pataria mūsų pagrindinei programai.

Mes po to laikysimės šios GOTO komandos dar vienu ORG, šiuo metu adresu 0004h. Po šios komandos įterpsime savo pertraukimo tvarkaraštį. Šiuo metu mes galime sugebėti įvesti savo pertraukimo rutiną tiesiai po antrosios ORG komandos, arba mes galime išdėstyti GOTO sakinį, kuris nurodo į pertraukimo rutiną.

Tai tikrai yra susijusi su jūsų pasirinkimu. Norėdami informuoti PIC, kurį jis siūlo, pasiekta pertraukimo rutinos pabaiga, komandą RTFIE turime nukreipti į rutinos pabaigą. Ši komanda reiškia grįžimą iš pertraukimo rutinos. Nors PIC tai pastebi, Programos skaitiklis nurodo galutinę padėtį, kurioje buvo PIC prieš įvykstant pertraukai. Žemiau mes sukūrėme trumpą kodo skiltį, kad būtų rodoma aukščiau:

Yra keli dalykai, apie kuriuos turėtumėte būti informuoti, kai naudojate pertraukimus. Pradinė linkmė yra tokia: jei galbūt naudojate identišką registrą savo pagrindinėje programoje ir pertraukimo programoje, turėkite omenyje, kad registro informacija greičiausiai pasikeis įvykus pertraukai.

Pvz., Naudokime „w“ registrą duomenims persiųsti į „Port A“ pagrindinę programą, todėl pertvarkymo programoje galite papildomai naudoti „w“ registrą, kad perkeltumėte duomenis iš vienos paskirties vietos į kitą.

Jei nesate atsargus, į w registrą bus įtraukta paskutinė vertė, kurią jis gavo, kai buvo pertraukimo režime, taigi, kai grįšite po pertraukos, ši informacija bus pateikta į A prievadą, o ne anksčiau turėtą vertę. įvyko pertraukimas.

Tai reiškia, kad reikia trumpam išsaugoti „w“ registro informaciją prieš tai dar kartą panaudojant pertraukimo procedūrą. Antrasis yra tai, kad galite rasti vėlavimą tarp to, kada įvyksta vienas pertraukimas, ir tada, kai gali atsirasti vėlesnis. Nors jūs suprantate, PIC turi išorinį laikrodį, kuris gali būti kristalas arba rezistoriaus ir kondensatoriaus kombinacija.

Nesvarbu, koks šio laikrodžio dažnis, PIC padalija jį iš 4, po kurio jis naudojamas, nes tai yra vidinis laikas. Pavyzdžiui, jei turite 4MHz kristalą, susietą su savo PIC, tokiu atveju PIC vykdytų instrukcijas 1MHz dažniu. Šis interjero laikas yra žinomas kaip instrukcijų ciklas. Šiuo metu duomenų lapas tvirtina (be abejo, mažybiniu šriftu), kad turite įgalinti 3–4 instrukcijų raundus tarp pertraukimų.

Aš norėčiau įgalinti 4 raundus. Vėlavimo priežastis yra ta, kad PIC reikalauja laiko pereiti prie pertraukimo adreso, vėliavos ir grįžti atgal nuo pertraukimo rutinos. Todėl turėkite tai mintyse, jei dirbate su alternatyvia grandine, kad įjungtumėte PIC pertraukimą.

Šiuo metu reikia atkreipti dėmesį į tai, kad jei naudojate B prievado 4–7 bitus kaip pertrauką. Negalite pasirinkti konkrečių B prievado kaiščių, kad jie veiktų kaip pertraukimas.

Todėl, jei leidžiate šiuos kaiščius, greičiausiai juos galima įsigyti. Todėl, pavyzdžiui, negalite turėti 4 ir 5 bitų - greičiausiai tuo pačiu metu bus suteikiami 6 ir 7 bitai. Koks tiksliai tikslas gauti keturis bitus, kad jie atspindėtų pertraukimą? Žinoma, jums gali būti prijungta grandinė prie PIC, jei kas nors iš keturių eilučių eina aukštai, tokiu atveju tai gali būti problema, kuriai reikia, kad PIC veiktų iškart.

Viena to iliustracija gali būti namų apsaugos signalizacija, kurioje keturi jutikliai yra susieti su B prievado 4–7 kaiščiais. Bet kuris konkretus jutiklis gali paskatinti PIC sujungti aliarmą, o aliarmo signalizavimo procedūra yra pertraukimo rutina. Tai padeda nuolat tikrinti uostus ir leidžia PIC tęsti įvairius reikalus. Kitoje pamokoje mes sukursime programą, kad valdytume pertraukimą.

Paskutinėje pamokoje nagrinėjome daugybę pagrindų, todėl jaučiu, kad atėjo laikas, kai sukūrėme savo pirmąją programą.

Programa, kurią parašysime, suskaičiuos kartų, kai įjungiame jungiklį, skaičių ir parodysime skaičių.

Programa būtų skaičiuojama nuo 0 iki 9, matoma 4 diodų formos šviesos diodais, o įvestis ar pertraukimas greičiausiai bus RB0.

Svarbiausias dalykas, kurį turime atlikti, yra informuoti PIC, kad jis peršoktų adresą, į kurį nurodo Programos skaitiklis, kai tik įvyksta pertrauka.

Jūs pastebėsite, kad mes naudojame unikalų šešioliktainių skaičių rodymo metodą. Prieš man nutikus taikykite F9h, kuriame h nurodė šešioliktainį skaičių. Tai galėtume parašyti kaip 0xF9, tai yra struktūra, kurią mes ketiname naudoti nuo šiol.

Dabar turime pasakyti PIC, kad naudosime pertraukimus, o RB0 kaištį 6 naudojame kaip pertraukimo kaištį:

bsf INTCON, 7GIE - visuotinis pertraukimo įgalinimas (1 = įgalinimas)
bsf INTCON, 4INTE - RB0 pertraukimo įjungimas (1 = įjungimas)
Aš ketinu išvalyti pertraukimo žymą tik tuo atveju (aš niekada niekuo nepasitikiu!)
bcf INTCON, 1INTF - Išvalykite žymos bitą kiekvienam atvejui

Šiuo metu turime įsteigti 2 uostus. Turėkite omenyje, kad kadangi dabar RB0 naudojame kaip pertraukimo kaištį, tai reikia nustatyti kaip įvestį:

Mes naudosime kintamąjį, vadinamą COUNT, kad išsaugotume jungiklių skaičių. Mes tiesiog galime padidinti A prievado vertę, bet pamatysite, kodėl aš naudoju kintamąjį, kai rašome savo pertraukimo tvarkaraštį.

Todėl mūsų pagrindinė programa yra sudaryta ir šiuo metu turime informuoti PIC, kaip elgtis, kai įvyksta pertrauka. Šiame pavyzdyje mūsų pertrauka greičiausiai bus jungiklis. Kiekvieną kartą, kai jungiklis yra uždarytas, norime, kad PIC būtų reguliuojamas COUNT skaičius.

Nepaisant to, mes tik norime parodyti, kiek kartų jungiklis išsijungia nuo 0 iki 9. Aukščiau aš nurodžiau, kad galime tiesiog padidinti A prievado vertę kiekvieną kartą, kai yra pertrauka. Tačiau A uoste yra 5 bitai, jei mes paprasčiausiai padidinsime uostą, turėsime daugiausiai 31 skaičių. Yra pora paaiškinimų, kodėl pasirinkau nepereiti iki 31.

Iš pradžių naudosime 7 segmentų ekraną, kuris daugiausiai galėtų pereiti nuo 0 iki 15 (šešioliktainis nuo 0 iki F). Toliau norėčiau jums parodyti keletą aritmetinių komandų, į kurias suklupote per pastarąsias pamokas.

Todėl mes tęsime savo pertraukimo tvarką. Šiuo metu pirmiausia turime trumpai išsaugoti išsamią informaciją apie mūsų registrą, nes tai taikėme perkeldami COUNT turinį į PORTA. Jei jo neišsaugome, tokiu atveju galime pateikti visiškai kitokį skaičių dėl savo aritmetikos. Todėl atlikime tai pirmiausia:

Šiuo metu mes suprantame, ar COUNT reikšmė yra 9 ar daugiau. Tai, ką turime atlikti dabar, yra tai, jei COUNT yra daugiau nei 9, grąžinkite jį į 0 arba grįžkite į pagrindinę programą, kad įsitikintume, jog galime ją pristatyti į A prievadą. BTFSS komanda, nes jūs suprantate, ar vėliau
instrukcija, jei planuojama nešti vėliavą, ty COUNT = 10:

Vienintelis dalykas, kurį dabar reikia padaryti, yra įvesti kolektyvą ir nustatyti vertes savo konstantoms, kurias galime atlikti iškart savo programos pradžioje.

Kiekvieną kartą, kai įjungiate jungiklį, šviesos diodai bus skaičiuojami dvejetainiais skaičiais nuo 0000 iki 1010, tada atgal į 0000.

Šiame paveikslėlyje parodyta grandinės schema, suderinama su aukščiau paaiškintu kodu. Įdomu tai, kad laiko kondensatorius buvo įtrauktas į projektą. Tai puikus malonus triukas, per kurį jūs galite laisvai vengti kondensatoriaus įtraukimo, jei tuo metu neturėtumėte su savimi.

Čia talpa pradeda veikti per klaidžiojančią talpą per osciliatoriaus kaištį ir žemę.
Žinoma, atrodo, kad tai nėra labai protingas būdas išvengti kondensatoriaus, nes klaidinga vertė gali skirtis priklausomai nuo skirtingų sąlygų.

Kitas skyrius, kurį galima pamatyti grandinėje, yra per jungiklį denonsuojantis tinklas. Tai apsaugo nuo trukdžių mechaninio perjungimo metu ir neleidžia PIC painiotis, jei perjungimas buvo vienas ar keli perjungimai.




Pora: Programuojama dvikryptė variklio laikmačio grandinė Kitas: Kaip veikia „Buck-Boost“ grandinės