Egy PICi sebesség szabályzás...
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é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