kategória | ||||||||||
| ||||||||||
| ||
|
||||||||||
Matlab Feltételkezelés
Tartalom
A BTFSx utasítások
Program a feltételes elágazásra
Értékvizsgálat és a STATUS regiszter
Aki már programozott valaha is valamilyen programnyelven, az tudja
hogy a programok attól fognak "gondolkodni", ha feltételek alapján
tudnak dönteni, hogy merre tovább. Már pedig ha pl. egy höszabályzó
áramkört készítünk PIC-kel, (amit azért egy jó ideig biztosan nem fogunk) akkor
nem árt ha a program el tudja dönteni - a hömérséklet alapján, ami számadatként
áll rendelkezésére -, hogy mikor kell be- és kikapcsolni a fütést.
A feltételkezelésre PIC-ben a BTFSC és BTFSS (Bit Test File, Skip If Clear/Set)
utasítások állnak rendelkezésre. A gyakorlattól eltéröen két paraméterük
van, egy regiszter és egy szám 0 és 7 között. Példa a BTFSC müködésére:
BTFSC PORTA,7
Ennél az utasításnál a PIC megnézi, hogy PORTA utolsó helyiértékü
bitje 0-e. Ha az, akkor átugorj 545j95f a a soron következö utasítást, ha egy,
akkor rendesen fut tovább.
Például:
MOVLW d'15' BTFSC PORTA,7 MOVLW d'20' MOVWF PORTB
Elöször az akkumulátor értéke 15 lesz. Majd ha PORTA hetedik
bitje nulla volt, akkor kihagyjuk a következö (MOVLW d'20') utasítást és 15 kerül ki a PORTB-re. Ha
viszont PORTA hetedik bitje egy volt, akkor az akkumulátor felveszi a 20
értéket és az íródik ki a PORTB-re.
Persze a legtöbbször roppant kevés nekünk, hogy az egyik elágazásnak csak egy
utasításnyi helye van. Ezért hasznosabb, ha a BTFSC után rögtön egy GOTO utasítást helyezünk el, így az
"egyutasításos" feltételnél több utasítást is végrehajthatunk.
Például ha XYZ regiszter negyedik bitje 0, akkor kerüljön 15 a PORTA-ra, de ha
XYZ negyedik bitje 1, akkor kerüljön 20 a PORTB-re:
BTFSC XYZ,4 GOTO IDE MOVLW d'15' ; ide akkor kerül a vezérlés, ha XYZ 4. bitje 0. MOVWF PORTA GOTO TOVABB IDE MOVLW d'20' ; ide pedig akkor, ha XYZ 4. bitje 1. MOVWF PORTB TOVABB ...
A BTFSS annyiban különbözik a BTFSC-töl, hogy a feltétele fordítva dolgozik. Vagyis akkor ugorja át a soron következö utasítást, ha a paraméterében megadott bit 1 és nem 0.
Alakítsuk át már meglévö programunkat úgy, hogy legyen benne
feltételes utasítás!
Indítsuk az MPLAB-ot a TAN.PJT projektünkkel, majd készítsük fel az új
programra az elözö számban megismert módszerrel. Azaz elöször
töröljük ki a kódot a VISSZA címkéig, majd mentsük el más néven a programot a File/Save
As segítségével. Névnek adjuk meg: FELTETEL.ASM. Ezután CTRL+F3-mal vagy a Project/Edit
Project menüponttal állítsuk be hogy a FELTETEL.ASM lesz a lefordítandó
állomány.
Elöször csak annyit írjunk meg, hogy az elsö gomb állásától
függöen vagy az elsö LED világít és a második nem, vagy a második LED
világít és az elsö nem. Valahogy így:
Gomb |
LED1 |
LED2 |
felengedve |
világít |
nem világít |
lenyomva |
nem világít |
világít |
A program utolsó sora után tegyünk ki egy VISSZA címkét és lássunk is hozzá a
programozáshoz!
A program pofon egyszerüen fog müködni:
1. Megnézzük, hogy milyen az állapota a használt gombnak (PORTA,0)
2. Ha nincs lenyomva, akkor LED1 be, LED2 ki.
3. Ha le van nyomva, akkor LED1 ki, LED2 be.
Vagyis:
VISSZA
BTFSS PORTA,0
GOTO LENYOM
BSF PORTB,0
BCF PORTB,1
GOTO VISSZA
LENYOM BCF
PORTB,0
BSF PORTB,1
GOTO VISSZA
END
A BTFSS utasítás megvizsgálja a gombot, mely a PORTA 0-dik bitjén van. Ha a
gomb le van nyomva (azaz a bit értéke 0), a program futása a következö
sorral folytatódik, ahol is a GOTO utasítás a LENYOM címkére ugrasztja a
programot. Ha a gomb nincs lenyomva, a GOTO utasítást átlépjük. A BSF és BCF
utasítások állítják be a LED-eket. (A BCF ki-, a BSF bekapcsol egyet) Mindkét
esetben egy GOTO VISSZA utasítás újra kezdi az ellenörzést.
Az elözö számban megismert "Pin Stimulus" segítségével
érdemes emulálnunk a gomb különbözö állásait, majd egyesével végiglépkedni
a sorokon F7-tel, ezzel figyelve a BTFSS müködését. Továbbá próbáljuk ki,
hogy mi történik akkor, ha a BTFSS utasítást BTFSC-re cseréljük! (Azonban
lecserélés után ne felejtsünk el újrafordítani!)
A kész példát le is tölthetjük innen Értékvizsgálat
és a STATUS regiszter
Most már a PIC-ünk gondolkodik is, nem csak egyszerüen végrehajt egymást
követö utasításokat. Azonban a késöbbiekben tapasztalni fogjuk, hogy
sokszor nem elég egy regiszter valamely bitjének vizsgálata, hanem a teljes
regiszter értéke alapján kell döntést hoznia a programnak. Például mi van, ha
egy olyan programot akarunk írni, ami folyamatosan növeli SZAML regiszter
értékét, és minden LED-et bekapcsol, ha SZAML értéke eléri a 15-öt? SZAML
regiszter egyetlen bitjének vizsgálata ehhez nem elég. Bár ha furfangosak vagyunk,
akkor megoldható a probléma nyolc BTFSx utasítással, melyek egyenként
végigtesztelik a biteket. Ennél azért egyszerübben is megoldható a
probléma, egy logikai cselfogással. A kizáró vagy müvelet (XOR)
különlegessége, hogy ha két ugyanolyan szám között végezzük el, akkor nullát ad
eredményül.(És mellesleg csak ebben az esetben ad vissza nullát) Hogy ez
miért jó nekünk? Ideje megismernünk a STATUS regisztert!
A STATUS regiszter értéke minden egyes végrehajtott parancs után felveszi a
végrehajtás állapotát. Minden egyes bitje valami másnak az állapotát jelzi.
Éppen ezért ezeket jelzöbiteknek
hívjuk. Az MPLAB a STATUS regiszter mindegyik bitjének ad egy nevet, így nem
szükséges megjegyeznünk, hogy egy-egy állapotjelzö bit melyik helyiértéken
van, hanem elég csak a bit elnevezését tudnunk. A továbbiakban is csak a nevük
alapján fogjuk azonosítani ezeket. (A kép a PIC16F84 hivatalos
dokumentációjából származik, ami letölthetö erröl a honlapról is.)
Ami most nekünk kell, az a Z (Zero, azaz nulla) jelzöbit. Ennek az a
feladata, hogy ha az utolsó végrehajtott utasításban végzett számítás eredménye
nulla lett, akkor felveszi az 1 értéket. Minden egyéb esetben nullát ad vissza.
Akkor hát kapcsoljuk össze, amit eddig megtudtunk! Úgy csinálhatunk elágazást
teljes regiszterérték alapján, hogy
1. XOR müveletet végzünk a kérdéses regiszter és az összehasonlítandó
érték között. (A fenti példában SZAML és 15 között)
2. Ha SZAML értéke éppen 15 volt, akkor a XOR müvelet eredménye nulla
lesz, és ettöl a Z jelzöbit felveszi az 1 értéket.
3. Egy BTFSx utasítással megvizsgáljuk a Z jelzöbit értékét és ez alapján
elágazhatunk.
Még jobban összefoglalva: ha a két érték (amit összehasonlítunk) egyenlö,
akkor Z=1 lesz.
Példa:
CLRF SZAML
VISSZA
INCF SZAML
MOVFW SZAML
XORLW .15
BTFSS STATUS,Z
GOTO VISSZA
MOVLW h'ff'
MOVWF PORTB
GOTO VISSZA
END
A példa a PIC-ben nem sokat mutatna, hiszen a SZAML regiszter a másodperc
törtrésze alatt elszámol 15-ig, így gyakorlatilag csak annyit látnánk, hogy
bekapcsoljuk az áramkört és a LED-ek azonnal kivilágítanak. Ettöl
függetlenül a példa letölthetö innen, kiegészítve a bevezetö részekkel (beleértve
a SZAML regiszter deklarációját is).
Ezek után próbáljunk készíteni magunktól egy olyan programot, ami egy egyirányú
futófényt valósít meg. A gombok állásától függöen menjen a fény. Tehát ha
a G1 gombot megnyomjuk, akkor jobbról balra fusson, G2-re pedig balról jobbra.
A következö számban benne lesz a megoldás, valamint ennek
egyszerüsítése a forgató utasítássokkal és a STATUS regiszter C
jelzöbitével.
Találat: 847