PIC bemutató - A regiszterektől a megszakításokig

Próbálja Ki A Műszerünket A Problémák Kiküszöbölésére





Mielőtt a PIC programozás aprólékos részleteibe belemennénk, először fontos lenne elsajátítani néhány jó programozási módszert.

A nyilvántartások megértése

Először tegyük fel, hogy a program bármely pontjára beírunk egy (pontosvesszőt), a fordító figyelmen kívül hagyja mindazt, ami e pontosvessző után következik, amíg természetesen a kocsi vissza nem kerül a helyzetbe.



A fenti szolgáltatás lehetővé teszi számunkra, hogy hozzászólásokat vagy megjegyzéseket adjunk hozzá oly módon, hogy azok ne váljanak a program részévé, ugyanakkor megkönnyíti a program azonosítását a mellette található megjegyzések segítségével. Bármely IC programozása során ajánlott megjegyzéseket tenni.

A tanfolyam következő fontos dolga, hogy neveket rendeljünk a különféle konstansokhoz (később ezeket részletesen megtanulnád). Ez egyszerűbbé teszi annak megértését, amihez írják, vagy az érintett értékeket illetően, ahelyett, hogy összetévesztenék a mellékelt számokkal.



A fentieket azonnali felismerés céljából tényleges nevek formájában kell megtenni, például COUNT. Fontos megjegyezni, hogy itt minden nagybetűt alkalmaznak annak megkülönböztetésére, és azt is jelzik, hogy ez állandó érték.


Mint láthatjuk, a fentieket pontosvesszőből készült doboz formájában végezzük, ez csak tisztábbá teszi. Ezenkívül próbálja dokumentálni a programot papíron is, ez a gyakorlat segít lépésről lépésre megérteni a dolgokat.

2. A nyilvántartások.

A PIC-en belüli regisztráció olyan terület, amely elfogadja az írásbeli részleteket, és lehetővé teszi az olvasást is belőle. Összehasonlíthatja azt a papírlapdal, ahol a tartalmat vizualizálhatja és hozzáadhatja, ha átírja.

Az alábbi ábra a PIC16F84-be ágyazott tipikus regiszterfájl-térképet ábrázolja. A formátum nem tulajdonképpen a PIC belsejében van beállítva, csupán annak jelzésére, hogy a bitek miként helyezkedhetnek el a chip belsejében, és megérteni néhány érintett parancsot.

Láthatja, hogy alapvetően a 0-as és az 1-es bankra van felosztva. Az 1. bank felelős a PIC tényleges működésének ellenőrzéséért, például a PIC-nek hívja, hogy az A portban lévő bitek bemenetként, és melyek kimenetekként vannak-e kijelölve.

A 2. bank csak az információk manipulálására szolgál.

Értsük meg ezt a következő példán keresztül:

Tegyük fel, hogy egy bitet szeretnénk hozzárendelni a PortA high-nál. Ehhez először az 1. bankhoz kell mennünk, ahol a megadott bitet vagy PIN-kódot kimenet formájában állítjuk be az A porton. Ezután visszatérünk a 0-as bankhoz, és egy logikát (1-es bit) juttatunk az adott csaphoz.

A leggyakoribb regiszterek, amelyeket szívesen használunk az 1. bankban, a STATUS, TRISA és TRISB.

A STATUS segít visszatérni a 0. bankba, a TRISA lehetővé teszi számunkra, hogy kiválasszuk, hogy az A port melyik csapjai kimenetek és melyek lehetnek bemenetek, míg a TRISB megkönnyíti a kimenet és a bemeneti tű kiválasztását a B porton. A BANK 0 SELECT regisztráció lehetővé teszi a felhasználó számára átfordulni az 1. bankhoz.

Foglaljuk össze az egész koncepciót a következő leírással:

ÁLLAPOT:

A 0-s bankról az 1-esre való áttéréshez a STATUS regisztert parancsoljuk. Ez úgy valósul meg, hogy a STATUS regiszter 5. bitjét 1-re állítjuk. A 0 bankba való visszatéréshez a STATUS regiszter 5. bitjét 0-hoz rendeljük. A STATUS regiszter a 03h címen helyezkedik el, itt h jelöli a számot lehet hexadecimális.

TRISA és TRISB:

Ezek a 85h és a 86h címen találhatók. Ha egy kimenetet vagy bemenetet programozunk, akkor csak egy nullát vagy egyet adunk a regiszter adott bitjéhez. Most ezt kétféleképpen lehet megtenni, binárisan vagy Hex-en keresztül. Abban az esetben, ha az ember nem tudja átalakítani a paramétert, tudományos számológépet vehet igénybe az értékek végrehajtásához.

Most 5 csap van az A porton, ami 5 csapnak felel meg. Ha az egyik csapot bemenetként kívánjuk rögzíteni, akkor egy „1” -t adunk az adott bithez.

Abban az esetben, ha kimenetként szeretnénk hozzárendelni az egyik csapot, akkor az adott csapot „0” -ra állítjuk. A bitek pontosan megfelelnek a biteknek, vagy pontosabban a 0 bit RA0, az 1. bit RA1 lenne, a 2. bit = RA2 és így tovább. Értsük meg így:

Tegyük fel, hogy az RA0, RA3 és RA4 kimenetként szeretné javítani, míg az RA1 / RA2 i / ps-ként ezt a 00110 (06h) küldésével tenné meg. Ellenőrizze, hogy a 0 bit jobb felé van-e, ahogy itt jeleztük:

Port A tű RA4 RA3 RA2 RA1 RA0

Bitszám 4 3 2 1 0

Bináris 0 0 1 1 0

Ugyanez vonatkozik a TRISB-re is.

PORTA és PORTB

Annak érdekében, hogy az egyik kimeneti tű magas legyen, csak egy „1” -t ajánlunk a megfelelő bitre a PORTA vagy PORTB regiszterünkben. Ugyanez az eljárás követhető a TRISA és a TRISB regiszterek esetében is. Mielőtt rátérnénk az első példakódolásra, értsük meg több regiszter kupéját, nevezetesen: w és f.

W és F

A W regiszter egy közönséges regiszter, amely lehetővé teszi, hogy tetszőleges értéket rendeljen hozzá. Amint nagyságot rendel a W-hez, folytathatja úgy, hogy ezt hozzáadja egy másik értékhez, vagy egyszerűen áthelyezi. Egy másik érték hozzárendelésével a részletek egyszerűen felülíródnak W-n.

Az F nyilvántartás írásbeli ügyét továbbítja egy nyilvántartásba. Megkövetelnénk, hogy ez az F regiszter értéket rendeljen egy regiszterhez, lehet, hogy meghaladja a STATUS vagy a TRISA regisztert, mivel ezek nem teszik lehetővé, hogy az értékeket közvetlenül rájuk tegyük. Egy példa program

Vizsgáljuk meg a következő példakódot, amely megmutatja, hogyan valósul meg a fenti utasítás, és tanúi lehetünk a tanfolyam néhány utasításának is.

Kezdjük az A port javításával, a fentiek szerint.

Ehhez át kell váltanunk a 0-as bankról az 1-es bankra, ezt úgy végezzük, hogy felállítjuk a STATUS regisztert, amely a 03h címen található, az 5-től 1-ig terjedő bitig.

BSF 03h, 5

A BSF az F bitkészletet jelenti. Az utasítás után két számot használunk - 03h, amely a STATUS regiszter cím, és az 5 szám, amely megfelel a bit számának.

Tehát azt mondjuk, hogy “Állítsuk be az 5. bitet a 03h címben 1-re”.

Most az 1. bankban vagyunk.

MOVLW 00110b

A 00110 bináris értéket (a b betű azt jelenti, hogy a szám bináris) a W általános célú nyilvántartásunkba. Természetesen megtehettem volna ezt hexán is, ebben az esetben az utasításunk a következő lenne:

MOVLW 06h

Bármelyik működik. A MOVLW jelentése ’Move Literal Value Into W’, ami angolul azt jelenti, hogy a következõ értéket közvetlenül a W regiszterbe helyezi.

Most ezt az értéket fel kell tennünk a TRISA regiszterünkbe a port beállításához:

MOVWF 85 óra

Ez az utasítás azt jelzi, hogy „A tartalom áthelyezése a következő nyilvántartási címbe”, ebben az esetben a cím a TRISA-ra utal.

TRISA regisztrációnk ezen a ponton a 00110 ábrát viseli, vagy grafikusan ábrázolva:

Port A tű RA4 RA3 RA2 RA1 RA0

Bináris 0 0 1 1 0

Bemenet / kimenet O O I I O

Tehát most rendelkezünk a Port A csapokkal, vissza kell térnünk a 0. bankhoz, hogy beállítsuk az egyik információt.

BCF 03h, 5

Ez az utasítás a BSF fordítottját hajtja végre. Ez azt jelenti, hogy „Bit Clear F”. A megfelelő számpár a regiszter címe, itt a STATUS regiszter, valamint a bit szám, ebben az esetben az ötös bit. Amit jelenleg pontosan befejeztünk, az az ötödik bitet határozta meg

STATUS regisztráció 0-ra

Ezen a ponton visszatértünk a 0. bankba.
A következő kód egy blokkban található:

