BASCOM


Miernik częstotliwości 200MHz



 

'MierCzest09.bas

'Miernik częstotliwości.

'Pomiar: od 8KHz do 30MHz i od 3MHz do 200MHz.

'Zakres przełączany ręcznie.

'Zakres pokazywany jest na Lcd.

'Wzmacniacz wejściowy-dzielnik CD3500, UPC1688, 74LS74.

'Procesor za pomocą Portd.6, 7, rozpoznaje, jakim programem zadziałać.

'Wyświetla wynik na Lcd.

'Tutaj miernik na Atmega8 z kwarcem 16MHz.

'Fusebit ustawiony na kwarc zewnętrzny 1111.

'Schemat: MierCzest09.png.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 30%.

 

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

$crystal = 16000000                                         'Informujemy kompilator o kwarcu 16MHz.

 

 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 Timer z podziałem przez 1.

 Config Timer1 = Counter , Edge = Falling                   'Timer1 jako licznik działający od zbocza opadającego.

 

 Config Pind.6 = Input                                      'Port rozpoznający zakres.

 Config Pind.7 = Input                                      'Port rozpoznający zakres.

 Config Pind.5 = Input                                      'Konfiguruj Portd.5 jako wejście.

 

 On Timer0 Odmierz_1s                                       'Podprogram dla Timera0 o nazwie Odmierz_1s.

 On Timer1 Zlicz_przep_tim1                                 'Podprogram dla Timera1.

 

 Dim Liczba_przerwan_tim0 As Long                           'Rezerwujemy dwa bajty w pamięci dla zmiennej Liczba_przerwan_tim0.

 Dim Lczba_przep_tim1 As Word                               'Rezewujemy jeden bajt dla zmiennej Liczba_przep_tim1.

 Dim Flaga_aktual_lcd As Bit                                'Rezerwujemy jeden bit na aktualizację wyświetlacza Lcd.

 Dim Wynik_pomiaru As Single                                'Rezerwujemy cztery bajty dla zmiennej Wynik_pomiaru.

 Dim Z As String * 7                                        'Z jako siedmio miejscowa zmienna słowna.

 

 Declare Sub 30mhz                                          'Deklaracja procedury.

 Declare Sub 150mhz                                         'Deklaracja procedury.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              'Odblokowujemy przerwanie Timera0.

 Enable Timer1                                              'Odblokowujemy przerwanie Timera1.

 

 Stop Timer0                                                'Zatrzymujemy Timer0.

 Stop Timer1                                                'Zatrzymujemy Timer1.

 

 Timer1 = 0                                                 'Zerujemy Timer1.

 Wynik_pomiaru = 0                                          'Zerujemy zmienną Wynik_pomiaru.

 Liczba_przerwan_tim0 = 0                                   'Zerujemy zmienną zawierającą liczbę przerwań Timera0.

 Lczba_przep_tim1 = 0                                       'Zerujemy zmienną zawierającą liczbę przerwań Timera1.

 Start Timer1                                               '

 Start Timer0                                               '

 

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

Do                                                          'Start pętli głównej.

  If Flaga_aktual_lcd = 1 Then                              'Jeśli flaga aktualizacji Lcd włączona (po każdej sekundzie), to...

  Flaga_aktual_lcd = 0                                      'Zeruj flagę.

  Cls                                                       'Czyść LCD.

  If Wynik_pomiaru = 0 Then                                 'Jeśli nie doprowadzono sygnału do wejścia...

  Lcd Wynik_pomiaru ; " Hz"                                 'Pokaż wynik w LCD.

  Locate 2 , 1                                              'Druga linia Lcd, na początku...

  Lcd " Brak sygnalu"                                       'Pokaż komunikat.

  Waitms 160                                                'Trzymaj komunikat 160mS.

