BASCOM


Generator tonów akustycznych.




Ten generator emituje dźwięki akustyczne o nastawianej przez nas częstotliwości kolejno, jeden za drugim. W tym przypadku emituje 20 dźwięków z szybkością Waitms 60, czyli co 60 mS. Szybkość tę można zmieniać. Na wyświetlaczu Lcd obserwujemy kolejne liczby decydujące o wysokości tonów oraz częstotliwość poszczególnych dźwięków w KHz.
Patrz objaśnienie pod programem.


'Przerwanie18.bas

'Generator tonów akustycznych, przełączanych krokami pętli For.

'Tutaj 20 tonów z krokiem Waitms XX.

'Wyjście częstotliwości z Portd.3..

'Opis pod programem.

'Opracował Henryk Wydmuch

'Program zajmuje 43% pamięci.


$regfile = "m8def.dat" 'Info dla kompilatora.

$crystal = 10240000 'Informujemy kompilator o kwarcu 10,24MHz.


Config Lcd = 16 * 2 'Konfiguracja Lcd.

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5


Config Timer0 = Timer , Prescale = 1 'Timer0 jako miernik czasu, podział przez 1.


Config Pind.1 = Output 'Port wykonawczy dla Led.

Set Portd.1 'Ustaw poziom wysoki Portd.1.

Config Pind.6 = Input 'Przycisk startu.

Set Portd.6 '

Config Pind.3 = Output 'Wyjście generatora.

Set Portd.3 '


Dim Odp As Single '

Dim Zm As Byte '

Dim I As Byte '

Dim Wp As Byte '

Dim Az1 As Byte '

Dim Az2 As Byte '

Dim Az3 As Byte '

Dim Az4 As Byte '

Dim Az5 As Byte '

Dim Az6 As Byte '

Dim Az7 As Byte '

Dim Az8 As Byte '

Dim Az9 As Byte '

Dim Az10 As Byte '

Dim Az11 As Byte '

Dim Az12 As Byte '

Dim Az13 As Byte '

Dim Az14 As Byte '

Dim Az15 As Byte '

Dim Az16 As Byte '

Dim Az17 As Byte '

Dim Az18 As Byte '

Dim Az19 As Byte '

Dim Az20 As Byte '


Enable Interrupts 'Zezwalaj na wszystkie przerwania.


On Timer0 Licz 'Deklaracja podprogramu Timer0.

'--------Tutaj, do zmiennych Az wpisujemy ręcznie liczby, które decydują o wysokościach dźwięków.-----------

Az1 = 18 '

Az2 = 21 '

Az3 = 44 '

Az4 = 60 '

Az5 = 8 '

Az6 = 16 '

Az7 = 33 '

Az8 = 38 '

Az9 = 35 '

Az10 = 41 '

Az11 = 13 '

Az12 = 18 '

Az13 = 41 '

Az14 = 35 '

Az15 = 12 '

Az16 = 17 '

Az17 = 20 '

Az18 = 16 '

Az19 = 30 '

Az20 = 36 '


'-------Tutaj, zmienne Az wpisują się do pamięci Eprom.---------------------------------------------------

Writeeeprom Az1 , 1 '

Writeeeprom Az2 , 2 '

Writeeeprom Az3 , 3 '

Writeeeprom Az4 , 4 '

Writeeeprom Az5 , 5 '

Writeeeprom Az6 , 6 '

Writeeeprom Az7 , 7 '

Writeeeprom Az8 , 8 '

Writeeeprom Az9 , 9 '

Writeeeprom Az10 , 10 '

Writeeeprom Az11 , 11 '

Writeeeprom Az12 , 12 '

Writeeeprom Az13 , 13 '

Writeeeprom Az14 , 14 '

Writeeeprom Az15 , 15 '

Writeeeprom Az16 , 16 '

Writeeeprom Az17 , 17 '

Writeeeprom Az18 , 18 '

Writeeeprom Az19 , 19 '

Writeeeprom Az20 , 20 '


'--------Zerowanie zmiennych Az, pozostaną tylko w pamięci Eprom.-----------------------------------------

Az1 = 0 '

Az2 = 0 '

Az3 = 0 '

Az4 = 0 '

Az5 = 0 '

Az6 = 0 '

Az7 = 0 '

Az8 = 0 '

Az9 = 0 '

Az10 = 0 '

Az11 = 0 '

Az12 = 0 '

Az13 = 0 '

Az14 = 0 '

Az15 = 0 '

Az16 = 0 '

Az17 = 0 '

Az18 = 0 '

Az19 = 0 '

Az20 = 0 ' ' ' '



Stop Timer0

Cls 'Wyczyść Lcd.


'------------------------------------------------------------------------------------------------------

Do 'Początek pętli głównej programu.


If Pind.6 = 0 Then 'Jeśli w Portd.6 pojawi się 0...

Enable Timer0 'Odblokuj Timer0.

For I = 1 To 22 'Pętla For.


Waitms 60 'Tutaj jest szybkość przełączania melodyjki.


Select Case I 'Przyglądaj się zmiennej I z pęli For.