BSF 03h, 5 Ugrás az 1. bankra
MOVLW 06h Helyezze a 00110-et W-be
MOVWF 85h Vigye a 00110-et a TRISA-ra
BCF 03h, 5 Gyere vissza a 0. bankba

Az utolsó útmutatón belül megerősítettük, hogy miként lehet az IO port csapjait a PIC-n létrehozni, hogy esetleg bemenetek vagy kimenetek legyenek.

Ezen a kurzuson keresztül hadd segítsek Önnek abban, hogy adatokat küldjön a portokba.

Adatok küldése a portokhoz

A következő oktatóanyagban egy LED be- és kikapcsolásával villoghatunk, amely egy teljes programrészletből és egy egyszerű kapcsolási rajzból áll, így láthatja, hogy a PIC pontosan azt hajtja végre, amire számítunk.

Ne próbálja összeállítani és programozni a PIC-t az alábbi eredményekkel, mivel ezek csak illusztrációk. Kezdetben létrehozzuk a kimenetként a 2. A bitet:

Ez felismerhető volt az előző oktatóanyagból. Az egyetlen megkülönböztetés lehet. Az A csapok minden bitjét kimenetként rögzítettük azzal, hogy 0h-t szállítottunk a háromállapotú regiszterbe. Tehát most meg kell tennie, hogy bekapcsol egy LED-et.

Ezt úgy valósítjuk meg, hogy az egyik csapot (azt, amelyhez a LED van kapcsolva) magasra ütemezzük. Másképp fogalmazva, a csapra ’1’ -t alkalmazunk. Pontosan ez a módszer (lásd a megjegyzéseket minden sor pontosításához):

Ezért most elértük, hogy a LED-et egyszer bekapcsoljuk, majd kikapcsoljuk. Arra vágyunk, hogy a LED folyamatosan bekapcsoljon.

Ezt úgy érjük el, hogy megszerezzük a programot, hogy visszatérjünk a kezdethez. Ezt úgy valósítjuk meg, hogy kezdetben egy programunk elején létrehozunk egy címkét, majd tájékoztatjuk a programot, hogy folytassa ott. Meghatározzunk egy címkét egészen egyszerűen.

Beírunk egy kifejezést, mondjuk a START-ot, majd írja be a kódot:

Mint bizonyítottuk, kezdetben a „Start” kifejezést rögtön a program elején említettük.

Ezután a program legvégén egyértelműen megemlítettük a „goto Start” -t. A „goto” utasítás éppen azt hajtja végre, amit deklarál.

Ez a program következetesen be- és kikapcsolja a LED-t, amikor bekapcsoljuk az áramkört, hajlamosak kikapcsolni, ha az áramot elvesszük. Lehet, hogy még egyszer ellenőriznünk kell a programunkat:

Bizonyára kihagytuk a megjegyzéseket, de továbbra is betarthatjuk az utasításokat és a számokat.

Ez később kissé elgondolkodtató lehet, ha megpróbálja elhárítani a programot, és a kód írása közben megjegyzi az összes címet.

Bár a megjegyzéseket nyugodtan elhelyezhetjük, kissé összezavarodhat. Ehhez meg kell nevezni a számokat, és ezt egy további utasítással lehet végrehajtani: 'equ' Az 'equ' utasítás azt sugallja, hogy egyes dolgok megegyezhetnek egy másik dologgal.

Lehet, hogy nem a PIC, hanem az assembler utasításai. Ez az utasítás megkönnyíti a név hozzárendelését a regisztercím helyéhez vagy egy konstans hozzáadását egy programozási kifejezéshez.

Létrehozunk néhány állandót a programunkhoz, és tanúi leszünk annak is, hogy mennyire egyszerű a program olvasása.

Azóta rögzítettük azokat az állandó értékeket, amelyeket a programunkba állítva folytathatunk. Az állandó értékeket használatuk előtt meg kell jelölni.

ezért mindenképpen a program elején helyezze el őket. A megjegyzéseket kizáró programot még egyszer átírjuk, hogy összehasonlítsuk a korábbi címkéket a legújabbal.

Lehet, hogy észreveszi, hogy az állandók valamivel könnyebbé teszik a program megértését, azonban még mindig nélkülözzük a megjegyzéseket, de nem kell aggódnunk, mivel még nem fejeztük be.

A villogó LED programunknak kisebb hátránya lehet.
Minden utasításhoz 1 órás sorrend szükséges. Abban az esetben, ha 4MHz kristályt használunk, akkor minden utasítás 1 / 4MHz vagy 1uS befejezést igényel.

Mivel csak öt utasítást alkalmaztunk, a LED 5uS-ban aktiválódik, majd kialszik. Ez túl gyors lehet ahhoz, hogy az emberek észrevegyék, ráadásul úgy tűnik, hogy a LED teljesen világít.

Amit inkább el kellene érnünk, az gátlást eredményez a LED bekapcsolása és a LED kikapcsolása között. A gátlás elmélete az, hogy visszaszámolunk egy korábbi mennyiségtől, így amikor ez nulla lesz, abbahagyjuk a számolást.

A nulla érték a késés befejezését jelenti, és a program során folyamatosan dolgozunk. Ezért először is meg kell határoznunk egy állandó értéket, amelyet számlálónkként használhatunk.

Mondjuk ezt az állandó COUNT értéket. Ezt követően meg kell határoznunk, hogy egy szám mennyi jelentőséggel kezdjen el számolni. Természetesen a legnagyobb szám, amelyet beilleszthetünk, 255, vagyis FFh hexában. Amint arról a korábbi oktatóanyagban beszéltem, az equ utasítás hozzárendel egy kifejezést egy regiszterhelyzethez.

Ez azt jelenti, hogy függetlenül attól, hogy a COUNT-ot milyen mennyiségre osztjuk ki, ez egy regiszter tételeivel egyezik. Abban az esetben, ha megpróbáljuk kijelölni az FFh értéket, hibát fogunk elkövetni, amint elérjük a program fordítását.

Ennek oka az FFh hely, ezért nem férhetünk hozzá. Ezért hogyan kell kijelölnünk egy valódi számot? Természetesen kis oldalsó töprengésre lesz szükség.

Ha esetleg a COUNT-t a 08h címre jelöljük, akkor ez egy alapvető célregisztrációs rendeltetési helyet jelöl. Alapértelmezés szerint az érintetlen területek FFh értékre vannak állítva. Következésképpen, ha a COUNT 08h-ra vezet, akkor az FFh értékével találkozunk, míg mi először bekapcsolunk. Mindazonáltal, én, hogyan javíthatjuk a COUNT számot egy másik számra ?, csak annyit alkalmazunk, hogy először egy értékelést „áthelyezzünk” erre a célra.

Tegyük fel szemléltetésként, hogy azt kívántuk, hogy a COUNT értéke 85h legyen, nem említhetjük a COUNT egyenértéket 85h, mivel ez az A kikötő Tri-State regiszterének helyzete. Pontosan az alábbiakat teljesítjük: movlw 85h 85h értéke a W regiszterben movwf 08h

Most helyezze át a 08h regiszterünkbe. Ezt követően abban az esetben, ha a COUNT egyenlőséget 08h-val fejezzük ki, a COUNT megegyezik a 85h értékkel. Finom, nemde! Ezért kezdetben meghatározzuk az állandónkat: COUNT egyenlő 08h Ezt követően ezt a számot eggyel kell csökkentenünk, amíg nulla lesz.

Egyszerűen előfordul, hogy létezik egy utasítás, amelynek célja ez a számunkra egy „goto” és egy tag használatával.

Az utasítás, amelyet alkalmazni fogunk: DECFSZ COUNT, 1 Ez az utasítás kimondja: „Csökkentse a regisztert (itt ez a COUNT) a vesszőt nyomon követő számmal. Ha eléri a nullát, ugorjon két ponttal előre. ’Először találjuk meg működés közben, mielőtt a pályánkra helyeznénk.

Amit elvégeztünk, az kezdetben megállapítja a konstans számunkat 255-ig. A következő szegmens egy címkét, LABEL nevet visel, a decfsz utasításunkhoz közel helyezi el.

A decfsz COUNT, 1 eggyel csökkenti a COUNT értékét, és a végeredményt egyenesen megtartja a COUNT értékben. Ezenkívül ellenőrzi, hogy a COUNT értéke 0.

Ha nem, akkor ebben az esetben a program elindul a következő sorra. Most van egy „goto” nyilatkozatunk, amely visszavezet minket a decfsz utasításunkhoz.

Abban az esetben, ha a COUNT értéke egyenlően teljesít, akkor a decfsz utasítás azt eredményezi, hogy programunk 2 ponttal előrébb ugrik, és oda kerül, ahol azt állítottuk, hogy „Itt folytathatjuk”.

Ezért, mivel megfigyelheti, a programot úgy állítottuk össze, hogy előre egy előre meghatározott ideig egy helyen üljön, mielőtt továbblépne. Ezt késleltetési ciklusnak lehetne nevezni.

A késleltető hurkok megértése

Abban az esetben, ha nagyobb késleltetésre van szükségünk, folytathatjuk az egyik ciklust a következővel. Az extra hurkok, meghosszabbítják a késleltetést. Vegyünk legalább kettőt, feltételezve, hogy meg akarjuk figyelni a LED villanását. Ezeket a késleltetési hurkokat elhelyezzük a programunkban, és úgy teljesítjük, hogy valódi programká alakítjuk a megjegyzések bevezetésével:

Lehetőség van ennek a programnak a fordítására, amely program után a PIC. Nyilvánvaló, hogy mindenképpen próbálja ki az áramkört annak ellenőrzésére, hogy valóban működik-e. Az alábbiakban egy kapcsolási rajzot kell készítenie, amint beprogramozta a PIC-t.


Jól sikerült, valóban elkészíthette volna az első PIC programját, valamint elkészíthetett egy áramkört, amely egy LED be- és kikapcsolásához villog. Mostanáig, ha elvégezted ezeket a tanfolyamokat, akkor összesen 35 utasítást tanultál meg hétből, de kétségtelen, hogy eddig kontrollálhatod az I / O portokat!

Megpróbálná megváltoztatni a késleltetési hurkokat, hogy a LED villanása gyorsabb legyen - mi tűnik a COUNT minimális értékének, hogy lényegében láthassa a LED villanását? Vagy lehet, hogy a kezdeti után egy harmadik vagy egy további késleltetési hurkot szeretne beilleszteni a LED stabilizálásához. egyedi konstans minden késleltetési hurokhoz.

Lehetséges, hogy ezután valóban késlelteti a késleltetési hurkokat, hogy a LED villogjon meghatározott sebességgel, például egy másodperc után. A következő oktatási programon belül nézzük meg, hogyan tudunk hasznosítani egy szubrutinnak nevezett programot a program kompakt és karbantartása érdekében Az alprogram egy szerves része a kódnak vagy programnak, amelyre hivatkozhat, és amikor szüksége lehet rá. Az alprogramokat olyan esetekben alkalmazzák, amikor gyakran ugyanazt a funkciót látja el.

Mik azok az alprogramok

A szubrutin alkalmazásának előnyei, hogy valószínűleg egyszerűbb lesz módosítani az értéket egy szubrutin belsejében, például mondjuk tízszer a programon keresztül, valamint nagyban hozzájárul a programban elfogyasztott memória szintjének csökkentéséhez. PIC. Megnézünk egy alprogramot:

Kezdetben meg kell adnunk az alprogramunk megnevezését, és ebben a helyzetben a ROUTINE-t választottuk. Ezt követően beírjuk azt a kódot, amelyet normálisan szeretnénk végrehajtani. Ezért választottuk ki a késleltetést a villogó led programunkban. Végül a szubrutint a RETURN utasítás beírásával fejezzük be.

Ahhoz, hogy a szubrutint programunk bárhonnan elindítsa, gyorsan beírjuk a CALL utasítást, majd a szubrutin jelölést.

Ezt egy kicsit mélyebben megvizsgáljuk. Miután elérkeztünk a CALL xxx azon részéhez, amelyben xxx a szubrutinunk neve, a program bárhová ugrik, ahová az xxx szubrutin telepítve van. A szubrutinon belüli utasításokat végrehajtjuk.

A RETURN utasítás végrehajtása után a program visszatér a fő programunkhoz, a CALL xxx utasításunkat követő utasításhoz.

Lehetséges többször is felhívni a hasonló szubrutint, ahogy szeretné, ez magyarázza, hogy a szubrutinok használata miért rontja programunk általános időtartamát.

Ennek ellenére van néhány tényező, amelyet tudnia kell. Kezdetben, hasonlóan a fő programunkhoz, minden konkrét állandót el kell ismerni, mielőtt felhasználhatja őket.

Ezeket esetleg magában a szubrutinban, vagy közvetlenül a fő program elején tudják elismerni. Javaslom, hogy tudjon meg mindent a fő program elején, azóta ismerje fel, hogy a dolgok azonos helyzetben vannak. Ezután meg kell győződni arról, hogy a fő program átugrik-e az alprogramon.

Ezzel azt akarom mondani, hogy az alprogramot közvetlenül az elsődleges program végére helyezze, kivéve, ha egy „Goto” deklarációt használ az ugráshoz, ahol a szubrutin található, a program folytatja és végrehajtja az alprogramot, függetlenül attól, hogy Ön megkövetelik vagy más módon.

A PIC nem különbözteti meg a szubrutint és a fő programot. Megnézzük a villogó led programunkat, de ezúttal egy szubrutint fogunk használni a késleltetési ciklushoz. Ideális esetben megtudja, mennyivel kevésbé bonyolult a program, valamint azt is, hogy a szubrutin hogyan működik gyakorlatilag.

Végül megfigyelheti, hogy ha késleltetési ciklusunkhoz egy alprogramot használunk, akkor a program méretét lecsökkenthetjük.

Valahányszor késleltetésre vágyunk, esetleg amikor a LED be- vagy kikapcsol, alapvetően alprogramnak hívjuk a késleltetést. Az alprogram befejezésekor a program visszavezet a „Hívás” utasításunkat követő vonalra. A fenti ábrán bekapcsoljuk a LED-et.

Ezt követően lépünk kapcsolatba az alprogrammal. Ezután a program visszatér, hogy képesek legyünk kapcsolni a LED-et. Még egyszer felhívjuk a szubrutint, csak arra az esetre, ha a szubrutin esetleg befejeződött, a program visszatér, és a későbbi utasítás, amelyet felismer, a „goto Start”. Bárki számára, akit érdekelhet, az első programunk 120 bájt hosszú volt.

A szubrutin használatával 103 bájtra csökkenthetjük a program méretét. Ez nem hangozhat olyan fantasztikusnak, azonban figyelembe véve azt a tényt, hogy a PIC-en belül összesen csak 1024 bájt van, minden kis összeg előnyös.

A következő útmutatón belül ellenőrizzük a portok olvasását.

Eddig az A portra komponáltunk annak érdekében, hogy képesek legyünk kapcsolni egy LED-et. Ezen a ponton meglátjuk, hogyan fogjuk olvasni a portok I / O csapjait.

Bemeneti / kimeneti portok olvasása

Ez pontosan annak biztosítására szolgál, hogy képesek legyünk kapcsolni egy külső áramkört, és befolyásoljuk az általa kínált konkrét kimeneteket.

Ha megjegyezné korábbi tanfolyamainkat, ha ki szeretné alakítani az I / O portokat, akkor a 0-as bankról az 1-es bankra kellett ugranunk. Ezt kezdetben megvalósítjuk:

Ezen a ponton rögzítettük az A port 0. bitjét a bevitelhez. most meg kell vizsgálnunk, hogy a csap magas vagy alacsony. Ennek megvalósításához a következő két utasítás egyikét használhatja:

BTFSC és BTFSS.

A BTFSC utasítás a „Tegyen egy kis tesztet a regiszteren, valamint az általunk kijelölt bitet.

Abban az esetben, ha 0, akkor az ezt követő utasítást kihagyjuk ”. A BTFSS azt jelenti, hogy „Tegyen egy kis tesztet a regiszterben és az általunk létrehozott bitet. Ha 1-re van állítva, akkor megkerüljük a következő utasítást.

Azt, hogy melyiket használjuk fel, pontosan az határozza meg, hogy programunk hogyan reagáljon a bemenet tanulmányozása során. Szemléltetésképpen, ha csak arra várunk, hogy a bemenet 1 legyen, akkor a következő módon használhatjuk a BTFSS utasítást:

Kód itt:

BTFSS PortA, 0Goto start Folytassa itt:
:

A program csak a „Carry on here” -re váltana, feltéve, hogy a PortA 0 bitje 1-re van ütemezve.

Jelenleg írunk egy olyan programot, amely egy LED-et egy sebességgel indíthat, de ha egy kapcsoló be van kapcsolva, akkor a LED kétszer lassabban villan.

Lehetséges, hogy ezt a programot önállóan gyakorolhatja, mégis Valahogy beépítettük a listát.

Megpróbálhatja és elkészítheti a teljes programot annak ellenőrzésére, hogy megértette-e az alapelveket. Ekkora áramkört fogunk használni, mint korábban, a PIC RA0 kapcsolójával és az ellátás pozitív sínjével együtt.

Amit itt elértünk, az a LED bekapcsolása. Ezt követően megállapítom, hogy a kapcsoló le van-e kapcsolva.

Abban az esetben, ha ez korlátozott, akkor a késleltetési alprogramunkhoz csatlakozom. Ez biztosítja az egyenértékű késést, mint korábban, azonban ezen a ponton kétszer lépünk kapcsolatba vele.

Ugyanez vonatkozik arra az esetre is, amikor a LED nem világít. Abban az esetben, ha a kapcsoló nincs zárva, akkor a korábbi és korábbi kikapcsolási periódusokat rögzítjük.

Már a kezdetektől fogva követte ezeket a leckéket, talán arra törekszik, hogy megértse, hogy a PIC 16F84 35 utasításából tízet felfedezett! És ezek mindegyikét megtanulja pusztán a LED be- és kikapcsolásával.

Eddig úgy állítottuk össze, hogy a PIC villogjon egy LED-be és ki.

Ezt követően képesek voltunk a PIC-vel egy kapcsoló beépítésével, ezért változtattuk a vaku sebességét.

A memóriaterület hatékony használata

