Müködik a PICi EEprom...
Ott hagytuk abba, mikor is kifogásoltuk azt, hogy nem őrzi meg, a PIC, a futófény sebességére vonatkozó beállításokat. Processzorunk képes arra, hogy a saját EEprom-jában eltároljon adatokat, amit akkor is megőriz, ha már kikapcsoltuk a tápot.

Hirdetés

A PicPascalban ez borzasztó egyszerű, mivel van egy belső unitja, az EEprom kezelésére. Nagyon megkönnyíti a dolgunkat mivel mindössze, egyetlen sorral írathatjuk ki a változónk értékét, és egyetlen sorral be is olvashatjuk azt.
Természetesen tudom, hogy ennél a programnál erre, igazán semmi szükség nem lenne, de ez csak egy minta program, bár mire a végére érünk lesz egy használható hangulatvilágításunk... :-)))

Ismét beleesett két új sor a Pic_Init-be.

Speed_Fut := EEprom_read(0);

Ezzel a sorral a Speed_Fut változónk értékét, amelyet a program futása során kiírtunk az EEpromba, állítjuk be oly módon, hogy az EEprom 0-ás bitjén eltárolt információt beolvassuk, majd ezt az értéket megadjuk a változónak.

If Speed_Fut = $FF Then Speed_Fut := 70;

Na, ez a sor már érdekesebb egy kicsit. Miért is adunk fix értéket, egy olyan változónak aminek EEpromban eltároltuk, az értékét?
Nagyon egyszerű, ez a sor, csak az első bekapcsolás miatt van a programban. Miután beégettük a programot, de még egyszer sem változtattunk a sebességen, (ugyanis a sebesség megváltoztatásakor írjuk majd ki, az EEpromba a Speed_Fut változó értékét) akkor is kell valamilyen kezdőérték, amit a változónk felvesz. Az üres EEprom beolvasva $FF azaz 255-öt ad vissza, így nagyon lassú lenne a futófényünk. Vagyis itt az történik, hogy HA az EEprom 0-ás bitje beolvasva 255-öt ad vissza AKKOR, de csak akkor, beállítjuk a Speed_Fut kezdőértékét 70ms-re.
Tehát addig eljutottunk, hogy kiolvastuk az EEpromot. Most már, kéne bele írni is valamit, különben nem lesz mit kiolvasni a 255-ös értéken kívül. Ezt a Speed_Adj procedúrában tehetjük meg.

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 := EEprom_read(0);
If Speed_Fut = $FF Then Speed_Fut := 70;
End;

//---------------------------- 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;
EEprom_write(0, Speed_Fut); //EEprom-ba Kiír!
End;
If Bemenet.Speed_Le = 1 Then
Begin
Delay_ms(100);
Speed_Fut := Speed_Fut -10;
If Speed_Fut <= 10 Then Speed_Fut := 10;
EEprom_write(0, Speed_Fut); //EEprom-ba Kiír!
End;
End;

//---------------------------- Sebesség szabályozás ---------------------------

Na, itt volnánk a tett helyszínén. A Speed_Adj procedúra az a hely, ahol rávesszük arra a PIC-et, hogy amikor állítunk a sebességen, akkor azonnal kiírja az EEpromba a megváltozott értéket. Ezt egyetlen utasítás beírásával elintézhetjük, utána a többi teendőről, már a PicPascal gondoskodik. Assemblerben nem ennyire egyszerű a dolog, mivel az EEprom írásnak elég sok kritériuma, időzítése, stb... van. Szerencsére a PicPascal, leveszi ezt a terhet a vállunkról.

EEprom_write(0, Speed_Fut);

Ennyi az egész, mindössze két paramétert kell megadnunk, a memória címet, és az adatot.
Mivel ezt megtesszük mind a felfelé, mind a lefelé történő szabályzás közben, mindkét esetben kiírja a megváltozott értéket az EEprom-ba. Más dolgunk ezzel már nincs is.

//---------------------------- 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;

//---------------------------- Főprogram --------------------------------------

Begin
Pic_init;
While True Do
Begin
Led_Blink;
End;
End.

//-------------------------- Program Vége -------------------------------------

Ezzel készen is van az EEprom kiíratás, és az adatok beolvasása.
Ismét van a programunknak némi hiányossága, fogalmunk sincs arról, hogy milyen sebességgel megy, a futófényünk.
Jó lenne valamilyen kijelző, amiről leolvashatnánk, a Speed_Fut aktuális értékét.

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