Az assembly nyelv volt a legelső nyelv. Annyira hardver közeli, hogy ténylegesen neked kell egy összeadásnál megadni hogy mit és hogyan végezzen el az ALU.
Egy assembly parancs a következőkből áll:
UTASÍTÁS PARAM1 (PARAM2)
Két fajta paramétert érdemes tudnunk hogy mi, ez a literális és fájl paraméter. PIC-ek esetében a literális annyit tesz hogy konstans érték (egy konkrét betű, vagy egy szám, pl. 6), vagy fájl ami egy változót egy regisztert jelöl.
Literális értékeket L-el vagy K-val jelöljük, Fájl regisztereket minden esetben F-el.
Első teszt programunkhoz nem kell sok parancsot ismerni, íme pár fontos:
Parancs neve |
Paraméterei |
Hatása |
ADDLW |
k |
Literális kifejezést hozzáadja (számként) a W regiszterhez |
ADDWF |
f,d |
Az F regiszter (paraméter) értékéhez hozzáadja a W regisztert |
BCF |
f,b |
Az F regiszter b. bitjét törli = nullára állítja (BCF = Bit Clear F) |
BSF |
f,b |
Az F regiszter b. bitjét beállítja = egyre állítja (BSF = Bit Set F) |
BTFSS |
f,b |
Kihagyja a következő sort, ha az f regiszter b. bitje 1 (SS -> Skip If Set) |
BTFSC |
f,b |
Kihagyja a következő sort, ha az f regiszter b. bitje 0 (SC -> Skip If Clear) |
CALL |
k |
Szubrutint hív |
CLRF |
f |
Az f regisztert törli (tele lesz nullákkal) |
CLRW |
|
Törli a Work regisztert (az akkumulátort) |
CLRWDT |
|
Törli a WatchDog timert |
DECF |
f,d |
Az f regiszter értékét csökkenti egyel, d = cél regiszter |
DECFSZ |
f,d |
Az f regiszter értékét csökkenti egyel, ha elérte a nullát átugorja a következő sort |
GOTO |
k |
A k paraméterben megadott labelre vagy sorra ugrik. $ = aktuális sor. Pl. parancs utáni 5. sorra ugrás = "GOTO $+5" |
INCF |
f,d |
Növeli egyel az f regisztert, d = cél regiszter |
INCFSZ |
f,d |
Növeli egyel az f regisztert, d = cél regiszter. Ha elérte az f értéke a nullát (pl. túlcsordult 255-nél) átugorja a következő sort |
MOVF |
f,d |
F regisztert átrakja (átmásolja) a d regiszterbe. Ha nincs megadva d, akkor a Workbe |
MOVLW |
k |
Literális értéket (pl. 6) berakja a Work regiszterbe |
MOVWF |
f |
A Work regiszter értékét berakja az f regiszterbe |
NOP |
|
A legfontosabb parancs. Nem csinál semmit (NOP = No OPeration), időzítéseknél fontos |
RETFIE |
|
Visszatér a megszakításból (Return From IntErrupt) |
RETLW |
k |
Program számlálóval befolyásolt érték visszaadás (később példa) |
RLF |
f,d |
Az f regiszter bitjeit balra forgatja. Ami a legszélén kiesett újra berakja a jobb szélére. Körbe forog ténylegesen |
RETURN |
|
Visszatér a szubrutinból |
RRF |
f,d |
Ugyan az mint az RLF, csak ez jobbra forgat |
SLEEP |
|
Elalszik a PIC. Interruptok felébreszthetik, áram takarékossági funkciók |
SUBLW |
k |
Literálisból kivonja a Work értékét, eredményt visszapakolja a W-be |
SUBWF |
f,d |
Az f regiszterből kivonja a Work értékét, és az eredményt beteszi a d-be. Ha d nulla vagy nincs megadva, akkor vissza a Workbe. |
SWAPF |
f,d |
A 4 bites nibbléket cseréli meg az f regiszterbe, és eredményt a d-be teszi. Ha üres itt is a Work-be |
XORLW |
k |
A Work értékét XOR-olja a k literálissal, eredményt a W-be teszi |
XORWF |
f,d |
A Work értékét XOR-olja az f regiszter értékével, eredményt a d-be teszi, vagy ha nulla akkor a Workbe. |
Most kezet csókolhatsz nekem, hogy ennyit írtam, mikor a PIC adatlapjában is benne van... Igaz csak angolul.
ASM esetén szívunk sokszor, a BANK-ek miatt. Néha BANK-et kell váltani, a nekünk kellő regiszter nem a 0. BANK-ben van. Hogy mit is magyarázok, később majd világos lesz, konkrét példánál.
Assemblyben nem működik a sima = ha meg akarod nézni hogy két változó egyenlő-e. Az összehasonlítást mégis meg tudjuk csinálni, a XOR művelet segítségével. Íme egy példa (Work regiszter értékét hasonlítjuk össze a 91-el):
MOVLW d'91' ;Berakjuk a Work-be a decimális 91-et
XORLW d'91' ;Work regisztert össze XOR-oljuk a 91-el
MOVLW h'00' ;Berakjuk a Work-be a nullát (LED-ekhez)
BTFSC STATUS, Z ;Status regiszter Zero bitjét megvizsgáljuk
MOVLW h'FF' ;Ha zero akkor FF-et teszünk a Work-be
MOVWF PORTD ;Kirakjuk a portra
Ennek a kódrészletnek az eredménye az lesz, hogy ha a 91 egyenlő a 91-el akkor világítani fog az összes LED a PORTD-n, ha nem akkor nem világít egyik sem.
Nézzünk egy ledvillogtató programot ezen a nyelven...
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!