Amennyiben a PIC már valamilyen módon, áram alá van helyezve, és a portokon is ott a tranzisztor meg a
LED akkor hajrá... Írjunk egy PICi programocskát...
Hirdetés
program FeryService;
---------------------------- Változók deklarálása ----------------------
Var Loop : Byte; //Erre a sorra csak a futófénynél lesz szükség.
---------------------------- Pic_Init --------------------------------------
Procedure Pic_Init;
Begin
TrisC:=0;
LatC:=0;
Loop:=0; //Erre a sorra csak a futófénynél lesz szükség.
End;
---------------------------- LED villogtatás -------------------------------
Procedure Led_Blink;
Begin
LatC.0:=1;
Delay_ms(300);
LatC.0:=0;
Delay_ms(300);
End;
---------------------------- Főprogram --------------------------------------
Begin
Pic_init;
While True Do
Begin
Led_Blink;
End;
End.
Első PICi programocskánk a következőképpen működik. A Pic_Init-ben a TrisC utasítás határozza meg a C Port irányát. Most ez $00 tehát a teljes C Port kimenetként van definiálva, a Lat C:=$00 pedig alacsony logikai szintre állítja a teljes C portot. Mivel most csak ezt, az egy portot használjuk elég ezt beállítani. Ez lesz az alaphelyzet, mivel a Pic_Init csak egyszer hajtódik végre. A Pic_Init után egy végtelen cikl
usban folyamatosan hajtódik végre, maga a program, ami most, tulajdonképpen a
Led_Blink procedúra.
Ez a procedúra a következőket teszi:
A C Port 0-s bitjét magas logikai szintre állítja majd a Delay_ms(300) utasítás hatására vár 300ms-et. Utána a C Port 0-s bitjét kikapcsolja majd ismét vár 300ms-et. Utána kezdődik az egész, elölről, a végtelenségig.
A PicPascal speciális utasításai, közé tartozik a TRIS és a LAT. Ez Pic specifikus a Turbo vagy a Borland Pascal nem ismeri. Sok ilyen utasítás van.
Ha már működik első programunk, akkor bővítsünk egy kicsit rajta.
Procedure Led_Blink;
Begin
LatC.0:=1;
LatC.7:=1;
Delay_ms(300);
LatC.0:=0;
LatC.7:=0;
Delay_ms(300);
End;
Ekkor már Két
LED fog villogni, a C Port 0-s és a 7-es bitje. Ezt megtehetjük a PIC bármelyik portjának, bármelyik bitjével. Amennyiben a LatC.0 vagy LatC.7 helyett csak annyit írunk, hogy LatC:=$FF; a 3.ik sorba pedig azt, hogy LatC:=$00; akkor a teljes C Port villogni fog. Ugyanis, az utasítást ki lehet adni a Port egy bitjére vagy a teljes portra.
A $FF hexadecimális számrendszerben van, decimális megfelelője 255, vagyis a port minden bitje 1.
Később, majd hozzászokunk ahhoz, hogy bit szintű műveleteknél főleg decimális, bájt szinten pedig főleg hexadecimális számokat fogunk használni.
Ezen kívül időnként bináris számrendszert is használunk, mivel azzal nagyon jól lehet a portok állapotát szemléltetni. Álljon erre itt egy példa, csak a
Led_Blink procedúra tartalmát kell átírni.
Procedure Led_Blink;
Begin
LatC:=%10000000;
Delay_ms(100);
LatC:=%01000000;
Delay_ms(100);
LatC:=%00100000;
Delay_ms(100);
LatC:=%00010000;
Delay_ms(100);
LatC:=%00001000;
Delay_ms(100);
LatC:=%00000100;
Delay_ms(100);
LatC:=%00000010;
Delay_ms(100);
LatC:=%00000001;
Delay_ms(100);
LatC:=%00000010;
Delay_ms(100);
LatC:=%00000100;
Delay_ms(100);
LatC:=%00001000;
Delay_ms(100);
LatC:=%00010000;
Delay_ms(100);
LatC:=%00100000;
Delay_ms(100);
LatC:=%01000000;
Delay_ms(100);
LatC:=%10000000;
Delay_ms(100);
End;
No, ez már egy 8 bites futófény, amely oda-vissza fut. Persze ezt ennél sokkal rövidebben is meg lehet ezt írni, de ez a mód szemlélteti legjobban, azt hogy milyen egyszerű a PIC bitjeivel bánni. A százalék jel jelöli a PicPascalban, hogy az utána levő számot binárisként értelmezze. Beállítjuk a portot bináris 10000000-re, ami azt jelenti, hogy a teljes C porton, ahol nulla van ott nem, ahol 1 van, ott világít a
LED. Utána várunk 100ms-et, majd átállítjuk a teljes portot 01000000-re, ismét várunk 100ms-et, és így tovább...
Ismét írjuk át a
Led_Blink procedúrát. Ez már kicsit bonyolultabb lesz, de sokkal rövidebb, ne ijedjünk meg tőle. Mint azt a bevezetőben említettem, fogunk használni a Pascalba beágyazott, assembler utasításokat. Mindjárt itt is van erre, az első példa. Itt használjuk fel a program legelején deklarált változónkat, amely most a Loop. A For ciklus a Pascal olyan ciklus utasítása, amely meghatározott vagy változó értékével meghatározható, hogy hányszor ismétlődjön. Ennél a ciklusnál mindig valamilyen egész szám a feltétel akkor is, ha változókat használunk.
Procedure Led_Blink;
Begin
PortC:=$03; // Bekapcsoljuk a C port első 2 bitjét.
For Loop:=0 to 5 do // Ez egy ciklusutasítás. A Begin-End közötti részt
// 6-szor, fogja végrehajtani, majd tovább megy.
Begin
Delay_ms(100);
Asm // Ez a 3 sor Assembler utasítás
rlncf PortC,F; // jobbra lépteti az 1-ben álló biteket
End;
End;
For Loop:=0 to 5 do // Ismét 6-szor hajtja végre a léptetést.
Begin
Delay_ms(100);
asm
rrncf PortC,F; // Balra léptet, vagyis visszafelé
End;
End;
End;
Ennek a kis procedúrának az eredménye egy igazi Knight Rider oda-vissza futófény. Ha az időzítést meghatározó 100ms-et kisebbre vagy nagyobbra vesszük, akkor gyorsabban vagy lassabban fog futni a dupla fénypont. Fontos, hogyha a Pascalban, assembler utasítást akarunk használni, akkor mindig nézzük meg a PIC adatlapját, az tartalmazza a szóban forgó PIC assembler utasításkészletét.
Amennyiben a Delay utasítás helyett a VDelay utasítást használjuk, akkor lehetőségünk nyílik arra, hogy az idő értékét változóban adjuk meg. Így már megtehetjük, hogy két nyomógombbal változtassuk a futófény sebességét. Itt már másik portot is fogunk használni.
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...