'1MierCzest.bas

'Pomiar do 30MHz.

'Miernik częstotliwości (przykład ze wzm. wstępnym na 74H00 i 74H74).

'Bez podziału wstępnego mierzy do 6,8MHz.

'Wyświetla wynik na Lcd.

'Tutaj miernik na Atmega8 z kwarcem 16MHz.

'Fusebit ustawiony na kwarc zewnętrzny 1111.

'Patrz sch. 1MierCzest.png.

'Opracował Henryk Wydmuch.

'Sprawdzony, b.d.

'Pamięć zajęta w 29%.

 

$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.7 = Input                                      'Port uzyskujący informację z przełącznika Prz1.

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

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

 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.6                                                'Dołącz rezystor podciągający.

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

 Set Portb.0                                                'Dołącz rezystor podciągający.

 

 On Timer0 Odmierz_1s                                       'Podprogramdla Timera0 o nazwie Odmierz_1s.

 On Timer1 Zlicz_przep_tim1                                 'Podprogram dla Timera1.

 

 Dim Liczba_przerwan_tim0 As Word                           'Rezerwujemy dwa bajty w pamięci dla zmiennej Liczba_przerwan_tim0. Tu załadujemy liczbę przerwań Timera0.

 Dim Lczba_przep_tim1 As Byte                               '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                                        'Z jako zmienna słowna z siedmioma miejscami.

 

 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                                               '

 Locate 2 , 1                                               '

 Lcd "Pomiar Frekw."                                        '

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

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.

 

Else                                                        'W przeciwnym razie...

  If Pind.7 = 0 Then                                        'Jeśli do Portd.7 doprowadzono 0.

  Wynik_pomiaru = Wynik_pomiaru * 4                         'Pomiar * 4, bo z jednym 74H74.

  Wynik_pomiaru = Wynik_pomiaru * 0.000001                  'Tu doprowadzamy do odczytu w MHz.

  Z = Str(wynik_pomiaru)                                    'Wartość w Wynik_pomiaru zamień na słowną.

  Lcd Z                                                     'Napisz "MHz"

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

  Lcd " MHz   "                                             'Napisz "MHz"

 

Else

  If Pind.7 = 1 Then                                        'Jeśli do Portd.7 doprowadzono 1.

  Wynik_pomiaru = Wynik_pomiaru * 1                         'Pomiar * 1.

  Wynik_pomiaru = Wynik_pomiaru * 0.001                     'Tu doprowadzamy do odczytu w MHz.

  Z = Str(wynik_pomiaru)                                    'Wartość w Wynik_pomiaru zamień na słowną.

  Lcd Z                                                     'Pokaż ją na Lcd.

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

  Lcd " KHz   "                                             'Napisz "KHz"

  Start Timer1                                              '

  Start Timer0                                              '

 

   End If                                                   'Koniec warunków.

    End If                                                  '

     End If                                                 '

      End If                                                '

 Loop                                                       'Powtórz pętlę.

 End                                                        'Koniec pętli.

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

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

  Timer0 = 6                                                'Do Timera0 dodaj sześć i zapamiętaj jako Timer0 (zliczy 250).

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

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

  'Liczbą 59202 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:

  Enable Interrupts                                         'Podprogram Timera1 (przekroczenie zakresu).

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

  If Lczba_przep_tim1 = 104 Then                            'Po 108 przepełnieniach Timer-a 1 (czyli po 6,82MHz)...

  Cls                                                       'Czyść LCD.

  Lcd "Przepelnienie"                                       'Wpisz komunikat.

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

  Lcd "   licznika!"                                        'W drugiej linii wyświetl:

  Portb.0 = 0                                               'Ustaw 0 w Portb.0 (zaświeć Led).

  Waitms 800                                                'Czekaj 1 sek.

   End If                                                   'Koniec warunku gdy będą 104 przepełnienia.

  Set Portb.0                                               'Ustaw 1 w Portb.0 (zgaś Led).

 Return                                                     'Wróć do programu.