Az egyetlen kérdés, hogy a program meglehetősen hosszú és meglehetősen nem hatékony a memóriaterület. Úgy tűnt, hogy rendben van, miközben először adtam be a parancsokat, azonban ennek egyszerűbb végrehajtásának kellene lennie. Pozitív módon elemezzük, hogyan kapcsoltuk be és ki a LED-et szó szerint.

movlw 02hmovwf PORTAMovlw 00hmovlw PORTA

Először betöltöttük a w regiszterünket 02h-val, utána átvittük a PortA regiszterünkbe a LED bekapcsolásához. A kikapcsoláshoz csomagoltunk egy w-t 00h-val, ami után a PortA regiszterbe helyeztük.

Mindezen rutinok között kénytelenek voltunk kapcsolatba lépni egy alprogrammal annak biztosítása érdekében, hogy megfigyelhessük a LED villogását.

Ezért két alkalommal át kellett adnunk két információkészletet (egyszer a w regiszterbe, majd a PORTA-ba), valamint kétszer hívnunk egy szubrutint (egyszer be, majd egyszer ki). Így hogyan érhetnénk el ezt hozzáadott hatékonysággal? Nagyon egyszerű.

Egy másik, XORF néven ismert utasítást használunk. Az XORF utasítás egy exkluzív VAGY funkciót működtet a nyilvántartásban, amelyet az általunk megadott információkkal írunk elő. Úgy gondolom, hogy tisztáznom kell, mi a világon az exkluzív VAGY, mielőtt folytatnánk. Abban az esetben, ha két bemenetünk és egy kimenetünk van, akkor a bemenet csak akkor lehet 1-es, ha a két bemenet különbözik egymástól. Míg ezek megegyeznek, akkor a kimenet valószínűleg 0. A következő igazságtábla azoknak az egyéneknek a számára, akik ezeket megvizsgálják:

A B F0 0 00 1 11 0 11 1 0

Ezen a ponton megnézzük, mi történik, ha B-t adunk meg ugyanúgy, mint korábbi kimenetünket, és egyszerűen megváltoztatjuk az A értékét:

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

Ha fenntartjuk az A értékét, mint 1, és kizárjuk VAGY a kimenettel, akkor a kimenet váltani fog. Abban az esetben, ha ezt nem veszi észre az igazságtáblázatból, az alábbiakban bináris használatával lehet szemtanúja:

0 Áramkimenet
EX-VAGY 1 1 új kimenettel
EX-VAGY 1 0 új kimenettel

Talán azt tapasztalhatja, hogy a kimenet kizárólagos OR-al történő rendezésével 1-gyel most a kimenetet 0-ról 1-re 0-ra állítjuk.
Ezért a LED be- és kikapcsolásához csak néhány mondatra van szükségünk:

MOVLW 02h
XORWF AJTÓ, 1

Amit pontosan el fogunk érni, az a w regiszter hozzáadása a 02h-val. Ebben az esetben Exkluzív VAGY vagyunk ennek a számnak, függetlenül attól, hogy mi van a PortA-nkon. Abban az esetben, ha az 1 bit 1, akkor 0-ra változik. Ha az 1 bit 0, akkor 1-re változik. Vizsgáljuk meg ezt a kódot egyszer vagy kétszer, hogy megmutassuk, hogyan fut binárisan:

AJTÓ
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Valójában nem kell minden alkalommal ugyanazt az értéket betöltenünk a w regiszterünkbe, ezért az indításkor egyszer ezt meg lehet valósítani, és egyszerűen visszaléphetünk a váltóparancshoz. Ezenkívül nem kellene értéket rögzítenünk a PortA regiszterünkben. Az OK? Természetesen, mivel a bekapcsoláskor ez 1, könnyen átkapcsolhatjuk. Én, alternatívaként a 0 bekapcsoláskor, még most is váltanánk.

Ezért szeretné megtekinteni az újonnan létrehozott kódunkat. Az első a villogó LED kódunkat jelenti, míg a második a kapcsoló hozzáadásával:

Kívánjuk, hogy megtalálja, hogy egyszerűen egy egyszerű utasítás használatával most levágtuk programunk méretét. Az az igazság, hogy megmutassuk, mennyivel csökkenthetnénk programjainkat. Bemutattuk a két programot, csak az összeállítottakat és azok dimenzióit az alábbi táblázatban:

Programváltoztató méretek (bájt)
Villogó LED Eredeti 120
Villogó LED alprogram hozzáadva 103
Villogó LED XOR funkció Használt 91
LED kapcsolóval Original 132
LED kapcsolóval XOR funkcióval használt 124.

Ezért nem csak néhány újszerű utasítást fedeztünk fel, hanem ezen felül természetesen csökkentettük a szkriptek méretét is!

Az alábbiakban elemezzük, hogyan lehet az egyes biteket megingatni, bizonyos egyszerű számtani és adattáblázatokat végrehajtani.

Logikai menedzserek

Az utolsó bemutatón belül bemutattam az Exclusive OR műveletet. Az ExOR függvény logikai operátorként értendő.

Ezen az oktatóanyagon belül megvilágítom a PIC által támogatott további logikai operátorokat. Pontos programokban nem lesz semmilyen eset, azonban megtanulunk egyszerű módszereket az operátorok használatára kis kódterületek alkalmazásával.

ÉS Az AND függvény alapvetően két bitet elemez, és 1-t ad le, függetlenül attól, hogy azonosak-e, és 0-t, ha megkülönböztetőek. Például, ha megemlítettük az 1 ÉS 1-et, az eredmény 1, míg ha 1 és 0-t deklaráltunk, a következmény 0 lenne.

Mondanom sem kell, hogy képesek vagyunk értékelni a szavakat is, és az AND függvény teljesíti a két kifejezés apránként történő áttekintését. Az alábbi példában két 8 bites szó látható, amelyek a termékkel együtt AND-dé válnak:

11001011
ÉS 10110011
10000011

Remélem, egyetértesz, az eredménynek egyszerûen lesz 1-je, amikor 2 1-es kéz a kézben van pár szóban. Képesek vagyunk használni az AND függvényt például a portok ellenőrzésére.

Abban az esetben, ha ellenőrizünk néhány áramkörhöz kapcsolt I / O tűt, és figyelnünk kell egy adott helyzetre, amelyben csak néhány tű magas, ebben az esetben nagyjából képesek vagyunk elolvasni a port, amely után ÉS az eredmény azzal a feltétellel, amelyet megvizsgáltunk, megegyezik a fenti példával.

A PIC két összetevőt nyújt az AND számára.
Ők az ANDLW és az ANDWF. Az ANDLW lehetővé teszi számunkra, hogy AND funkciót hajtsunk végre a W regisztráció részleteivel és egy általunk meghatározott összeggel.

A szintaxis a következő: ANDLW ahol pontosan arra megyünk, és W tartalma.

Az AND függvény következményei közvetlenül a W regiszterbe kerülnek.
Az ANDWF lehetővé teszi számunkra, hogy AND funkciót hajtsunk végre a W regiszterben és egy másik regiszterben, például egy PORT-ban. A szintaxis: ANDWF, d amelyben a regisztráció lelkesedünk, pl. A PORTA és d mutatja a PIC-t, ahová az eredményt helyeznie kell. Ha d = 0, az eredmény bekerül a W regiszterbe, és d = 1 közül a végeredmény elmentésre kerül az általunk meghatározott regiszterbe. Az alábbi két kódrész jó példát mutat az egyes AND függvényekre.

A kezdőbetű a PORTA állapotának vizsgálatát végzi, amelyben ellenőriznünk kell, hogy a bemenetek 1100 értékűek-e. Az eredményt visszahelyezhetjük a W regiszterbe

movlw 1100
ANDWF 05h, 0 A második ábra most ellenőrizheti a W regiszter tartalmát:
ANDLW 1100

VAGY

Mostanra felfedeztünk egy OR funkciót, pontosabban az XOR-t. Ez 1-vé fejlődik, ha két bit nem azonos, de különböző. Megtalálhat egy másik VAGY funkciót, az IOR nevet, amely az inkluzív VAGY. Ez a függvény generál 1-t abban az esetben, ha bármelyik bit 1, de ha minden bit 1, akkor az alábbiakban egy világos igazságtábla látható, amely ezt szemlélteti:

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

Mik azok a számtani operátorok

ADD

Ez a funkció teljesíti azt, amit általában állít. Két számadattal járul hozzá! Abban az esetben, ha a két szám összeadásának következménye meghaladja a 8 bitet, abban az esetben valószínűleg egy CARRY zászlót állítanak be. A CARRY zászló a 03h bit 0 címen található.

Amikor ez a bit ütemezett, akkor a két szám meghaladta a 8 bitet. Ha 0, akkor a következmény 8 biten belül helyezkedik el. Az előzőekhez hasonlóan a PIC kétféle ADD stílust nyújt nekünk, konkrétan az ADDLW és az ADDWF. Mint feltételezhetted, ez nagyon hasonlít a fenti függvényhez. Az ADDLW felajánlja a W regisztráció tartalmát. A szintaxis: ADDLW ADDWF adja hozzá a W regiszter és néhány más általunk kijelölt regiszter tartalmát.

A szintaxis: ADDWF, d hol van

ALATTI

