Jelenlegi programunknak, van némi hiányossága. Nem tudjuk a futófény sebességét befolyásolni, pedig a PIC minden további nélkül képes rá, csak meg kell neki mondani, hogy hogyan tegye.
Hirdetés
Többféle megoldás is létezik a problémára. Mi most a legegyszerűbb működőképes verziót fogjuk megoldani, függetlenül attól, hogy korántsem ez a legelegánsabb megoldás. De egyszerű és működik.
Lássuk mi mindennel bővült a programunk:
Mindjárt az elején van egy új sor. A PicPascalban a program neve után a deklarációs rész következik. Itt kell a konstansokat és a változókat deklarálni. A konstans mint a neve is mutatja, a program futása alatt, végig megtartja értékét, szemben a változóval amely nem. Két konstansunk is van, amiket itt deklaráltunk, majd értéket rendeltünk hozzá. Ezek lesznek a nyomógombjaink.
Utána a változók következnek, amelyeket itt nem csak deklarálni kell hanem meg kell adni a típusát is. Két új változónk van, ezek mindegyike byte-os ami azt jelenti, hogy az értékük 0-255 között lehet.
Mindezek után, ha tovább nézzük a programot látjuk, hogy a Pic_Init-ben is történtek változások. A B portot beállítottuk bemenetnek majd inicializáltuk:
TrisB:=$FF
PortB := $00;
Utána van egy új sor:
Intcon2.RBPU := 0;
Ezzel az utasítással mondjuk meg a PIC Intcon2 regiszterének, hogy az RBPU-val jelölt bitet állítsa nullára. Ezzel a PIC B portján, bekapcsoltuk a belső felhúzó ellenállásokat. Ez egy nagyon előnyös szolgáltatása a PIC-nek, mivel egyszerűbb lesz a nyáktervezés.
Ezek után értéket adtunk, három változónak. Általában ne felejtsünk el, kezdőértéket adni a vátozóknak, mert előfordulhat, hogy nem azt csinálja a program amit szeretnénk. Nem mindig kötelező, bár jobb ha megszokjuk. Vannak kivételek, pl.: ha a Loop változónk kezdőértékét nem állítjuk be, akkor sincs semmi komolyabb baj, mivel ahol használjuk majd, ott a ciklus utasítás be fogja állítani a kezdő értéket, de ha mégis beállítjuk már a Pic_Init-ben, akkor sincs semmi probléma...
Még egy apróság, a PicPascal is megengedi a globális és a lokális változók használatát. Ha egy változót csak egy procedurában használunk akkor ott is deklarálhatjuk.
//--------A program neve, deklarációs rész ----------------------------------
program FeryService;
Const Speed_Fel=0; Speed_le=1;
Var Loop, Bemenet, Speed_Fut : byte;
//---------------------------- Pic_Init --------------------------------------------
Procedure Pic_Init;
Begin
TrisC := $00;
LatC := $00;
TrisB := $FF;
PortB := $00;
Intcon2.RBPU := 0;
Loop := 0;
Bemenet := 0;
Speed_Fut := 80;
End;
//---------------------------- Pic_Init --------------------------------------------
Itt alább ismét valami újat találunk. A programunkhoz hozzákerült egy új procedúra, amely a sebesség szabályozását fogja végezni.
Itt ismét jónéhány, új dologgal fogunk megismerkedni.
Bemenet := not PortB;
Erre a sorra azért van szükség, hogy negálja a B portot. Nem lenne feltétlenül szükség rá, de nekem átláthatóbb így a program. Mivel GND felé kapcsolunk, a változónk a kapcsolás során venné fel a 0 értéket, de én jobban szeretem, ha 1-el dolgozhatok, ezért negálom a portot. Így akkor lesz a változó értéke 1 ha lenyomjuk a gombot. A Bemenet változó a B port, ehhez hozzáadjuk a nyomógomb konstansát, Speed_Fel és Speed_Le, amely megadja azt a bitet, a B porton, ahol a nyomógomb található, és ezt figyeljük a program futása során.
Az If Then Else szerkezet a PicPascalban is pontosan ugyanúgy müködik mint a Turbo vagy Borland Pascalban.
Tehát a következő sorunk.: Ha a Bemenet.speed_fel = 1 akkor a Speed_Fut változó értékéhez adj hozzá 10-et.
Itt például decimális számokat használunk mert az a legcélszerűbb...
Ha a Speed_Fut változó elérte a 120 értéket akkor ne adjon hozzá többet. A Delay_ms(100) pedig a nyomógomb prellezését hivatott kiküszöbölni.
A következő pár sor pontosan ugyanez, csak lefelé alakítjuk a Speed_Fut változó értékét.
A Speed_Fut változót a VDelay utasítás használja arra, hogy a program, a léptetések közötti várakozással, megadja a futófény sebességét.
//---------------------------- Sebesség szabályozás ---------------------------
Procedure Speed_Adj;
Begin
Bemenet := not PortB;
If Bemenet.Speed_Fel = 1 Then
Begin
Delay_ms(100);
Speed_Fut := Speed_Fut +10;
If Speed_Fut >= 120 Then Speed_Fut := 120;
End;
If Bemenet.Speed_Le = 1 Then
Begin
Delay_ms(100);
Speed_Fut := Speed_Fut -10;
If Speed_Fut <= 10 Then Speed_Fut := 10;
End;
End;
//---------------------------- Sebesség szabályozás ---------------------------
Innentől kétféle képpen változtathatjuk meg a futófény sebességét.
Egyrészt megtehetnénk azt is, hogy a főprogramba illesztjük be a Speed_Adj procedurát, de az nem igazán jó megoldás, mivel folyamatosan nyomni kellene a gombot, mert csak a teljes oda-vissza ciklus után kerülne végrehajtásra. Ez a megoldás nem igazán nyerő, keressünk hát, egy másikat.
Be fogjuk a Speed_Adj procedurát illeszteni, a
Led_Blink procedúrába a cikluson belülre. Csak a procedúra nevét kell betenni és a program végrehajtja.
Amennyiben ide tesszük, akkor a minden egyes léptetés, közben figyeli a program a Bemenet.Speed_Fel, és Bemenet.Speed_Le változók állapotát ami tulajdonképpen a nyomógombok állapotát jelenti. Ezt a fajta programozási technikát hivják pollozásnak.
Tehát amikor megnyomjuk valamelyik gombot akkor a Speed fut változó értéke vagy + vagy - 10-el változik, ezáltal változik a VDelay időzítés mértéke is, ezzel pedig a futófény sebessége.
//---------------------------- LED villogtatás --------------------------------
Procedure Led_Blink;
Begin
PortC:=$03;
For Loop:=0 to 5 do
Begin
Speed_Adj;
VDelay_ms(Speed_Fut);
asm
rlncf PortC,F;
End;
End;
For Loop:=0 to 5 do
Begin
Speed_Adj;
VDelay_ms(Speed_Fut);
asm
rrncf PortC,F;
End;
End;
End;
//---------------------------- LED villogtatás --------------------------------
//---------------------------- Főprogram --------------------------------------
Begin
Pic_init;
While True Do
Begin
Led_Blink;
End;
End.
//---------------------------- Program Vége -----------------------------------
A nyomógombokat a B port 0-ás és az 1-es bitjére tettük, melyek GND felé kapcsolnak.
Ezzel már egészen jól szabályozhatjuk a futófény sebességét.
Észre fogjuk venni azt, hogy a szabályozás közben egy pillanatra, 100ms-nyi pillanatra, megakad a futófény.
Ez azért van mert a nyomógombok prellezését kiküszöbölő 100ms várakozás idején, a nyomógomb megnyomása után, 100ms-re felfüggesztődik a program futása.
Többek ezért sem elegáns megoldás ez. Valóban - a legjobb megoldás a megszakítás használata lenne, később ki is fogjuk próbálni.
De a programunk, így is működik.
Van a programnak még egy kis hiányossága. A futófény sebessége bekapcsoláskor, mindig ugyanakkora, nem őrzi meg a beállított paramétereket, pedig a PIC ezt is tudja.
Ezzel folytatjuk...
Fájlok:
Fájlnév | Fájlméret | Letö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...