kategória | ||||||||||
| ||||||||||
| ||
|
||||||||||
Matlab Bevitelkezelés
Tartalom
Program a bevitelkezelésre és a bevitel-szimulálás
Bevinni adatot a PIC-be hasonlóképpen tudunk, mint ahogyan kivittük az
elözö számban. Csak ezúttal a PORTA-t használjuk és nem írni fogunk
bele, hanem olvasni belöle.
Példaképpen készítsünk egy olyan programot, ami beolvassa a kapcsolók állását,
majd azoknak megfelelöen kigyújtja az elsö és/vagy második LED-et. (A
többi LED-et most nem használjuk.) A kapcsolókat a PORTA elsö és második
lábára kötöttük (RA0 és RA1), tehát ezeket kell elöször beolvasnunk, majd
kiírnunk a PORTB-re, ahova is a LED-eket kötöttük. Kezdjünk is neki!
Elsö lépésként vegyünk elö valamilyen fájlmenedzsert (pl. Windows
Intézö, Windows Commander, stb.), majd az elö 818d36i zö leckében
elkészült "elso.asm" programunkról készítsünk egy másolatot ugyanabba
a könyvtárba "masodik.asm" néven. Nyissuk meg az MPLAB-ot. Ha nem
használtuk az elözö lecke óta, megkérdezi hogy az utolsó projekten
("tan.pjt") akarunk-e dolgozni. Azon akarunk, tehát nyomjuk meg a Yes
gombot. Ha nem kapunk ilyen kérdést, vagy azóta már dolgoztunk más projekten
is, akkor a Project/Open project menüponttal (vagy a CTRL+F2-vel)
nyissuk meg a "tan.pjt" fájlt. Zárjuk be az "elso.asm"
ablakát, majd a File/Open menüponttal nyissuk meg a
"masodik.asm"-et. Méretezzük át az új ablakot úgy, hogy ne takarjon
semmit sem. Ha megvagyunk, klikkeljünk a Project/Edit Project
menüpontra, vagy nyomjunk CTRL+F3-at. Jelöljük ki az "elso [.asm]"
sort, majd nyomjuk meg a Delete Node gombot.
Ezután nyomjuk meg az Add Node gombot és a megjelenö
panelen nyissuk meg a "masodik.asm" fájlt. Az MPLAB ekkor
figyelmeztet minket, hogy a végleges fájl neve meg fog változni. Nyomjuk meg az
OK gombot elöször a figyelmeztetö üzeneten, aztán az Edit
Project ablakban. Tanácsos most elmenteni a projektet a Project/Save Project
menüponttal.
Megjegyzés: Eredetileg egy projekt egy programhoz szól, az
egyszerüség kedvéért mi azonban végig ugyanabban a projektben fogunk
dolgozni, hogy ne kelljen újra meg újra beállítani a projekt tulajdonságait.
Töröljük ki a CBLOCK...ENDC
részt. Ezután menjünk a VISSZA címkéhez és töröljünk ki onnantól lefele
mindent!
Ezután mentsük el a fájlt a File/Save menüponttal, vagy a CTRL+S billentyükkel. Most annyit tettünk, hogy átvettük az elözö programból az inicializációs részt. Megcsonkított programunk aljára gépeljük be az alábbi részt:
VISSZA MOVFW PORTA MOVWF PORTB GOTO VISSZA END
A kód magáért beszél. Egy MOVFW utasítással beolvassuk PORTA tartalmát
az akkumulátorba (emlékezzünk hogyan kell értelmezni a MOV után álló két
karaktert!), majd MOVWF utasítással kiírjuk azt a PORTB-re. Ezután visszaugrunk
az elejére. A programot CTRL+F10-zel le tudjuk fordítani és a már megismert
F7-es léptetéssel nyomon követni hogy hogyan müködne egy PIC-ben. A watch
ablakba vegyük fel a PORTA regisztert is, ekkor láthatjuk hogy a kapcsolók
milyen pozicióban vannak. (Emlékeztetöül: tegyük aktívvá a watch ablakot,
majd nyomjuk meg az Insert billentyüt. Itt válasszuk ki vagy gépeljük be a
PORTA-t, majd nyomjuk meg az ADD gombot. Vagy a Properties
gombbal is felvehetjük, ezzel rögtön át is tehetjük a kijelzést binárisra.
Végül nyomjuk meg a Close-t.)
Kísérletképpen nézzük meg, hogyan viselkedne a program a különbözö kapcsolóállásokra.
Ugyebár F7-tel remekül láthatjuk hogyan müködik a program, de a PORTA-t
változtatni kéne futás közben is. Ehhez készítenünk kell egy szimulációs
fájlt, melyben leírjuk hogy az egyes idöpillanatokban hogyan változnak
a portokon a bitek. Válasszuk ki a File/New menüpontot, az új
szövegablakba meg gépeljük be az alábbi sorokat: (TAB-ot használjunk az
oszlopok elválasztására!)
STEP RA1 RA0 10 0 0 15 0 1 20 1 0 25 1 1
A STEP oszlop jelzi, hogy hanyadik lépésnél kell életbe lépnie a
változásnak. Az RA1 és RA0 pedig a PORTA elsö két lábára kötött
kapcsolókat állítja be virtuálisan.
Ezután a File/Save As menüponttal mentsük el a munkamappánkba
"bevitel.sti" néven! (Az "sti" kiterjesztés nagyon fontos!)
Méretezzük át és rakjuk az ablakot olyan helyre, ahol nem zavar. Most válasszuk
ki a Debug/Simulator Stimulus/Pin Stimulus/Enable menüpontot, majd
válasszuk ki a "bevitel.sti" fájlt.
Ez utóbbi akcióval azt értük el, hogy mostantól hibakeresés közben az MPLAB figyelembe veszi a szimulációs fájlunkat. Most kezdjük el léptetni F7-tel a programot. Láthatjuk, hogy a megfelelö idöpontokban átvált PORTA értéke, és a program müködése szerint átíródik a LED-ekre kötött PORTB is. Remek! Égessük is bele a PIC-ünkbe hogy láthassuk élöben is! (A szimulációs fájl nem szól bele a fordításba.)
Hoppá, ez valahogyan élöben nem müködik! Pedig az MPLAB-ban
még minden rendben volt. Két jelenséggel nézünk most szembe, ha minden igaz: a
LED akkor világítanak ha nem nyomjuk a gombokat, valamint (ez nem biztos hogy
elöjön) a többi LED közül is pár világít.
Na akkor vegyük nagyító alá a problémát! A kapcsolók azért müködnek
fordítva, mert elektronikusan így kötöttük be öket. Vagyis a PORTA
folyamatosan "1"-et kap, csak akkor kap "0"-t, ha
megnyomjuk a megfelelö lábra kapcsolt gombot. Tehát ez rendben van. Na de
mi van a második jelenséggel? Nos, ott szimplán az a helyzet, hogy a PORTA
többi lába nincs sehova sem bekötve, így a PIC felélesztésekor azok akármilyen
állapotot felvehetnek. Ezt a jelenséget maszkolással tudjuk
kiküszöbölni. A maszkolást úgy képzeljük el, ahogyan a valóságban is kinéz. Amikor
egy felíratot festenek nagyüzemben, azt rendszerint úgy teszik, hogy a
felületre ráhelyeznek egy müanyaglapot (maszkot), amiböl ki van vágva
a felirat. Ezután lesprézik festékkel az egészet és a lap elvétele után csak a
felirat marad hátra a felületen. Így müködik ez itt is. Elöször
beolvassuk a PORTA tartalmát, melyet egy maszkon átviszünk. A maszk a számunkra
lényegtelen biteket nullára állítja (függetlenül hogy mi volt az értéke), a
többit érintetlenül hagyja. Nekünk ez arra lesz jó, hogy a PORTA-nak az
elsö két bitén kívül az összes többi bit legyen nulla, így csak azok a
LED-ek fognak müködni, amelyek ténylegesen kapnak vezérlést. egészítsük ki
programunkat az alábbi ANDLW sorral:
VISSZA MOVFW PORTA ANDLW B'00000011' MOVWF PORTB GOTO VISSZA END
Az ANDLW utasításban az "LW" ugyanazt jelenti mint a MOV
utasításoknál. Az ANDLW ún. "és" müveletet végez az akkumulátor
és az operandus között. Hogy ez pontosan mit is jelent, egyelöre
nem kell foglalkoznunk vele, mindössze annyi a lényeg, hogy az akkumulátornak
minden olyan bitét nullázza, ahol az operandusban is nulla van. (A többit meg
békén hagyja.)
Például:
W értéke: B'00110011' ANDLW operandusa: B'00000011' W új értéke: B'00000011'
vagy
W értéke: B'10111010' ANDLW operandusa: B'00000011' W új értéke: B'00000010'
vagy
W értéke: B'11110100' ANDLW operandusa: B'00000011' W új értéke: B'00000000'
Látható a példákból hogy hogyan müködik ez az utasítás. Tehát ha
beiktatjuk a programba, a többi LED garantáltan nem fog világítani, csak az
elsö kettö.
Ha már ilyen ügyesen kiküszöböltük ezt a problémát, oldjuk meg a másikat is,
vagyis hogy akkor világítson egy LED, ha megnyomunk egy gombot és ne
akkor ha elengedjük. Ehhez a XORLW utasítást alkalmazzuk, ami ún. "kizáró
vagy" müveletet végez az akkumulátor és az operandus között.
Ha az operandus csupa egyesekböl áll (vagyis decimálisan 255 az értéke),
akkor az akkumulátor minden bitét megfordítja. Más néven ahol eddig
"1" volt, oda nulla kerül és ahol "0" volt, oda egy kerül.
Programunk tehát így változik:
VISSZA MOVFW PORTA XORLW B'11111111' ANDLW B'00000011' MOVWF PORTB GOTO VISSZA END
Így a program már tökéletesen fog müködni a PIC-ben.
A kész programot letölthetjük innen
Kis háttér-információ a logikai müveletekröl:
Az alap logikai müveletek az AND (és), OR (vagy), XOR (kizáró vagy),
valamint a NOT (nem).
Ezek úgy müködnek mint bármilyen matematikai müvelet, csak bitekkel.
A NOT kivételével mindegyik két taggal dolgozik. Íme az
"igazságtáblázatuk", vagyis hogy milyen eredményt produkálnak a
különbözö esetekben:
AND 1. tag 2. tag eredmény 0 0 0 0 1 0 1 0 0 1 1 1
OR 1. tag 2. tag eredmény 0 0 0 0 1 1 1 0 1 1 1 1
XOR 1. tag 2. tag eredmény 0 0 0 0 1 1 1 0 1 1 1 0
NOT tag eredmény 0 1 1 0
Vagyis így lehet megfogalmazni ezek szabályait:
AND: az eredmény csak akkor lehet "1", ha mindkét tag értéke
"1".
OR: az eredmény csak akkor lehet "1", ha legalább az egyik tag értéke
"1".
XOR: az eredmény csak akkor lehet "1", ha csak és kizárólag az egyik
tag értéke "1".
NOT: az eredmény mindig a tag ellentéte. (Itt csak egy tag lehet.)
Találat: 511