Ezen a ponton azt hiszem, nem lehet feltételezni, hogy ez a funkció mit hajt végre! Valóban, sejtette, ezt a funkciót
egyik bitet kivonja a másikból. A PIC ismét 2 ízlést nyújt számunkra: SUBLW és SUBWF. A szintaxis pontosan hasonlít az ADD függvényhez, eltekintve attól, hogy nyilvánvalóan a SUB parancsot írja be az ADD helyére!

Növekedés Abban az esetben, ha 1-et szeretnénk felvenni egy számra a PIC-ben, abszolút kihasználhatnánk az ADD funkciót, és felhasználhatnánk az első számot. ~ Ennek a nehézsége az, hogy először be kell helyeznünk az ábrát a W regiszterbe, majd az ADDLW 1 vezérlővel kell növelnünk. Abban az esetben, ha 1-et szeretnénk felvenni egy regiszterbe, még rosszabb lehet. Először be kell helyeznünk az 1-es számot a W regiszterbe, utána használjuk az ADDWF, 1-et. Ezért például, ha belefoglalunk 1-et a 0C helyre, akkor a parancsfájl következő részével kell rendelkeznünk:

movlw 01
addwf 0c, 1

Ennek megvalósítására létezik egy egyszerűbb módszer. Gyakorolhatjuk az INCF parancsot. A szintaxis a következő: INCF, d ahol a regiszter vagy hely, amelyben érintettek vagyunk, és d megmutatja a PIC-t, ahová helyeznie kell az eredményt. D = 0 esetén az eredmény a W regiszteren belül van, d = 1 esetén pedig a következményt az általunk kikötött regiszterben állítjuk be.

Ennek az egyedi utasításnak a felhasználásával képesek vagyunk a kódolás ötven százalékára. Abban az esetben, ha a W regiszterbe szeretnénk visszaállítani az eredményt, abban az esetben a fenti példát alkalmazva esetleg egy kiegészítő parancsot kellett volna tartalmaznunk, hogy a 0C elemeit visszahelyezzük a W regiszterbe, majd ezt követően helyezzük vissza a 0C regisztert mindegy mi volt.

Létezik inkrement parancs. INCFSZ. Ez a parancs növelheti az általunk kikötött regisztert, azonban ha a regiszter 0-nak felel meg a növekedés után (ami akkor következik be, amikor az 1-től 127-ig beleszámítunk), akkor a PIC valószínűleg átadja a következő utasítást. Az alábbi kódrész ezt tükrözi:

Hurok incfsz 0C
Menj hurok
:
:
A program hátralévő része.

A kód fenti részében a 0C 1-gyel növekszik. Ezután rendelkezünk egy utasítással, amely tájékoztatja a PIC-t, hogy térjen vissza a Loop nevű címkénkhez, és ismét növelje a 0C-t 1-gyel. Ez addig folytatódik, amíg a 0C meg nem egyezik a 127-vel. Ebben a helyzetben, amikor a 0C-t 1-gyel növeljük, a 0C mostantól megegyezik a 0-val. Az INCFSZ utasításunk nagyon jól tájékoztathatja a PIC-t, hogy hagyja ki a következő utasítást, amely jelen esetben a goto deklaráció, ezért a PIC folytatja a program fennmaradó részét.

Csökkenés

A dekrement függvényről mára már megbeszéltük korábbi képzéseinket, ezért már nem fogom felülvizsgálni.

Kiegészítés

A vita utolsó utasítása megfordítja a regiszter minden egyes bitjét, amelyet kikötünk. A szintaxis: COMF, d ahol

A bitműveletek megértése

Ezt fel lehet használni például egy port csapjainak gyors cseréjére kimenetről bemenetre stb. A bitfunkciók lehetővé teszik számunkra, hogy egyetlen bitet alakítsunk ki egy kifejezésen belül. Lehetővé teszik számunkra, hogy folytassuk, beállítsuk és megszabaduljunk az általunk meghatározott regiszterekben vagy számokban lévő egyes bitektől.

A tanfolyam végén közzé fogunk tenni egy programot, amelyet arra terveztek, hogy létrehozzon egy sor szekvencia fényt, amelyek előre haladnak, majd fordítva. Megfigyeltük ezt korábban, amikor megvizsgáltuk az exkluzív VAGY függvényt, ahol kizárólag egy kifejezéssel ORORoztuk a portokat. Mostanáig észrevettünk néhány bites funkciót, amikor létrehoztuk a PIC portjait, és

Hadd ismételjem meg itt a felhasználásukat.

BCF

Ez az utasítás kissé megsemmisíti, amit egy általunk kijelölt nyilvántartásban rögzítünk. A szintaxis
az:
BCF,

Ezt korábban arra használtuk, hogy az 1. oldalról a 0. oldalra változtassunk egy kicsit eltávolítva a STATUS regiszterből. Hasonlóképpen képesek vagyunk arra is, hogy egy kicsit 0-ra javítsuk bármely más regiszterben / helyen. Például abban az esetben, ha a 0C szakaszban mentett 11001101 3. bitjét 0-ra szeretnénk állítani, akkor megtehetjük
beillesztendő:

BCF 0C, 03

BSF

Ez az utasítás minden általunk megadott bitet 1-re javítana minden jelzett regiszterben. Ezt korábban használtuk a 0. oldalról az 1. oldalra történő továbblépéshez. A szintaxis: BSF ,, és pontosan ugyanabban a módszerben használják, mint a fenti BCF.

BTFSCU Mostanáig beállíthatunk vagy törölhetünk egy kicsit a regiszterben. Képzelje el azonban, hogy alapvetően ellenőriznünk kell-e, hogy egy bit 1 vagy 0 a regiszterben?

Bizonyára lehetséges a BTFSC használata. Azt mondja ki, hogy az Bit Test Register F, és kihagyja, ha tiszta. Ez az utasítás elemzi azt a bitet, amelyet a regiszterben kijelölünk. Abban az esetben, ha a bit 0, az utasítás tájékoztatja a PIC-t a következő utasítás átadásával.

Használhatjuk ezt az utasítást arra az esetre, ha ellenőrizni szeretnénk egy zászlót, például a carry flaget. Ez megkímél bennünket, ha el kell olvasnunk a STATUS regisztert, és meg kell keresnünk az egyes biteket, hogy megtudjuk, melyik zászlók vannak rögzítve. 29 Például abban az esetben, ha azt akartuk ellenőrizni, hogy a Carry zászló 1-re van-e állítva, miután 2 ábrát adtunk hozzá, akkor a következőket írhattuk be:

BTFSC 03h, 0
folytassa itt, ha 1-re van állítva
vagy itt, ha 0-ra van állítva

Abban az esetben, ha a bit állapota 1, abban az esetben a BTFSC utáni utasítás befejeződik. Ha 0-ra van állítva, akkor a következő utasítás kihagyásra kerül. A kód következő része azt mutatja be, amelyben alkalmazható:

Hurok:
:
:
BTFSC 03,0
Menj hurok

A fenti kódban a PIC egyszerűen kijut a hurokból, ha a STATUS regiszter 0. bitje (vagy a Carry flag) 0-ra van definiálva. Vagy pedig a goto parancsot hajtják végre.

BTFSS

Ez az utasítás kimondja az Bit tesztregiszter F és az Ugrás, ha be van állítva lehetőséget. Ez összehasonlítható a BTFSC utasítással, eltekintve attól, hogy a PIC kihagyja a következő utasítást, ha az általunk kiértékelt bit értéke 1 helyett 1.

CLRF

Ez az utasítás a regiszter teljes adatait 0-ra rögzíti. A szintaxis a következő:

CLRF
Ezt korábban használtuk, hogy a portok kimenetét 0-ra állítsuk, a CLRF 85h alkalmazásával. Ezenkívül a portok rögzítésére is alkalmaztuk, hogy a CLRF használatával az összes érintkezõ rögzítse a kimenetet
05h.

CLRW

Ez hasonlíthat a CLRF utasításra, kivéve a W regisztráció törlését. A szintaxis nagyon egyszerűen:

CLRW

RLF és RRF

Ezek az irányok egy regiszterben egy kicsit továbbítanának egy rést balra (RLF) vagy jobbra (RRF) egy regiszterben. Például, ha 00000001-re volt szükségünk, és RLF-et alkalmaztunk, abban az esetben rendelkezhetünk 00000010-tel. Ezen a ponton mi történik abban az esetben, ha 10000000 van és alkalmazzuk az RLF utasítást? Az 1-es bizonyosan a hordozó zászlóban lesz elhelyezve. Abban az esetben, ha még egyszer alkalmaznánk az RLF utasítást, az 1 az elején újra megjelenik. Az RRF utasítás esetében mindkettő fordul elő, ellentétben. Az alábbi pontban bemutatott eset ezt mutatja az RLF utasítás esetében, amelyben láthatjuk a regiszter 8 bitjét, valamint a carry flaget:

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

Példaprogram

Most egy példakódot fogunk látni, amelyet össze lehet állítani és meghajtani. Ez egy szekvenálási fényt generál a PortA 0 bitjétől kezdve, a PortB 8 és a bitig
majd visszatérve.
Csatlakoztassa a LED-eket az egyes port csapokhoz. Nálunk lesz egy kis rész
az ebben az oktatóanyagban bemutatott eljárások.