Else                                                        'W przeciwnym razie...

  If Wynik_pomiaru > 7500200 Then                           ''Jeśli mierzona frekwencja przekroczy 30MHz.

  Lcd "Zakres!"                                             'Pokaż (przełącz wejście na drugie gniazdo).

  End If                                                    '

  End If                                                    '

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

  If Pind.7 = 1 Then                                        'Jeśli przełącznik zakresu poda + na Pd.7.

  Call 150mhz                                               'Wywołaj procedurę 150MHz.

  End If                                                    '

 Else                                                       'W przeciwnym razie...

  If Pind.6 = 1 Then                                        'Jeśli przełącznik zakresu poda + na Pd.6.

  Call 30mhz                                                'Wywołaj procedurę 30MHz.

  End If                                                    '

 

 End If                                                     'Koniec warunku Flaga_aktual_lcd.

 Loop                                                       'Powtórz pętlę.

 End                                                        'Koniec pętli.

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

 Odmierz_1s:                                                'Podprogram dla Timera0 (wyznaczanie 1sek).

  Incr Liczba_przerwan_tim0                                 'Liczbę przerwań Timera0 powiększ o jeden.

  If Liczba_przerwan_tim0 = 62499 Then                      'Jeśli liczba przerwań Timera0 jest równa 62499, to...

  'Liczbą 62499 ustalamy dokładny pomiar.

  Liczba_przerwan_tim0 = 0                                  'Wyzeruj zmienną.

  Wynik_pomiaru = 65536 * Lczba_przep_tim1                  'Zmienną Liczba_przep_tim1 pomnóż przez 65536,

                                                            'a wynik wstaw do zmiennej Wynik_pomiaru.

  Wynik_pomiaru = Wynik_pomiaru + Timer1                    'Wynik powyższego działania dodaj do aktualnej zawartości

                                                            'Timera1 i ten wynik wpisz do zmiennej Wynik_pomiaru.

  Flaga_aktual_lcd = 1                                      'Załącz flagę aktualizacji Lcd.

  Lczba_przep_tim1 = 0                                      'Zeruj flagę przepełnień Timera1.

  Timer1 = 0                                                'Zeruj Timer1.

   End If                                                   'Koniec uwarunkowania.

 Return                                                     'Wróć do programu.

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

 Zlicz_przep_tim1:                                          'Podprogram Timera1.

  Enable Interrupts                                         'Odblokuj przerwania.

  Incr Lczba_przep_tim1                                     'Zawartość zmiennej Liczba_przep_tim1 powiększ o jeden.

 Return                                                     'Wróć do programu.

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

 Sub 150mhz                                                 'Procedura.

  Wynik_pomiaru = Wynik_pomiaru * 0.000001                  'Wykonaj mnożenie (zamiana Hz na MHz).

  Wynik_pomiaru = Wynik_pomiaru * 8                         'Wykonaj mnożenie (CD3500).

  Wynik_pomiaru = Wynik_pomiaru * 4                         'Wykonaj mnożenie (74LS74).

     Z = Str(wynik_pomiaru)                                 'Zamień wartość cyfrową na słowną.

     Lcd Z                                                  'Pokaż słowo.

     Locate 1 , 10                                          'Pierwsza linia Lcd, 10 miejsce.

     Lcd " MHz   "                                          'Pokaż słowo, a za nim MHz.

     Locate 2 , 1                                           'Pierwsza linia Lcd, 1 miejsce.

     Lcd "Pomiar do 200MHz "                                'Pokaż.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

  End Sub                                                   'Koniec procedury.

  Return                                                    'Wróć do pętli.

 

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

  Sub 30mhz                                                 'Procedura.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001               'Wykonaj mnożenie (zamiana Hz na MHz).

     Wynik_pomiaru = Wynik_pomiaru * 4                      'Wykonaj mnożenie (74LS74).

     Z = Str(wynik_pomiaru)                                 'Zamień wartość cyfrową na słowną.

     Lcd Z                                                  'Pokaż słowo.

     Locate 1 , 10                                          'Pierwsza linia Lcd, 10 miejsce.

     Lcd " MHz   "                                          'Pokaż słowo, a za nim MHz.

     Locate 2 , 1                                           'Pierwsza linia Lcd, 1 miejsce.

     Lcd " Pomiar do 30MHz "                                'Pokaż.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

  End Sub                                                   'Koniec procedury.

  Return                                                    'Wróć do pętli.

 

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