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 Bitforgatas



felso sarok

egyéb tételek

jobb felso sarok
 
 
bal also sarok   jobb also sarok

Matlab Bitforgatás

Ez a rész összpontosít a maradék dolgokra, amit még tudnunk érdemes, mielött egy szinttel feljebb lépünk, a megszakításokhoz. Elöször az elözö szám "házi feladatára" lássunk valami megoldást. A feladatra számos megoldás kínálkozik. Legegyszerübb, ám a leghosszabb is, ha két rutin írunk, melyböl az egyik balra, a másik jobbra futtatja a fényt, egy rövid kódrész pedig a kettö között kapcsol, a gombok állásának megfelelöen. Ezen belül is több lehetöség kínálkozik, például egymás után állítgathatjuk a LED-eket konstans értékekkel, vagy valami logika szerint is "tolhatjuk" a fényt. Elöször az elsö megoldásnak essünk neki - ami leginkább az elsö programunkra fog emlékeztetni - majd próbáljuk ki kissé fejlettebb technikával is!

VISSZA: BTFSS PORTA,0 GOTO BALRA
BTFSS PORTA,1
GOTO JOBBRA
GOTO VISSZA

JOBBRA: MOVLW B'10000000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'01000000' 
MOVWF PORTB
CALL DELAY 
MOVLW B'00100000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00010000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00001000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00000100' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00000010' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00000001' 
MOVWF PORTB 
CALL DELAY 
GOTO VISSZA

BALRA: MOVLW B'00000001' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00000010' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00000100' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00001000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00010000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'00100000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'01000000' 
MOVWF PORTB 
CALL DELAY 
MOVLW B'10000000' 
MOVWF PORTB 
CALL DELAY 
GOTO VISSZA 

A CALL utasítások által hivatkozott DELAY rutin a már eddig megismert késleltetö rutin egy az egyben. Ezt most helytakarékosság miatt nem közöltem le újra, de ha el akarjuk készíteni a programot, akkor szükségünk lesz rá. A lefordításra kész .asm fájl - amelyben már a DELAY is benne van - letölthetö innen. Ezzel a megoldással van azért némi probléma. Az egyik legnagyobb gond az, hogy csak egyszer fut végig, utána újra meg kell nyomni valamelyik gombot. (Vagy folyamatosan nyomva kell tartani.) Ezen persze könnyen lehet segíteni, mindössze a tesztelö részt kell átírnunk, hogy a gombok le nem nyomott állapotában ismételje meg az utolsó futást. A másik probléma pedig, hogy a kód nagyon hosszú. Ha profi PIC programot készítünk, bizony hamar tapasztalni fogjuk, hogy nagyon kevés memóriával gazdálkodhatunk, így ahol csak lehet, rövidítsünk a kódon! Futófényünkhöz egy igen remek megoldás van a rövidítésre, a forgatóutasítások használata. A forgatóutasítások annyit tesznek, hogy a megadott regiszter tartalmát eggyel jobbra vagy balra csúsztatják. Például ha egy regiszter értéke binárisan 00110010, akkor abból jobbra forgatás után 00011001 lesz. Ezen felül a jobboldalt "lecsúszott" bit (jelent esetben egy "nulla" bit), átkerül a másik oldalra. Pont ez kell nekünk! Gyakorlatilag egy utasítás helyettesíti minden szenvedésünket. (Pontosabban kettö, mert a másik irányba való forgatáshoz másik utasítás kell.) Sajnos még van egy dolog, ami megkeseríti az életünket. De ezzel egyelöre ne foglalkozzunk! Balra az RLF (Rotate Left File), jobbra az RRF (Rotate Right File) utasítás forgat.

A következö lesz a terv: a program elején a kapcsolótesztelö ciklust módosítjuk, hogy ne várjon a gomblenyomással, hanem menjen tovább a legutolsó billentyülenyomás szerint a program, ha nincs lenyomott gomb. Ezután magukat a JOBBRA és BALRA címkéjü rutinokat kicseréljük a pársoros RLF és RRF utasításos megoldásra.

Elöször is töröljünk ki mindent a VISSZA címkéig! Bevezetésképpen állítsunk be egy értéket PORTB-nek, hiszen a késöbbiekben csak forgatni fogjuk a már meglévö tartalmát. Ezen felül vezessünk be egy IRANY regisztert, ami a kapcsoló kiértékelésekor fogja mutatni, hogy merre menjünk tovább, ha nem volt gomblenyomás. Gépeljük be az alábbi sorokat közvetlenül az utolsó sor (vagyis a BCF utasítás) után:

MOVLW B'10000000'
MOVWF PORTB

CLRF IRANY