TIME EQU 9FH A késleltetési hurok változója.
PORTB EQU 06H B port címe.
TRISB EQU 86H B port Tristate címe.
PORTA EQU 05H Port A cím.
TRISA EQU 85H A-port Tristate-cím.
STATUS EQU 03H Oldal kiválasztási regisztráció.
COUNT1 EQU 0CH hurok regiszter.
COUNT2 EQU 0DH hurok regiszter.

BSF ÁLLAPOT, 5 Ugrás az 1. oldalra
MOVLW 00H és állítsa be
A MOVWF TRISB az A és a B portot egyaránt
MOVLW 00H a kimenethez,
Ezután térjen vissza a MOVWF TRISA-ra
BCF ÁLLAPOT, 5. oldal.
MOVLW 00H A port kikötése.
MOVWF AJTÓ

A fő program kezdete

RUNMOVLW
01H Állítsa be az első bitMOVWF-et
PORTB a B. kikötőben
KÉSLELTETÉS Várjon egy kicsitHívás
KÉSLELTETÉS
Mozgassa a bitet a B porton balra, majd szüneteltesse.RLF
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1 Ez áthelyezi a bitet a carry flagbe
Most lépjen az A portra, és mozgassa a bitet balra.RLF
PORTA, 1 Ez áthelyezi a bitet a nulla zászlóból a PortACALL-ba
DELAYCALL DELAYRLF
AJTÓ, 1HÍVÁS
KÉSLELTETÉS
KÉSLELTETÉS
AJTÓ, 1HÍVÁS
KÉSLELTETÉS
KÉSLELTETÉS
AJTÓ, 1HÍVÁS
KÉSLELTETÉS
KÉSLELTETÉS
Helyezze vissza a bitet a Port ARRF-en
AJTÓ, 1HÍVÁS
KÉSLELTETÉS
KÉSLELTETÉS
AJTÓ, 1HÍVÁS
KÉSLELTETÉS
KÉSLELTETÉS
AJTÓ, 1HÍVÁS
KÉSLELTETÉS
KÉSLELTETÉS
PORTA, 1 Ez áthelyezi a bitet a nulla zászlóba. Most mozgassa a bitet
vissza a BRRF portra
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS HÍVÁS KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS
PORTB, 1CALL
KÉSLELTETÉS
KÉSLELTETÉS Most visszatértünk oda, ahonnan indultunk, GOTO
Fuss, menjünk újra.

Van egy remek lehetőség a képzési készletben, amely lehetővé teszi, hogy használjon egy adattáblát.

Az adattáblázat csak az árajánlatok listája, amelyben néhány szempont alapján mindent áttekintenek.
Például lehet egy áramköre, amely olyan PIC-t használ, amely megszámolja azoknak a példányoknak a számát, amelyeknél egy bemeneti tű 1 másodperc alatt magasra nő. Ezt követően kiállíthatja a számot egy 7 szegmenses kijelzőn.

Amint megkezdődött az időzítés, a PIC megkezdi számolni azoknak az alkalmaknak a számát, amelyeknél a tű magasra kerül. 1 másodperc múlva meglátogatja az asztalt, és felnéz az adatokra. Meg kell jelenítenie a kijelzőn azt a számot, amely szimbolizálja a csapok magas helyzetét. Ez előnyös lehet, mivel addig nem határozzuk meg, hogy mi lehet az adat, amíg a PIC nem teljesíti becslését.

Táblázat felhasználásával lehetővé tehetjük a PIC számára, hogy meghatározza, melyik ábrát ábrázolja. Ezen a ponton, mielőtt tovább mutatnám, hogyan működik az adattábla, el kell mondanom, hogy a PIC fenntartja a tartózkodási helyét a programban, amíg a program működik.

Ez megkönnyíti azokat, akik bizonyos programozást hajtottak végre a BASIC programban. Egyébként ne aggódjon, érdemes tovább tanulnia az elméletet. Elképzelhető, hogy létezik az alábbiakban bemutatotthoz hasonló BASIC program:

10 ÉV K = 0
11 K = K + 1
12 HA K> 10 AKKOR GOTO 20 MÁS GOTO 11
20 NYOMTATÁS
21 VÉGE

A program a 10. sorban kezdődik. Amint K értéke 0, a következő lépés a 11. sorra. Miután felvettünk 1-et K-be, ezt követően folytatjuk a 12. sorral.

Ezen a ponton kíváncsiak lehetünk arra, hogy K magasabb-e, mint 10. Ha igen, akkor a 20. sor felé haladunk, különben visszatérünk a 11. sorra.

A 20. sor dokumentálja a K-t, és a 21. sor zárja a programot. A BASIC vonalas statisztikákat alkalmaz, hogy segítse a programozót a nyilvántartás vezetésében a problémák helyéről, mivel a címkék nem engedélyezettek. A PIC címkéket alkalmaz a célállomások közötti elmenekülésre - vagy valóban?

A címkéket annak biztosítására használjuk, hogy tisztában legyünk a problémák helyével, valamint annak biztosításához, hogy képesek legyünk egyszerű módon tájékoztatni a PIC-et a keresés helyéről.

Pontosan az történik, hogy a PIC kihasználja a Program Counter nevű belső vonal számlálóját. A programszámláló (rövidítve: PC) annak a memóriahelynek a nyomvonalát, ahol a jelen utasítás található.

Amikor tájékoztatjuk a PIC-t, hogy látogasson el egy kiválasztott címkére, megérti a memóriahelyet, és ezért addig növeli a számítógépet, amíg meg nem látja a memória célját. Ez pontosan ugyanaz a módszer, mint a fenti BASIC programot. Az alábbiakban látható egy kódrészlet, a memóriaterekkel vagy a PC elemeivel minden utasítás mellett:

PC utasítás0000 movlw 03
0001 movwf 0C
0002 hurok decfsc 0C
0003 goto hurok
0004 vége

A fenti bemutatás során a PC-t 0000-ra javítottuk. Ezen van a movlw 03 utasítás. Amikor a PIC megvalósította ezeket az adatokat, növeli a PC-t annak érdekében, hogy a következő utasításokat beolvassa. Ezen a ponton a PIC megtekinti a movwf 0C-t. A PC ismét növekszik.

Most a PIC-vizsgálatok decfsc 0C-t vizsgálnak. Abban az esetben, ha a 0C részletei nem 0, abban az esetben a PC-t 1-gyel növeljük, valamint a következő utasítás, a goto Loop, tájékoztatja a PC-t, hogy térjen vissza a 0003 pozícióba, amely az említett hurok. Abban az esetben, ha a 0C részlete 0, akkor a PC-nek azt javasoljuk, hogy növelje 2-vel, egyszerűen hagyja ki a következő utasítást.

Az adattáblák megértése

Ez a számítógépet 0004 pozícióba helyezi, ahol a program befejeződik. A rendeltetési helyeket az összeállító rögzíti, és általában nem kell aggódnunk a PC teljesítményével kapcsolatban. Addig úgy találjuk, hogy ellenőrzés alatt kell tartani, akárcsak az adattáblák használatakor. Az adattábla működésének leírására a legkényelmesebb egy szemléltetéssel kezdeni.

PC equ 02
movlw 03
hívóasztal
:
táblázat addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
Visszatérés

Az első utasítás a PC címke hozzárendelését jelenti a programszámláló címével (02h). Hamarosan azután leszünk, hogy a 03h értéket beírjuk a w regiszterbe. Utána kommunikálunk az asztallal. Az alprogram táblájának legelső sora a W regiszter (03h) részleteit egészíti ki a program számlálójához.

Ez arra készteti a programszámlálót, hogy 3-al emeljen, vagy másképpen fogalmazva, serkenti a programszámlálót, hogy 3 sorral lépjen tovább. Míg a számláló 3 sorral lejjebb érkezik, a PIC felismeri a retlw utasítást. Ez a parancs elküldi az utána következő értéket a W regiszterbe, amely után visszatér az alprogramból. A RETLW alapvetően a Visszatérést jelenti, szó szerint W felé.

Lásd: vesszőt helyeztem a Return szó után. Mivel szubrutinban vagyunk, egy Return utasításra van szükségünk annak felszínére. Ezért a RET az utasításban. Miután a RETLW utasítás egy szám, és pontosan ez kerül be a W regiszterbe.

Ebben az esetben ez a 3. ábra. Bármely mennyiséget kijelölhetnénk a W regiszterhez, mindaddig, amíg ez az ábra a programszámlálóval kombinálva van a táblázat alprogramjában, felfedezünk egy retlw utasítást. A fenti ábrán ez azt jelenti, hogy tetszőleges számmal rendelkezhetünk 1-től 7-ig. Ha továbbhaladunk a szubrutinon, befejezhetjük a program egy további szakaszának végrehajtását. Emiatt általában okos lépés az adattáblát pontosan a PIC program vége felé elhelyezni, ezért ha ebben az esetben túllépjük, akkor is a program végére fogunk jutni.

A megszakítások témája a leghosszabb és legkeményebb lehet.

