online kép - Fájl  tubefájl feltöltés file feltöltés - adja hozzá a fájlokat onlinefedezze fel a legújabb online dokumentumokKapcsolat
  
 

Letöltheto dokumentumok, programok, törvények, tervezetek, javaslatok, egyéb hasznos információk, receptek - Fájl kiterjesztések - fajltube.com

Online dokumentumok - kep
  

Matlab Feltételkezelés



felso sarok

egyéb tételek

jobb felso sarok
 
 
bal also sarok   jobb also sarok

Matlab Feltételkezelés

Tartalom
A BTFSx utasítások
Program a feltételes elágazásra
Értékvizsgálat és a STATUS regiszter

A BTFSx utasítások

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.

Program a feltételes elágazásra

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


Felhasználási feltételek