Mint látható, még nem helyeztünk el VISSZA címkét. A VISSZA címke csak ez után fog jönni, hiszen a PORTB-t nem akarjuk minden egyes ciklusban 10000000-ra állítani, ahogyan az IRANY regisztert sem törölni. Azonban az új regiszter felvételét jelezni kell a CBLOCK direktívánál is. Ezután a CBLOCK rész így kell, hogy kinézzen:

CBLOCK 0x0C T1
T2
IRANY
ENDC

Nézzük, miként tudjuk megoldani a gombok problémáját! Szögezzük le, hogy ha IRANY értéke 0, akkor balra mutat, ha 1, akkor pedig jobbra! Ezután a kapcsolótesztelés müködjön az alábbiak szerint:

1. Olvassuk be IRANY értékét.
2. A gombok állásának megfelelöen írjunk bele 0-t, 1-et, vagy ha nincs gomb lenyomva, akkor írjuk vissza a régi értékét.
3. IRANY értékének megfelelöen ugorjunk a JOBBRA vagy BALRA címkére.

Mindezt valahogy így, amit hozzá is tehetünk programunkhoz:

VISSZA: MOVFW IRANY

BTFSS PORTA,0

MOVLW 00
BTFSS PORTA,1
MOVLW 01
MOVWF IRANY

XORLW 01
BTFSC STATUS,Z
GOTO BALRA

Az elsö MOVFW utasítás valósítja meg az elsö pontot, vagyis az akkumulátorba olvassuk az IRANY regisztert. A következö öt sorral oldjuk meg a második pontot, vagyis a kapcsolóknak megfelelöen 0-ra, 1-re változtatjuk az akkumulátort, vagy békén hagyjuk. Bárhogyan is változtattuk (vagy nem változtattuk), azt visszaírjuk az IRANY-ba. A maradék sorok képviselik a harmadik pontot, vagyis az elugrást. Minthogy IRANY regiszternek csak az elsö bite változik, böven elegendö lenne egy BTFSC utasítás a tesztelésére. Azonban most tanulásképpen az elözö számban tárgyalt egzakt tesztelést használunk, vagyis a BALRA címkére csak akkor ugrunk, ha IRANY értéke csak és csakis 1! JOBBRA címkéhez nem kell külön elágazás, mert kihasználjuk, hogy a feltétel hamis kiértékelése esetén a következö sorra ugrik a program, így elegendö, ha oda tesszük a jobbra forgató kódot. Ennek megfelelöen kezdjünk is neki a jobbra forgatásnak!

JOBBRA: RRF PORTB,F CALL DELAY
GOTO VISSZA

Az elsö utasítással elvégezzük az oroszlánrészét a forgatásnak. PORTB tartalmát eggyel jobbra forgatjuk. (A vesszövel elválasztott "F" annyit jelent, hogy a végeredményt tegye vissza a regiszterbe. Lehet még "W", ekkor az akkumulátorba kapjuk az elforgatott értéket.) Ezután késleletünk egyet és vissza is térhetünk a gombteszteléshez. A balra forgatás is ugyanígy néz ki, melyet tegyünk a jobbra forgató rutin után:

BALRA:   RLF PORTB,F CALL DELAY
GOTO VISSZA

A programot egészítsük ki még a DELAY rutinnal és kész is a tökéletes futófényünk, amit akkor és úgy fordítgatunk, amikor és ahogyan csak akarunk! Vagy mégsem? Valami itt nem O.K.! A PIC áramkört amikor bekapcsoljuk, hol normálisan müködik, hol pedig egyszerre két LED világít. Valami árulás van itt! Az árulás forrása pedig nem más, mint a C (Carry) jelzöbit, mely a Z-hez hasonlóan, szintén a STATUS regiszter részét képezi. Ennek a bitnek a szerepe egy amolyan ideiglenes tároló az utasítások számára. Pl. túlcsorduláskor (vagyis ha túl sokat adunk össze egyszerre) a "kilógó" helyiértéket tárolja. Forgatásnál pedig ebböl és ebbe tárolnak a forgatóutasítások, mégpedig az alábbi folyamat szerint:

1. A PIC elforgatja a megadott regisztert,
2. A "hiányos" részre berakja a C értékét,
3. A "lelógó" részt pedig beteszi C-be.

Tehát programunk helyes müködése mindössze attól függ, hogy induláskor a C jelzöbit "beleszemetelt"-e a forgatásba, vagy sem. Hogy biztosra vegyük, hogy nem szemetel bele, a program elején törölnünk kell a C jelzöbitet! (Elméletileg a forgatóutasítások elött kéne, de ez további problémákat vet fel, és mi egyébként sem használunk más olyan utasítást, ami a C jelzöbitet használná.) Ehhez szúrjunk be egy CLRC utasítást a VISSZA címke elé.

Programunk ezzel valóban tökéletessé válik. A kész forráskódot letölthetjük innen.


Találat: 510


Felhasználási feltételek