Nem talál semmilyen bonyolult módszert a megszakítások részletezésére, de egy kis szerencsével ennek a résznek a vége felé alkalmazhatja a megszakításokat a saját programjaiban.
A szakaszt 2 szakaszra osztottuk. Ez azt jelenti, hogy lehetővé tegye a téma szekciókra bontását, valamint praktikus segítséget nyújtson az egyszerű megértéshez.

Mi is pontosan a megszakítás? Bizonyára, amint azt a kifejezés is jelzi, a megszakítás olyan technika vagy jel, amely megakadályozza a mikroprocesszort / mikrovezérlőt abban, hogy bármit is végezzen, hogy valami más történhet.

Engedje meg, hogy napi illusztrációt adjak Önnek. Úgy gondolja, hogy a saját otthonában pihen, beszélget egy másik személlyel. Hirtelen megszólal a telefon.

Abbahagyja a beszélgetést, és megragadja a telefont, hogy beszéljen a hívóval. Miután megkapta a telefonos interakciót, úgy dönt, hogy a telefon csengése előtt visszatér az egyénhez. Figyelembe lehet venni a fő rutint, miközben valakivel beszélget, a telefon csengése megzavarja a beszélgetést, és a rutin szünete a telefonon történő beszéd módja.

Míg a telefonbeszélgetés véget ér, akkor visszatér a csevegés elsődleges rutinjához. Ez az ábra pontosan az, ahogyan megszakítja a processzort a cselekvéshez.

Az elsődleges program működik, bizonyos funkciókat lát el egy áramkörben, azonban amikor megszakítás történik, az elsődleges program leáll, miközben egy másik rutint hajtanak végre. a rutin véget ér, a processzor ugyanúgy visszalép az elsődleges rutinhoz, mint korábban.

A megszakítások megértése

A PIC 4 megszakítási forrással rendelkezik. Pár csoportra lehetett őket bontani. Kettő a megszakítások forrása, amelyeket kifelé lehet felhasználni a PIC számára, míg a másik kettő belső folyamat. Hadd tisztázzam itt a két külső típust. A másik kettőt különböző oktatóanyagok fogják leírni, ha időzítőkhöz érkezünk és adatokat tárolunk.

Ha megnézi a PIC kitűzését, akkor észreveszi, hogy a 6-os tű RB0 / INT. Ezen a ponton az RB0 egyértelműen a B port 0. bitje. Az INT azt jelenti, hogy külső megszakító csapként is konfigurálható. Ezenkívül a B port 4–7 csapjai (10–13 csapok) szintén használhatók megszakításokhoz. Mielőtt alkalmazhatnánk az INT vagy más B portokat, két feladatot kell végrehajtanunk. Először tájékoztatnunk kell a PIC-t arról, hogy megszakításokat fogunk használni.

Ezután meg kell jelölnünk, hogy melyik B portot használjuk megszakításként, nem pedig I / O tűként. A PIC belsejében található egy INTCON néven ismert regisztráció, amely a 0Bh címen található. Ebben a regiszterben 8 bitet fog felfedezni, amelyek engedélyezhetők vagy letilthatók. Az INTCON 7. bitje GIE néven ismert. Ez a globális interrngupt engedélyezés. Ennek 1-re javítása tájékoztatja a PIC-t arról, hogy megszakítást alkalmazunk.

Az INTCON 4. bitje INTE, INTerrup Enable néven ismert. Ha ezt a bitet 1-re állítja, akkor a PIC továbbítja, hogy az RB0 megszakító csap lesz. Az RBIE nevű 3. bit konfigurálása tájékoztatja a PIc-t arról, hogy a B port 4–7 bitjeit fogjuk használni. Ezen a ponton a PIC megérti, hogy ez a pin mikor lehet magas vagy alacsony, le kell állítania a teljesítményét, és megszakítással kell folytatnia rutin. Ezen a ponton tájékoztatnunk kell a PIC-t arról, hogy a megszakítás valószínűleg a jel növekvő élén (0 V-tól + 5 V-ig) vagy a leeső élen (+ 5 V-tól 0 V-ig) lesz-e.

Leegyszerűsítve: kívánjuk-e, hogy a PIC szakítson meg minden alkalommal, amikor a jel alacsonyról magasra, vagy magasról alacsonyra mozog. A bűnözéssel megállapítható, hogy az emelkedő szélre helyezhető.

Az él „kiváltása” egy további nyilvántartásban, az OPTION regiszterben van ütemezve, a 81h címre. A kicsit lelkesedünk a 6. bit, amelyet gyakran INTEDG-nek neveznek.

Ha ezt 1-re állítja, a PIC megszakad a szerelési élen (alapértelmezett állapot), és 0-ra állítja a PIC-t arra, hogy megszakítsa a csúszó élen. Ha azt szeretné, hogy a PIC aktiválódjon az emelkedő szélén, akkor biztosan nem kell semmit tennie ezzel a kicsit.

Ezen a ponton sajnos az Opciós regiszter az 1. bankban van, ami azt jelenti, hogy örömmel módosíthatunk a 0-tól az 1-esig, beállíthatjuk a bitet az Opciós regiszterben, miután visszatérünk a 0-os bankhoz. A legfontosabb itt minden bit végrehajtása az 1. bank egyetlen sztrájkban regisztrál, például létrehozza a port csapjait, majd ezt követően visszatér a 0. bankhoz, ha kész.

Rendben, következésképpen értesítettük a PIC-t, hogy melyik pin lesz valószínűleg a megszakítás, és hol kell élt kiváltani, mi történik a programban és a PIC-ben bármikor, amikor a megszakítás megtörténik? Pár dolog zajlik. Legelőször egy „zászlót” ütemeznek.

Ez tájékoztatja a PIC belső processzorát arról, hogy megszakítás történt. Ezután a programszámláló (amiről az előző bemutatón belül beszéltem) tippeket ad egy adott címre a PIC-en belül. Gyorsan ellenőrizzük mindezeket külön-külön. Megszakítási jelző INTCON regiszterünkben az 1. bit az INTF nevű megszakítási jelző. Ekkor, amikor bármilyen megszakítás lép fel, ez a jelző valószínűleg 1-re lesz rögzítve.

Ha nincs megszakítás, akkor a zászló 0-ra kerül. Amellett, hogy ez majdnem minden megvalósul. Ezen a ponton elgondolkodhat azon, hogy „mi értelme van?” Bizony, annak ellenére, hogy ezt a zászlót 1-re tervezték, a PIC nem képes és nem fog reagálni egy újabb megszakításra. Ezért fejezzük ki, hogy megszakítást hajtunk végre. A jelző valószínűleg 1-re lesz rögzítve, és a PIC a rutinunkba mehet a megszakítás miatt.

Amikor ezt a jelzőt nem rögzítették 1-re, és a PIC-nek megengedték, hogy továbbra is válaszoljon a megszakításra, akkor a csap folyamatos pulzálása megtarthatja a PIC visszatérését a megszakítási rutinunk kezdetéhez, és semmiképpen sem fejezi be azt. Visszatérve a telefon illusztrációmra, ez hasonló a telefon felemeléséhez, és ha azonnal megbeszéljük, akkor ismét csengeni kezd, mivel egy másik személy beszélni szeretne veled.

Célszerű befejezni egy párbeszédet, majd újra megragadni a telefont, hogy beszéljen a következő egyénnel. Egy kis problémát találhat ezzel a zászlóval. Annak ellenére, hogy a PIC ezt a zászlót gyorsan 1-re állítja, nem állítja be újra 0-ra! Ezt a tevékenységet a programozónak - vagyis Önnek kell gyakorolnia. Ezt könnyedén meg lehet valósítani, mivel biztos vagyok benne, és ezt el kell érni, miután a PIC elvégezte a megszakítási rutint.

Memória helye Amikor a PIC-et először bekapcsolja, vagy ha van visszaállítás, a programszámláló tippet ad a 0000h címzésre, amely a programmemória kezdeténél azonnal bekövetkezhet. De megszakítás esetén a Programszámláló megadja a 0004h címet.

Ezért miközben olyan programunkat állítjuk össze, amelynek megszakításai lesznek, először is tájékoztatnunk kell a PIC-t, hogy ugorjon át a 0004h címre, és fenntartsa a 0004h címen kezdődő megszakítási rutint, külön a program többi részétől.

Ez gond nélkül elvégezhető. Kezdetben egy ORG néven ismert paranccsal kezdjük a programunkat. Ez a parancs az Origin vagy a start nevet jelzi. Ragaszkodunk hozzá egy címmel. Mivel a PIC a 0000h címen kezdődik, beírjuk az ORG 0000h szót. Ezt követően meg kell kerülnünk a 0004h címet. Ezt úgy érjük el, hogy egy GOTO utasítást adunk hozzá egy címkével együtt, amely tippeket ad az elsődleges programunkra.

Ezt követően még egy ORG-val ragaszkodunk ehhez a GOTO parancshoz, ebben a pillanatban a 0004h címmel. E parancs után illesztjük be a megszakítási rutinunkat. Ezen a ponton esetleg beírhatjuk a megszakítási rutinunkat egyenesen a második ORG parancsot követve, vagy képesek vagyunk elhelyezni egy GOTO utasítást, amely a megszakítási rutinra mutat.

