BASCOM


Superdokładny miernik pojemności


Pomiar od 1 do ok. 10000pF.


PomC1.bas

'Miernik C w/g nowej koncepcji - dokładny.

'Na scalonych: Atmega8, 555.

'Patrz sch. PomC.png.

'Tutaj miernik na Atmega8 z frekwencją 16MHz.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 43%.

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

 

$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.1 = Output                                     'Włącza dodatkową pojemność tranzystorem.

 Config Pind.3 = Input                                      'Start C.

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

 Config Pind.4 = Output                                     'Led Start C.

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

 Set Portd.3                                                '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.

 Dim Z1 As String * 7                                       '

 Dim Z2 As String * 7                                       '

 Dim Cxz As String * 7                                      '

 Dim F1 As Single                                           'Pierwsza częstotliwość.

 Dim F2 As Single                                           'Druga częstotliwość.

 Dim Cw As Single                                           'Pojemność stała i montażowa.

 Dim Cx As Single                                           'Pojemność mierzona.

 

 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.

 Locate 2 , 1                                               '

 Lcd "Pomiar Frekw."                                        '

 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.

 

Else                                                        'W przeciwnym razie...

  If Pind.3 = 1 Then                                        'Jeśli nie było Start C.

  F1 = Wynik_pomiaru                                        '

  Writeeeprom F1 , 12                                       'Zapisz F1.

  F1 = 0                                                    '

 

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

  Lcd "Cx= " ; Cx ; " pF"                                   'Tu pokaże 0.0 pF.

  Locate 2 , 1                                              '

  Lcd "f1=" ; Z ; " Hz   "                                  'Pokaż Z.

  End If                                                    '

  End If                                                    '

 

  If Pind.3 = 0 Then                                        'Jeśli był Start C..

  Set Portd.1                                               '

  Reset Portd.4                                             '

  Cls                                                       '

  Gosub Dof                                                 'Skocz do podprogramu.                                       '

  End If                                                    '

 

 End If                                                     'Koniec Flaga_aktual_lcd = 1.                                                   '

 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 = 50118 Then                      'Jeśli liczba przerwań Timera0 jest równa 50118, to...

  'Liczbą 50118 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 = 45 Then                             'Po 45 przep.

  Cls                                                       'Czyść LCD.

  Lcd "Przepelnienie"                                       'Wpisz komunikat.

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

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

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

  Waitms 800                                                'Czekaj 1 sek.

   End If                                                   'Koniec warunku gdy będzie 45 przepełnień.

  Set Portd.4                                               'Ustaw 1 w Portd.4 (zgaś Led).

 Return                                                     'Wróć do programu.

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

 Dof:                                                       'Podprogram.

  Do                                                        '

    Home                                                    '

    Waitms 500                                              '

    F2 = Wynik_pomiaru                                      'Druga f, gdy dołączono pojemność.

    Z1 = Str(f2)                                            'Druga f jako słowna.

    Readeeprom F1 , 12                                      'Odczytaj z pamięci.

    Cw = 132                                                '132, to pojemność początkowa i montażowa (dokładnie dobrać!).

    Cx = F1 * Cw                                            '

    Cx = Cx / F2                                            '

    Cx = Cx - Cw                                            '

    Cx = Cx - 3                                             '

  Z2 = Str(cx)                                              'Wynik liczenia zamieniamy na słowny.

   Lcd "Cx= " ; Z2 ;                                        'Pokaż to słowo.

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

  Lcd " pF      "                                           'Napisz pF.

  Locate 2 , 1                                              '

  Lcd "f2= " ; Z1 ; " Hz    "                               'W drugiej linii pokaż drugą frekwencję.

  Loop                                                      '

  End                                                       '

 Return                                                     '

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