|
Én most nem szeretnék belemenni a PIC lelki világába, felépítésébe, erre már született éppen elég cikk. Észrevettem, hogy egy program megírását nem magyarázzák el kellő képpen, így azt elsőre megérteni szinte lehetetlen. Ezért én kicsit hétköznapibban próbálom megközelíteni a dolgot, azzal a céllal, hogy az abszolút kezdők is megértsék, miről is van szó.
Első nekifutásra töltsük le az OSHON PIC simulator szoftvert, ide kattintva.

Ami nekünk ebből lényeg az a Mikrokontroller, illetve a Clock Frequency. A mi esetünkben ez legyen a 16f877-es illetve 4 MHz-es Kvarc.
Ctrl+A paranccsal, behozhatjuk az asm ablakot, ahol elkezdhetjük a programunkat írni.
Amit fontos tudni:
Pontosvesszőt, ( ; ) nem veszi figyelembe program futásakor.
Azaz ha csinálunk egy ilyen sort: ;xy-nak hívnak, szeretem az elektronikát stb...
Egész nyugodtan odaírhatjuk, ettől nem vétettünk hibát. A PIC nem fogja figyelembe venni az ilyen sorokat, egyszerűen átugorja.
Egy pdf állományba összeválogattam a fontosabb utasításokat ez letölthető ITT.
Nem húzom tovább az időt, kezdjük el írni a programunkat.
Program:

Első dolgunk átgondolni mit is szeretnénk. Az első sorban lefoglaltam egy memóriaterületet annak, hogy itt tudjak a későbbiekben számolni. Ez a számolás azért kell, hogy a LED-ek ne csak felvillanjanak, hanem egy darabig világítsanak is. Így lesz tulajdonképpen látható a folyamat.
Ehhez az EQU parancsot használtam, és a 20-as memóriaterületet foglaltam le. Az (A) betű csak az elnevezése. Oda bármit írhattam volna, de mi most írjunk A-t.
ORG 0 paranccsal alaphelyzetbe állítom a PIC-et, ezt minden program elején tegyük meg.
GOTO utasítás oda ugrik, ahova megadom neki. Jelen esetben a BEÁLLÍTÁSOK-hoz fogunk ugrani, ahol definiáljuk a ki illetve bemeneteinket.

Ha még nem tettem volna, akkor most elmondom, hogy a különböző programrészeket érdemes valamiféle kép elválasztani egymástól. Ezt én így szoktam: ;--------------, de ezt mindenki fantáziájára bízom, a lényeg hogy a pontosvessző is ott legyen.
Első paranccsal tulajdonképpen semmit nem csinálok, megszokásból írom, letörlöm a B portot, hogy az is "alaphelyzetbe" kerüljön.
BANKSEL utasítással a BANK-ok között tudunk váltani. Erre azért van szükség, mert ahhoz, hogy kimenetnek vagy bemenetnek definiáljam a port-okat, a BANK1-be kell lépnem (ezt adatlapból meglehet nézni).
A TRISB a BANK1-be van, így ha a BANKSEL utasítás után a TRISB-t írom, jó helyre kerülök.
Akkor kimenet egy láb, ha azt 0-ba helyezem. Ezt meglehet tenni lábanként, is: BCF TRISB,0
Ekkor a portb, 0 lesz kimenet. Ezt viszont 1 paranccsal is megtehetem úgy, hogy törlöm az összest, így tulajdonképpen mindet 0-ba állítottam, ezért az összes kimenet lesz.
Ahhoz, hogy tovább tudjak menni, vissza kell lépnem BANK0-ba, ezt a már említett BANKSEL utasítással tudom megtenni, mellé pedig a PORTB-t írjuk.
Ehhez a programhoz mindent beállítottunk, amit kellett. GOTO Program utasítással továbbugrok a Fő programomhoz.

A program első ránézésre tűnik csak bonyolultnak, ha kitárgyaltuk barátságosabb lesz.
Ebből tulajdonképpen 3 sort kell megbeszélnünk, bizonyára észrevettétek a többi csak ismétlődik.
A PIC minden tevékenységet egy úgynevezett Munkaregiszterben hajt végre, legalább is ezen keresztül kell megtennünk,amit szeretnénk. Ennek a jele: W
MOV utasítás mozgatást jelent, az F pedig Flag-et, aminek az értéke 1.
Első utasítással, bemozgatunk munkaregiszterbe egy bináris számot. Látható, hogy ez 4 bites, ebből már lehet következtetni, hogy ez valószínű a 4 kimenetünk lesz.
A következő, amit meg kell tennünk, hogy kimozgatjuk a munkaregiszter tartalmát a B portra. Ha ezt megtettük, a PIC ki fogja ezt szépen sorba helyezni, RB.0-RB.3-ig.
Tehát : RB.0 1
RB.1 0
RB.2 0
RB.3 0
Ezután behívunk egy úgynevezett szubrutint, ez a fő programtól független programrészlet, amelyet a CALL utasítással tudunk behívni a programunkba. Jelen esetben a rutin neve IDŐ, ezért lesz az utasítás: CALL IDŐ

Itt bemozgatunk egy Decimális számot a munkaregiszterbe, onnan pedig átmásoljuk a programunk elején erre a célra lefoglalt A nevű memóriaterületünkre.
A DECSZ utasítás azt csinálja, hogy addig vonogat egy értékből, míg az 0 nem lesz, és ha 0, akkor átugorja a következő utasítást.
Jelen esetben az A értéke 50. Ebből levon 1-et, az eredmény nem 0, ugrik a következő utasításra, ami visszairányítja újra a DECFSZ-hez. Az X helyére bármi írható, ez jutott először eszembe.
Ha szépen levonogatott az 50-ből mindaddig, míg az eredmény nem lett 0, akkor átugorja a GOTO utasítást, a következő pedig a visszatérés a szubrutinból=RETURN.
Ezzel vége is a programunknak, de a végére ne felejtsük odaírni az END -et.
Ha mindent pontosan így írtatok be, és követtétek a tanácsaimat, akkor nyomjunk F8-at.
Ha elmentettük, lefuttat egy hibakeresést. Ennek természetesen a következőképp kell kinézni.

Nézzünk egy példát, hibára.

Ami ebből a lényeges, hogy a 17. sorban van a hiba. Odamegyünk a 17. sorhoz, és megnézzük mit rontottunk.

Én most azt rontottam el, hogy a TRISB utasítást elgépeltem. Ha ezt javítjuk nem lesz hiba.
F8 paranccsal azonnal be is töltjük a szimulátorunkba a megírt programot, illetve le is fordítja hex kiterjesztésbe.
Nyissuk meg a Tools menüből a LED panelt.

Remélhetőleg ez alapbeállításként a B porton van, de ha mégsem állítsuk be.

PORTB,0 feliratra kattintva előjön a jobb oldali ablak. A szürkével kijelölt beállítások az aktívak azaz PORTB és a 0. bit.
Miután beállítottuk az összes LED-et a megfelelő bit-ekre indítsuk el a szimulációt.

Rate menüben állítsuk be Extrém gyorsra a sebességet, illetve indítsuk el a szimulációt F1-el vagy menüből kiválasztva.
Köszönöm a rám szánt időt, mindenkinek jó PIC-ezést kívánok!
Regényi Dávid
|