Ez valóban kapcsolatban áll az opcióval az Ön részéről. Az általa kínált PIC tájékoztatásához eljutottunk a megszakítási rutin befejezéséhez, az RTFIE parancsot a rutin vége felé kell elhelyeznünk. Ez a parancs a megszakítási rutinból való visszatérést jelenti. Míg a PIC észreveszi ezt, a programszámláló jelzi a PIC végső helyzetét a megszakítás előtt. Az alábbiakban létrehoztunk egy rövid kódrészt a fentiek megjelenítéséhez:

Van néhány dolog, amelyet tájékoztatnia kell a megszakítások használatakor. A kezdet általában az, hogy ha az azonos regisztert használja az elsődleges programban és a megszakítási rutinban, akkor vegye figyelembe, hogy a regisztráció részletei nagy valószínűséggel megváltoznak, amikor a megszakítás megtörténik.

Például használjuk a w regisztert az adatok továbbításához az A port elsődleges programjához, ezért a w regisztert a megszakítási rutinban is felhasználhatja az adatok egyik célból a másikba történő áthelyezéséhez.

Abban az esetben, ha nem vagy óvatos, a w regiszter tartalmazza a legutóbbi értéket, amelyet a megszakítási rutinban kapott, így amikor visszatérsz a megszakításról, ezeket az információkat az A portba juttatjuk el, nem pedig a korábban birtokolt értéket. bekövetkezett a megszakítás.

Ennek körülménye az, hogy pillanatnyilag elmenti a w regisztráció részleteit, mielőtt újra felhasználná a megszakítási rutinban. A második az a tény, hogy késleltetést találhat az egyik megszakítás és a következő bekövetkezése között. Amíg megértette, a PIC rendelkezik egy külső órával, amely lehet kristály vagy ellenállás-kondenzátor kombináció.

Nem számít, milyen frekvenciájú ez az óra, a PIC elosztja 4-el, amely után ezt alkalmazza a belső időzítéséhez. Például abban az esetben, ha a PIC-hez 4MHz-es kristály kapcsolódik, abban az esetben a PIC 1MHz-en hajtja végre az utasításokat. Ez a belső időzítés Instruction Cycle néven ismert. Ezen a ponton az adatlap azt állítja (kétségtelenül kicsinyített nyomtatással), hogy engedélyeznie kell a megszakítások közötti 3-4 utasítást.

Az lenne a lehetőségem, hogy 4 kört engedélyezzek. A késés oka az, hogy a PIC időt igényel, hogy a megszakítási címre, a jelzőre ugorjon, és visszaérkezzen a megszakítási rutintól. Ezért tartsa ezt a fejében, ha egy alternatív áramkörrel dolgozik a PIC megszakításának aktiválásakor.

Ezen a ponton az a tény, hogy ha a B port 4–7 bitjeit használjuk megszakításként. Nem választhat konkrét csapokat a B porton, hogy megszakításként működjenek.

Ezért ha engedélyezi ezeket a csapokat, akkor valószínűleg mind beszerezhetők. Ezért például nem lehet egyszerűen 4-es és 5-ös bit - a 6-os és 7-es bit valószínűleg egyszerre lesz felhatalmazva. Mi a célja pontosan annak, hogy négy bit megszakítást jelentsen? Bizonyára előfordulhat, hogy van egy áramköre a PIC-hez csatlakoztatva, ha a négy vonal közül bárki magasra kerül, akkor ez olyan kérdés lehet, amelyre a PIC-nek azonnali befolyásolására van szüksége.

Ennek egyik példája lehet egy otthoni biztonsági riasztás, amelyben négy érzékelő van összekötve a B port 4–7 érintkezőjével. Bármely speciális érzékelő felkérheti a PIC-t, hogy riasztást indítson, és a riasztási jelzési rutin a megszakítási rutin. Ez megkíméli a portok folyamatos ellenőrzését, és lehetővé teszi a PIC számára, hogy folytassa a különböző ügyeket. A következő oktatóanyagon belül összeállítunk egy programot a megszakítás kezelésére.

A legutóbbi bemutatón belül sok alapismerettel foglalkoztunk, ezért úgy érzem, eljött az ideje, hogy elkészítettük az első programunkat.

Az általunk írt program megszámolná, hányszor kapcsolunk be egy kapcsolót, majd kiállítjuk a számot.

A program 0-tól 9-ig számolna, 4 LED-en bináris formában megtekinthető, a bemenet vagy a megszakítás valószínűleg az RB0-on lesz.

Az első számú dolog, amit el kell végeznünk, az a tájékoztatás a PIC-ről, hogy ugorjon át arra a címre, amelyre a Programszámláló mutat, amikor megszakítás történik.

Megjegyzi, hogy a hexadecimális számok megjelenítésének egyedülálló módszerét alkalmazzuk. Mielőtt megtörtént, alkalmazzuk az F9h-t, amelyben h hexadecimális értéket jelöl. Ezt felírhatnánk 0xF9 néven, ezt a struktúrát fogjuk mostantól alkalmazni.

Most el kell mondanunk a PIC-nek, hogy megszakításokat fogunk használni, és az RB0 6-os tűt használjuk megszakítási tűként:

bsf INTCON, 7GIE - Globális megszakítás engedélyezése (1 = engedélyezés)
bsf INTCON, 4INTE - RB0 megszakítás engedélyezése (1 = engedélyezés)
Minden esetre törlöm a megszakítás jelzőt (soha nem bízok semmiben!)
bcf INTCON, 1INTF - Tiszta jelzőbit minden esetre

Jelenleg létre kell hoznunk a 2 kikötőnket. Ne feledje, hogy mivel most az RB0-t használjuk megszakító csapként, ezt bemenetként meg kell állapítani:

A kapcsolószámok tárolásához a COUNT nevű változót fogjuk használni. Egyszerűen növelhetnénk az A port értékét, de meglátja, miért használok változót, amikor megírjuk a megszakítási rutinunkat.

Ezért fő programunk összeáll, és ezen a ponton tájékoztatnunk kell a PIC-t arról, hogyan kell folytatni, ha megszakítás történik. Ebben a példában valószínűleg a megszakításunk lesz a kapcsoló. Csak azt szeretnénk, ha a PIC a kapcsoló korlátozásakor a beállítható COUNT-hez tartozik.

Mindazonáltal csak azt szeretnénk bemutatni, hogy a kapcsoló hányszor kapcsol ki 0-ról 9-re. Fentebb kijelentettem, hogy képesek lennénk egyszerűen megnövelni az A port értékét minden alkalommal, amikor megszakítás történik. Az A portnak azonban 5 bitje van, arra az esetre, ha egyszerűen növelnénk a portot, akkor a legmagasabb 31-es számunk lesz. Néhány magyarázat van arra, hogy miért választottam azt, hogy ne lépjek fel 31-re.

Kezdetben egy 7 szegmenses képernyőt alkalmazunk, amely legfeljebb csak 0 és 15 között mozoghat (hexánál 0-tól F-ig). Ezután szeretném bemutatni néhány számtani parancsot, amelyekben az elmúlt órákban megbotlott.

Ezért folytatjuk a megszakítási rutinunkat. Jelenleg az első feladat, hogy röviden tároljuk a w regisztrációnkat, mivel ezt alkalmaztuk a COUNT tartalmának PORTA-ra való áthelyezésére. Abban az esetben, ha nem mentjük el, abban az esetben számtanunk miatt teljesen más számot tudunk leadni. Ezért végezzük el először:

Ezen a ponton megértjük, hogy a COUNT értéke 9 vagy több. Csak annyit kell teljesítenünk, hogy ha a COUNT értéke nagyobb, mint 9, helyezze vissza 0-ra, vagy térjen vissza a főprogramhoz, hogy biztosítsa, hogy képesek vagyunk az A portra továbbítani. A BTFSS parancs, mivel megérti, hogy a következő
utasítás abban az esetben, ha a carry flag ütemezésre kerül, azaz COUNT = 10:

Az egyetlen dolog, ami még hátra van, az a kollektív bevitel, valamint az állandó értékeink meghatározása, amelyeket a programunk elején meg tudunk valósítani.

A bekapcsolás minden egyes bekapcsolásakor a LED-ek binárisan számítanak 0000-tól 1010-ig, majd vissza 0000-ig.

Az alábbi ábra a fent bemutatott kóddal kompatibilis kapcsolási rajzot mutatja. Érdekes módon azt fogja találni, hogy az időzítő kondenzátort beépítették a tervezésbe. Ez egy szép kis fogás, amelyen keresztül megkapja a szabadságot, hogy elkerülje a kondenzátor beépítését, ha nincs magánál ez idő alatt.

Itt a kapacitás az oszcillátor csapján és a földön átterjedt kóbor kapacitáson keresztül játszik szerepet.
Természetesen úgy tűnik, hogy ez nem nagyon intelligens módszer a kondenzátor elkerülésére, mivel a kóbor érték az adott körülményektől függően változhat.

Egy másik szakasz, amely az áramkörben tanúskodhat, a kapcsoló feletti felmondó hálózat. Ez megakadályozza az interferenciát a mechanikus kapcsolás közben, és megakadályozza a PIC zavart keltését, ha a kapcsolás egyetlen vagy több váltás volt.




Előző: Programozható kétirányú motor időzítő áramkör Következő: Hogyan működnek a Buck-Boost áramkörök