BASCOM


Miernik częstotliwości 95MHz


Miernik, przy pomocy procesora pomocniczego zlicza impulsy wejściowe i automatycznie przełącza zakres. Przełączanie zakresu polega na dodawaniu lub odjęciu dzielnika przez 2 przy pomocy obwodu scalonego 74AC151.


Program sterujący
  • Drugi procesor, zliczający impulsy.

 

'MierCzest06.bas

'Miernik częstotliwości.

'Pomiar od 100Hz do 95MHz, z automatycznym przełączaniem zakresów..

'Wyższy pomiar jest ograniczony szybkością przenoszenia obwodów scalonych.

'Współpracuje z innym procesorem Atmega8, program: MierCzestSterujacy.bas.

'Bez podziału wstępnego mierzy do 7MHz.

'Wzmacniacz wejściowy 74F00, 74F74, 74LS74, 7474 i 74AC151.

'Procesor za pomocą Portd.2, 3, 4 rozpoznaje, który dzielnik aktualnie działa.

'Wyświetla wynik na Lcd.

'Tutaj miernik na Atmega8 z kwarcem 16MHz.

'Fusebit ustawiony na kwarc zewnętrzny 1111.

'Schemat: MierCzest_271107Schem.png.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 42%.

 

$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.2 = Input                                      'Steruje S0 74AC151.

 Config Pind.3 = Input                                      'Steruje S1 74AC151.

 Config Pind.4 = Input                                      'Steruje S2 74AC151.

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

 

 Set Portd.2                                                'Dołącz rezystor podciągający.

 Set Portd.3                                                'Dołącz rezystor podciągający.

 Set Portd.4                                                'Dołącz rezystor podciągający.

 Set Portd.5                                                'Dołącz rezystor podciągający.

 

 Config Pinb.0 = Output                                     'Konfigurujemy Portb.0 dla LED (przepełnienie).

 Set Portb.0                                                'Ustaw 1 w Portb.0.

 

 On Timer0 Odmierz_1s                                       'Podprogramdla 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. Tu załadujemy liczbę przerwań Timera0.

 Dim Lczba_przep_tim1 As Word                               'Rezewujemy jeden bajt dla zmiennej Liczba_przep_tim1. Tu załadujemy liczbę przerwań Timera1.

 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. Tu znajdzie się wynik pomiaru.

 Dim Z As String * 7

 

 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.                                                'Koniec warunku 3 sprawdzeń.

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

  Lcd " Brak sygnalu"                                       'Pokaż komunikat.

 

Else                                                        'W przeciwnym razie...

  If Wynik_pomiaru < 1000 Then                              'Jeśli wynik pomiaru będzie poniżej 1kHz...

  Z = Str(wynik_pomiaru)                                    '

  Lcd Z                                                     '

  Locate 1 , 10                                             '

  Lcd " Hz    "                                             '

  Cursor Off                                                'Wyłącz kursor.

  Start Timer1                                              '

  Start Timer0                                              '

 

Else                                                        'W przeciwnym razie...

  If Wynik_pomiaru < 1000000 Then                           'Jeśli wynik pomiaru będzie poniżej 1MHz...

  Wynik_pomiaru = Wynik_pomiaru * 0.001                     '

  Z = Str(wynik_pomiaru)                                    '

  Lcd Z                                                     '

  Locate 1 , 10                                             '

  Lcd " KHz   "                                             '

  Cursor Off                                                'Wyłącz kursor.

  Start Timer1                                              '

  Start Timer0                                              '

 

Else                                                        'W przeciwnym razie...

  If Wynik_pomiaru < 7000000 Then                           'Jeśli wynik pomiaru będzie poniżej 7MHz...

     If Pind.2 = 1 Then                                     'Jeśli S0=1.

     If Pind.3 = 1 Then                                     'Jeśli S1=1.

     If Pind.4 = 0 Then                                     'Jeśli S2=0.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001               '

     Z = Str(wynik_pomiaru)                                 '

     Lcd Z                                                  '

     Locate 1 , 10                                          '

     Lcd " MHz   "                                          '

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

     'Pomiar do 400MHz

     If Pind.2 = 1 Then                                     'Jeśli S0=1.

     If Pind.3 = 1 Then                                     'Jeśli S1=1.

     If Pind.4 = 1 Then                                     'Jeśli S2=1.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001

     Wynik_pomiaru = Wynik_pomiaru * 64                     'Wykonaj mnożenie.

     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.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

     'Pomiar do 224MHz

     If Pind.2 = 0 Then                                     'Jeśli S0=0.

     If Pind.3 = 1 Then                                     'Jeśli S1=1.

     If Pind.4 = 1 Then                                     'Jeśli S2=1.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001

     Wynik_pomiaru = Wynik_pomiaru * 32                     'Wykonaj mnożenie.

     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.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

     'Pomiar do 112MHz

     If Pind.2 = 1 Then                                     'Jeśli S0=1.

     If Pind.3 = 0 Then                                     'Jeśli S1=0.

     If Pind.4 = 1 Then                                     'Jeśli S2=1.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001

     Wynik_pomiaru = Wynik_pomiaru * 16                     'Wykonaj mnożenie.

     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.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

     'Pomiar do 56MHz

     If Pind.2 = 0 Then                                     'Jeśli S0=0.

     If Pind.3 = 0 Then                                     'Jeśli S1=0.

     If Pind.4 = 0 Then                                     'Jeśli S2=0.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001

     Wynik_pomiaru = Wynik_pomiaru * 8                      'Wykonaj mnożenie.

     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.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

     'Pomiar do 28MHz

     If Pind.2 = 1 Then                                     'Jeśli S0=1.

     If Pind.3 = 0 Then                                     'Jeśli S1=0.

     If Pind.4 = 0 Then                                     'Jeśli S2=0.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001

     Wynik_pomiaru = Wynik_pomiaru * 4                      'Wykonaj mnożenie.

     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.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

     'Pomiar do 14MHz

     If Pind.2 = 0 Then                                     'Jeśli S0=0.

     If Pind.3 = 1 Then                                     'Jeśli S1=1.

     If Pind.4 = 0 Then                                     'Jeśli S2=0.

     Wynik_pomiaru = Wynik_pomiaru * 0.000001

     Wynik_pomiaru = Wynik_pomiaru * 2                      'Wykonaj mnożenie.

     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.

     Cursor Off                                             'Wyłącz kursor.

     Start Timer1                                           '

     Start Timer0                                           '

     End If                                                 'Koniec warunków S0, S1, S2.

     End If                                                 '

     End If                                                 '

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

   End If                                                   '

   End If                                                   '

   End If                                                   '

   End If                                                   '

   End If                                                   'Koniec warunku flagi.

 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.

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

'Koniec