PICi programocskánk kicsit unalmasan fut
Az előző cikkben, beszéltünk arról, hogy többféle villogásmintát, is írhatunk, hiszen csak egy sima oda-vissza futófény meglehetősen unalmas.

Hirdetés

Mivel gyakorlatilag programból azt teszünk a Port-al amit akarunk nagyon sokféle mintát írhatunk. Mi most a teljesség igénye nélkül írunk egy pár egyszerűbbet, hogy később mindenki maga tudja tovább fejleszteni saját ötletei alapján.

Mivel a megszakításokkal még nem foglalkoztunk, pollozni fogunk továbbra is. Sajnos mivel sok ciklusutasítást használunk csak akkor tudjuk bármikor a futófény sebességét szabályozni ha a ciklusmagokba beírjuk a Speed_Adj procedúrát hiszen ha nem tennénk, akkor csak a ciklus lefutása után hajtaná végre, azaz nem tudnánk szabályozni csak a ciklus végén.

Tulajdonképpen az eddig megírt részek nemigen változnak, csak a főprogramba írjuk be, az újonnan megírt procedúrák nevét, különben a program nem fogja azokat végrehajtani.

Procedure Fut;
Var Loop_1: Byte;
Begin
For Loop_1:=0 To 10 Do
Begin
LatC:=$03;
For Loop:=0 To 7 Do
Begin
Speed_Adj;
Vdelay_ms(Speed_Fut);
asm
rlncf LatC,F;
End;
End;
End;
End;


Mindjárt elsőként, szétszedtük az oda vissza futófény procedúrát és csinálunk belőle két sima futófényt. Az egyik procedúra csak jobbra, a másik csak balra futtatja a fénypontot. Természetesen az eredeti is megmarad, ezért a két új procedúrának más lesz a neve.

Procedure Fut_2;
Var Loop_1 : Byte;
Begin
For Loop_1:=0 To 10 Do
Begin
LatC:=$C0;
For Loop:=0 To 7 To
Begin
Speed_Adj;
Vdelay_ms(Speed_Fut);
asm
rrncf LatC,F;
End;
End;
End;
End;


Még egy apróság. Azért, hogy ne csak egyszer hajtsa végre a ciklust, azaz ne csak egyszer fusson a fénypont oda vagy vissza ezért egy 10-es For ciklusba tettük. A teljes végrehajtandó ciklus Begin...End közé került, így csak akkor megy tovább, amikor a For ciklus változója eléri a 10-et, addig ismétli a teljes procedúrát.
Ehhez, szükségünk volt arra, hogy deklaráljunk még egy változót. (Loop_1) Ezt megtehetjük a procedúrán belül is, tehát meg is tettük. Ez a változónk Byte-os lett, tehát 0 és 255 között vehet fel értéket. Mivel, mindössze 10-ig fogjuk elszámoltatni, a For ciklust, ez bőven több mint elegendő.
Beszéltünk már arról, hogy a PicPascalban, sőt ez gyakorlatilag az összes létező programnyelvre igaz, hogy bináris, decimális vagy hexadecimális számokat is használhatunk.
Gyakorolhatjuk egy kicsit a számrendszerek konvertálását.
Első PICi programocskánk című cikkünkben írtuk meg a procedúránkat, bináris formátum használatával. Most is ezt fogjuk tenni.

Procedure Villog_2;
Var Loop_1 : Byte;
Begin
For Loop_1:=0 To 10 Do
Begin
Speed_adj;
LatC:=%10000001;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=%01000010;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=%00100100;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=%00011000;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=%00100100;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=%01000010;
Vdelay_ms(Speed_Fut+10);
End;
End;


Annak érdekében, hogy a vizuális hatása nagyjából egyforma legyen a futófények, és az ugráló fénypontok sebességének, a Speed_Fut változó értékét kompenzálni kell. Ezt nagyon egyszerűen megtehetjük, mindössze annyi a dolgunk, hogy elveszünk vagy hozzáadunk az értékéhez. Amennyiben a Speed_Fut értékét változtatjuk akkor mindig hozzá adódik vagy kivonódik az, az érték, amelyet beállítottunk.
Na de térjünk vissza a számrendszerekhez.

Procedure Villog_2;
Var Loop_1 : Byte;
Begin
For Loop_1:=0 To 10 Do
Begin
Speed_adj;
LatC:=129;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=66;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=36;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=24;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=36;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=66;
Vdelay_ms(Speed_Fut+10);
End;
End;


