Fórum témák

» Több friss téma
Cikkek » Nulláról a robotokig - PIC Mikrovezérlők I rész
Nulláról a robotokig - PIC Mikrovezérlők I rész
Szerző: Topi, idő: Jún 12, 2007, Olvasva: 119717, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   13 / 24

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 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):

  1. MOVLW   d'91'   ;Berakjuk a Work-be a decimális 91-et
  2. XORLW   d'91'   ;Work regisztert össze XOR-oljuk a 91-el
  3. MOVLW   h'00'   ;Berakjuk a Work-be a nullát (LED-ekhez)
  4. BTFSC   STATUS, Z   ;Status regiszter Zero bitjét megvizsgáljuk
  5. MOVLW   h'FF'   ;Ha zero akkor FF-et teszünk a Work-be
  6. 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!
Következő: »»   13 / 24
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem