PIC-it hangoljuk a PIC-et
A hang hatások előállítása sem ördöngösség a PicPascalban. Egyszerű, mivel itt is nagyon sok mindent a Pascal, megcsinál helyettünk. Most billentyűhangot fogunk programból előállítani.

Hirdetés

Erre én egy régebbi programomhoz megírt procedúrát használok.
A PicPascal tudja a hang előállítását egyetlen utasítással. A procedúrát, amelyet a billentyűhangok előállításához használok lassan két éve, LED villogtató koromban, a sógorom, PetyaSoft segített megírni, akkoriban egyedül, ez bőven meghaladta képességeimet.
Szerintem olyan frappánsan kezeli a billentyűhangokat, hogy az óta is ezt használom.
Lássuk a medvét:

Procedure Speeker (BeepHz, BeepMS, BeepCikl, BeepSzun : Word);
Var Loop :Byte;
Begin
For Loop:=1 To BeepCikl Do
Begin
Sound_Play(BeepHz,BeepMS);
VDelay_ms(Beepszun);
End;
End;


Ennyi az egész. Mindjárt a procedúra neve után deklarálunk néhány változót, amit csak ez a procedúra fog használni. Megadjuk a típusát is.

1. (BeepHz) az előállítandó hang magassága Hz-ben megadva.
2. (BeepMS) az előállítandó hang hosszúsága
3. (BeepCikl) a hangeffektusok száma
4. (BeepCikl) a hangeffektusok közötti szünet

Utána megcsináljuk a ciklust egy For utasítással, melynek a végértéke a BeepCikl változó.
Lejátszatjuk a Pascal-al a hangot melynek a paramétereit a BeepHz, és a BeepMs adja.
Ezután következik a Vdelay_ms amelynek paraméterét a Beepszun adja.

Mindezek után csak annyi dolgunk van, hogyha elő akarjuk a hangot állítani, akkor a procedúra neve után beírjuk a megfelelő paramétereket, amelyet az utasítás átad a procedúrának. Tehát Pl.:

Speeker(3500,30,1,0);


Ami pontosan azt jelenti, hogy 3500Hz-es hangot, 30 mS-ig játsza 1-szer.
A Beepszun = 0 mivel csak egyszer lejátszott hangnál, nincs ami között, szünet lenne...

Speeker(2300,50,8,100);


Azaz 2300Hz-es hangot, 50 mS-ig játsza 8-szor, a hangok között 100mS szünettel.

A Speed_Adj procedúrában, vannak, a nyomógombok állapotát feldolgozó algoritmusok, így oda fogjuk beilleszteni, azt az utasítást ami, a Speeker procedurát, hivja és paraméterezi.

Procedure Speed_Adj;
Begin
Bemenet:= not PortB;
If Bemenet.mode = 1 Then
Begin
LatE.1:=1;
Speeker(3500,30,1,0);
Delay_ms(300);
Select_1 := Select_1+1;
If Select_1= 8 Then Select_1:=1;
End;
If Bemenet.Speed_Fel = 1 Then
Begin
LatE.1:=1;
Speeker(2800,30,1,0);
Delay_ms(300);
Speed_Fut := Speed_Fut +5;
If Speed_Fut >= 120 Then Speed_Fut := 120;
EEprom_write(0, Speed_Fut); //EEprom-ba Kiir!
End;
If Bemenet.Speed_Le = 1 Then
Begin
LatE.1:=1;
Speeker(2800,30,1,0);
Delay_ms(300);
Speed_Fut := Speed_Fut -5;
If Speed_Fut <= 5 Then Speed_Fut := 5;
EEprom_write(0, Speed_Fut); //EEprom-ba Kiir!
End;
ByteToStr(Speed_Fut, Text);
Lcd_Out(2, 3, Text);
Case Select_1 of
1 : Lcd_Out(1, 4, 'Sor ');
2 : Lcd_Out(1, 4, 'Vil ');
3 : Lcd_Out(1, 4, 'Vil2');
4 : Lcd_Out(1, 4, 'Fut ');
5 : Lcd_Out(1, 4, 'Fut2');
6 : Lcd_Out(1, 4, 'N.R.');
7 : Lcd_Out(1, 4, 'STOP');
End;
End;


Mivel minden egyes megnyomott billentyűhöz, külön hangot lehet hozzárendelni, Pl.: keyboard-nál akár a Tone üzemmód szabványszerinti frekvenciáit is, akár telefonon keresztüli vezérlések is megvalósíthatók, ezzel a procedúrával.

Mivel a Pascalban, fontos a procedúrák sorrendje, ezt a procedúrát mindig a legelejére teszem a programnak, így még a Pic_Init-ből is használhatom Pl.: a kütyü feléledésének jelzésére.
Mindössze ennyi a jelzőhangok előállítása a PicPascalban.

Nézzük meg, hogyan lehetne megoldani azt, hogy amikor lenyomjuk valamelyik gombot, akkor induljon a kijelző világítás, és egy bizonyos idő után kapcsoljon le.

Ennek a legkorrektebb megoldása az lenne, ha Timer interruptot használnánk, mert akkor a kikapcsolás időzítése is pontos lenne. De csak ezért, nem érdemes megszakítást használni mivel nem akkora probléma, hogyha pár másodperccel hosszabb, vagy rövidebb ideig világít a kijelző. Ezért hát a legegyszerűbb megoldáshoz folyamodunk. Amikor a gombot nyomjuk, akkor felkapcsoljuk a kijelző világítását.

Ezt a Speed_Adj procedúrában, tehetjük meg. Közvetlen a Speeker utasítás előtti sorban látható a következő LatE.1 := 1; ezzel az E Port 1-es bitjét magas szintre állítottuk. Ha erre a lábra teszünk egy tranzisztort, emitterét GND-re, a kollektorára pedig a tápfeszre akasztott kijelző világítás GND lábát, akkor, amikor a tranzisztor kinyit, világítani fog a kijelző.

De hol kapcsoljuk ki mikor időzítése nincs? Delay utasítással nem tehetjük, mivel akkor áll a program, nem megy tovább, tehát nem menne sem a fényjáték, sem pedig a hőmérő.

A legegyszerűbb megoldás az, ha a főprogram utolsó sorába beírjuk, hogy LatE.1 := 0;
Tulajdonképpen a fényjátékok ciklus idejét használjuk fel a kijelző világítás időzítésére.
Igaz, hogy így nem mindig egyforma ideig világít a kijelző, de végül is ameddig, muszáj addig látjuk, néhány másodpercig. Ismétlem nem ez a legkorrektebb, és a legelegánsabb megoldás, de ez a legegyszerűbb, és esetünkben ez a fajta időzítés, most tökéletesen megfelel.
Folytatjuk... Hogy mivel? Egyelőre, halvány fogalmam sincs, de majd kitalálom, ha eljön az ideje...


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