'DwaStrzaly

Strzały z karabinu

Generator akustyczny na Timer0 imitujący dwa strzały z karabinu.


'DwaStrzaly.bas

 'Generator strzałów.

 'Opis pod programem.

 'Opracował Henryk Wydmuch

 'Program zajmuje 6% pamięci.

 

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

$crystal = 10240000                                         'Informujemy kompilator o kwarcu 10.24MHz.

 

 Config Timer0 = Timer , Prescale = 1                       'Timer0 jako licznik czasu.

 

 

 Config Pind.6 = Output                                     'Port wyjściowy częstotliwości.

  Set Portd.6                                               'Ustaw poziom wysoki na wyjściu Portd.6.

 Config Pind.1 = Input                                      'Przycisk.

  Set Portd.1                                               '

 Config Pind.0 = Output                                     'Led.

  Set Portd.0                                               '

 

 Dim Zm As Byte                                             'Zm, zmienna przerwań Timer0.

 Dim Wp As Byte                                             'Wp, zmienna do której będzie wpisywana liczba do podziału.

 

 On Timer0 Licz                                             'Podprogram.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              'Odblokuj przerwania Timer0.

 Stop Timer0                                                '

 

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

Do                                                          'Pętla do.

  If Pind.1 = 0 Then                                        'Jeśli przyciśnięto przycisk.

  Start Timer0                                              '

 

 For Wp = 1 To 60                                           'Pętla For ma kroczyć od 1 do 60.

  Toggle Portd.0                                            'Zaświeć Led.

 Waitms 4                                                   'Trzymaj każdą pozycję przez 4mS.

     If Wp = 60 Then                                        'Gdy będzie 60-ty krok...

     For Wp = 1 To 80                                       'Następna pętla krocząca.

     Toggle Portd.0                                         'Led.

     Waitms 4                                               'Krocz co 4mS.

     Next                                                   'Koniec pierwszej For.

     End If                                                 '

 Next                                                       'Koniec drugiej For.

 Stop Timer0                                                '

 End If                                                     'Tutaj, do zmiennej Wp wpisujemy liczbę podziału 20KHz.

 Loop                                                       'Powtórz pętlę.

End                                                         'Koniec pętli.

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

Licz:                                                       'Podprogram Timer0.

   Incr Zm                                                  'Po każdym przerwaniu powiększaj zmienną.

   If Zm = Wp Then                                          'Jeśli jest tyle przerwań, ile w Wp, to Toggle.

   Toggle Portd.6                                           'Zmień stan Portd.6.

   Zm = 0                                                   'Zeruj zmienną.

   End If                                                   '

  Return                                                    'Wróć do programu.

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

 

'Objaśnienie:

'Budujemy generator z częstotliwością wyznaczaną przez pętlę For..

'Zajmujemy się Timer0.

'Jedno zapełnienie Timer0, to 256 impulsów.

'Kwarc 1024000/256=4000, to 4000 szczytów sinusoidy.

'Dwa szczyty sinusoidy, to jeden okres.

'Jedno przerwanie trwa 25uS (mikrosekund), jest to połowa okresu.

'Jeden okres trwa 50uS.

'Z iterfejsu Czasy.exe możemy zobaczyć, że 50uS to frekwencja 20KHz.

'Jeśli do Wp wpiszemy podział 1, to generator będzie oscylował z częstotliwością właśnie 20KHz.

'Każdą inną częstotliwość możemy otrzymać gdy Wp ma inną liczbę podziału.

'Przykład: Wp=18.  20KHz/18=1,11KHz.

 

'Co 4mS 20KHz będzie dzielone przez inną liczbę. Liczbę tę wyznacza pętla For.

'Koniec.