Home 'Pokazuj w jednym miejscu.

Lcd Wp 'Pokazuj Wp, Wp jest to samo, co zmienna Az.

Odp = 20 / Wp 'Zrób pełny okres przebiegu generatora.

Locate 2 , 1 '

Lcd Odp ; 'Pokaż wartość zmiennej Odp.

Locate 2 , 4 '

Lcd " KHz " '


Start Timer0 '

Case 1 : Readeeprom Az1 , 1 'Jeśli zmienna I ma 1, odczytaj z Eprom Az1, adres 1.

Wp = Az1 '

Toggle Portd.1 'Przełącz Portd.1 (pokazuje okresy generatora).

Case 2 : Readeeprom Az2 , 2 '

Wp = Az2 '

Toggle Portd.1 '

Case 3 : Readeeprom Az3 , 3 '

Wp = Az3 '

Toggle Portd.1 '

Case 4 : Readeeprom Az4 , 4 '

Wp = Az4 '

Toggle Portd.1 '

Case 5 : Readeeprom Az5 , 5 '

Wp = Az5 '

Toggle Portd.1 '

Case 6 : Readeeprom Az6 , 6 '

Wp = Az6 '

Toggle Portd.1 '

Case 7 : Readeeprom Az7 , 7 '

Wp = Az7 '

Toggle Portd.1 '

Case 8 : Readeeprom Az8 , 8 '

Wp = Az8 '

Toggle Portd.1 '

Case 9 : Readeeprom Az9 , 9 '

Wp = Az9 '

Toggle Portd.1 '

Case 10 : Readeeprom Az10 , 10 '

Wp = Az10 '

Toggle Portd.1 '

Case 11 : Readeeprom Az11 , 11 '

Wp = Az11 '

Toggle Portd.1 '

Case 12 : Readeeprom Az12 , 12 '

Wp = Az12 '

Toggle Portd.1 '

Case 13 : Readeeprom Az13 , 13 '

Wp = Az13 '

Toggle Portd.1 '

Case 14 : Readeeprom Az14 , 14 '

Wp = Az14 '

Toggle Portd.1 '

Case 15 : Readeeprom Az15 , 15 '

Wp = Az15 '

Toggle Portd.1 '

Case 16 : Readeeprom Az16 , 16 '

Wp = Az16 '

Toggle Portd.1 '

Case 17 : Readeeprom Az17 , 17 '

Wp = Az17 '

Toggle Portd.1 '

Case 18 : Readeeprom Az18 , 18 '

Wp = Az18 '

Toggle Portd.1 '

Case 19 : Readeeprom Az19 , 19 '

Wp = Az19 '

Toggle Portd.1 '

Case 20 : Readeeprom Az20 , 20 '

Wp = Az20 '

Toggle Portd.1 '

Case 21 : Disable Timer0 '

Set Portd.1 '


End Select '


Next I '



End If 'Koniec warunku, gdy Pind.6=0 .

Loop '

End '

'--------------------------------------------------------------------------------------------------------

Licz: 'Podprogram.

Incr Zm 'Przy każdym przepełnieniu Timer0 powiększaj Zm.

If Zm = Wp Then 'Jeśli liczba przepełnień wyniesie tyle co zmienna Az (czyli Wp)...

Toggle Portd.3 'Przełącz Portd.3 (który jest wyjściem częstotliwości Timer0).

Zm = 0 '

End If '

Return 'Wróć do programu.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Objaśnienie:

'Timer0 jest generatorem o częstotliwości 20KHz (gdy Wp=1).

'Jeśli Wp (czyli Az) ma inną liczbę niż 1, to częstotliwość wynosi: Wp=40. 20KHz/Wp40=0,5KHz.


'Przed pętlą Do liczby potrzebne do uzyskania różnych częstotliwości genaratora w zmiennej Wp

'zapisujemy do zmiennych Az i zapisujemy do pamięci Eprom. Pozostaną tam nawet po wyłączeniu procesora.

'Jeśli naciśniemy przycisk P1, czyli Portd.6 do masy w pętli Do, wystartuje pętla For I = 1 to 22.

'Czyli pętla For wykona 21 kroków z szykością Waitms XX.

'Instrukcja Select Case wykona czynności: jeśli I wykona 1 krok, odczyta z pamięci Eprom zmienną Az1

'z pod adresu 1, wpisze tę wartość do zmiennej Wp i przełączy Portd.1.

'Przy dalszych krokach wykona podobne czynności.

'Podprogram Licz czeka na pojawianie się wartości Wp, jeśli taka wartość się pojawia, po porównaniu jej ze zmienną Zm

'przełączy Portd.3, co da efekt częstotliwości wyjściowej.


' Na Lcd widzimy: w pierwszej linii pojawiają się liczby Az z szybkościę kroków pętli For,

'w drugiej częstotliwości poszczególnych tonów.

'Uwaga!: pierwszy ton na Lcd, to ton Case 20, Wp=Az20. Na tym tonie melodyjka się kończy i od tego tonu zaczyna.


'Koniec.