Itt ugyanazok az értékeket adtuk a C Port-nak, decimális formában, mint amit ez előbbi procedúrában binárisan adtunk meg. Ugyanazt is hajtja végre ez a procedúra, mint az előző, sőt a következő is pontosan ugyanazt csinálja, pedig ott hexadecimálisan adjuk meg az értéket.

Procedure Villog_2;
Var Loop_1 : Byte;
Begin
For Loop_1:=0 To 10 Do
Begin
Speed_adj;
LatC:=$81;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=$42;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=$24;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=$18;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=$24;
Vdelay_ms(Speed_Fut+10);
Speed_adj;
LatC:=$42;
Vdelay_ms(Speed_Fut+10);
End;
End;


A három procedúra abszolút ekvivalens egymással. Használhatjuk bármelyik formát, működni fog. Ami fontos, hogy ha a bináris formát használjuk, akkor "%" jelet, ha pedig hexadecimálist, akkor "$" jelet kell a szám elé írni, decimálisnál pedig semmit. Ebből tudja a programunk, hogy milyen formátumban dolgozza fel a beírt értéket.

Írjunk még egyet, utána pedig már egy kicsit variálhatjuk is a futófényünket.

Procedure Villog;
Var Loop_1 : Byte;
Begin
For Loop_1:=0 To 10 Do
Begin
Speed_Adj;
LatC:=$AA;
Vdelay_ms(Speed_Fut+30);
Speed_adj;
LatC:= not LatC;
Vdelay_ms(Speed_Fut+30);
End;
End;


Tulajdonképpen, ez is egy nagyon egyszerű, kis procedúra. Beállítjuk a C Port-ot, úgy, hogy minden második LED világítson, majd némi szünet után, amelyet a kompenzált Vdelay, biztosít, negáljuk a teljes Port-ot, aminek eredményeképpen 2-szer négy, oda-vissza ugráló fénypontokat kapunk. Ide is be kell írni a Speed_Adj procedúrát, hogy a sebességet változtatni tudjuk. Az, hogy minden egyes, procedúrába be kell írni, a sebességet változtató procedúrát, nem a legelegánsabb módszer, de a pollozás miatt, kénytelenek vagyunk így megoldani. Nemsokára foglalkozni fogunk a megszakításokkal, amivel ezt a problémát orvosolhatjuk.
Egyelőre pollozunk. Függetlenül attól, hogy, bonyolult így megoldani hiszen, minden egyes procedúrába többször is be kell írni, működik. Nem feltétlenül kell, megszakítással megoldani, egyszerűen csak sokkal elegánsabb, hiszen ha már tud, a PIC megszakítást kezelni, akkor miért ne használjuk ki. De erről majd később részletesen beszélünk.
Most, térjünk vissza a programunkhoz. Némi változás a főprogramban is lesz. Egy kicsit megvariáljuk futófényünket, így 8 db LED-el vagy izzóval akár karácsonyfára is jó lehet.

Begin
Pic_init;
While True Do
Begin
Fut;
Villog;
Fut_2;
Villog;
Led_Blink;
Villog;
Villog_2;
Villog;
End;
End.


Gyakorlatilag nem sok minden változik, mindössze egymás után végrehajtjuk a procedúrákat. A villog procedúra többször is szerepel, mintegy elválasztva egymástól a futófényeket. Ezt variálhatjuk, ahogy akarjuk, bármelyiket írhatjuk egymás után, érdemes is kipróbálni, melyik néz ki a legjobban, sőt a Speed_Fut változó értékét kompenzáló értéket is, szabadon változtathatjuk, a jobb összhatás érdekében. Sőt írhattok saját ötlet alapján is, bármilyen villogásmintát, utána a procedúra nevét, csak be kell illeszteni a főprogramban.
A későbbiek során kiterjeszthetjük majd két Port-ra is, sőt akár többre is. A 4520-as PIC-el elméletileg, 35 Bit-es fényjátékot is csinálhatunk, Port expander nélkül. Bár ennyi nem lesz, mert a nyomógombok is elvisznek néhány Port-ot.
Most, csak egymás után hajtódnak végre a procedúrák, nem emelhetünk ki egyet, hogy az menjen folyamatosan.
Pedig a PIC tudja, csak meg kell neki mondani, hogy hogyan tegye.
Legközelebb megmondjuk...


Fájlok:
FájlnévFájlméretLetöltve
A cikkhez tartozó fájlok csak bejelentkezés után tölthetőek le!

Hozzászólások
Hozzászólás csak bejelentkezés után lehetséges...
grandiloquent-yearly
grandiloquent-yearly
grandiloquent-yearly
grandiloquent-yearly