'GenTonAkustTablica

Bascom

Generator tonów akustycznych.
To rozwiązanie generatora zawiera w swoim programie tablicę ze zmiennymi tablicowymi.
W tej sytuacji, po wyłączeniu procesora układ dalej pamięta wpisane dane o wysokościach tonów i szybkości przełączania.



'GenTonAkustTablica.bas

'Tworzymy tablicę w postaci zmiennej A z dziesięcioma miejscami.

'Tworzymy zmienną Index, której zawartość będzie wskazywała miejsce znaku w tablicy.

'Druga tablica zawiera treści tekstowe, działa dokładnie tak, jak pierwsza.

'Opracował Henryk Wydmuch.

 

 $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 P1.

  Set Portd.6                                               '

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

  Set Portd.3                                               '

 

 Deflcdchar 1 , 2 , 4 , 12 , 18 , 18 , 18 , 12 , 32         'Tu jest ó.

 

Dim A(20) As Byte                                           'Tablica A z 20 miejscami.

Dim Index As Byte                                           'Index będzie krokiem For i wskazuje miejsce w tablicy.

Dim Zm As Byte                                              'Zmienna Zm zawierać będzie przepełnienia Timer0.

Dim Odp As Single                                           'Zmienna Odp zawierać będzie okresy tonów.

Dim Wp As Byte                                              'Zmienna Wp, zawierać będzie kolejno wartości zmiennych tablicowych.

 

On Timer0 Licz                                              'Podprogram Timer0.

 

Enable Interrupts                                           'Odblokuj wszystkie przerwania.

 

Cls

'Tablica                                                     'Tablica zawierająca zmienne tablicowe.

A(1) = 13                                                   'Pierwsza pozycja w tablicy: 1=13.

 

A(2) = 56                                                   '

 

A(3) = 32                                                   '

 

A(4) = 22                                                   '

 

A(5) = 29                                                   '

 

A(6) = 11                                                   '

 

A(7) = 35                                                   '

 

A(8) = 30                                                   '

 

A(9) = 16                                                   '

 

A(10) = 27                                                  '

 

A(11) = 13                                                  '

 

A(12) = 49                                                  '

 

A(13) = 32                                                  '

 

A(14) = 25                                                  '

 

A(15) = 29                                                  '

 

A(16) = 13                                                  '

 

A(17) = 33                                                  '

 

A(18) = 30                                                  '

 

A(19) = 19                                                  '

 

A(20) = 25                                                  '

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

 

 Do

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

 

For Index = 1 To 20                                         'Pętla For.

 

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

 

  Enable Timer0                                             'Odblokuj Timer0.

  Start Timer0                                              '

 Wp = A(index)                                              'Wp = zmienna tablicowa o numerze index.

  Odp = 20 / Wp                                             '20KHz podziel na okresy.

  Home                                                      'Pokazuj w jednym miejscu.

 Lcd "Gen. ton" ; Chr(1) ; "w"                              'Pokaż w pierwszej linii Lcd.

 

 Locate 2 , 1                                               '

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

 Locate 2 , 4                                               '

 Lcd " KHz      "                                           '

 

 Lcd A(index)                                               'Pokazuj Wp, Wp jest to samo, co zmienna A.

 Toggle Portd.1                                             'Pokazuj okresy diodą Led.

 

 Next Index                                                 'Koniec pętli For.

Else                                                        'W przeciwnym razie (gdy Pind.6=1).

 Stop Timer0                                                '

 End If                                                     '

 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 A (czyli Wp)...

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

Zm = 0                                                      '

End If                                                      '

  Return                                                    '

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

 

'Objaśnienie:

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

'Jego oscylacje są inne, gdy do Wp ładujemy inne liczby niż 1.

'To ładowanie odbywa się pętlą For, która powiększa zmienną Index od 1 do 20.

'Wartość Index pozwala odczytywać zmienne tablicowe A.

'Wartości A zapisywane są do Wp i wykorzystywane w generatorze Timer0.

'Uwaga: Tablica zmiennych musi być przed pętlą Do, a nie za.

'Koniec.