BASCOM

MIKROPROCESOROWY MIERNIK POJEMNOŚCI


Miernik do pomiaru pojemności od 1pF do uF.



'8MierPojAtm8.bas

 'MIKROPROCESOROWY MIERNIK POJEMNOŚCI

 'Pomiar od 1pF - uF.

 'Na procesorze Atmega8 i 74HC4060.

 'Timer1 wkorzystany jako Counter do zliczania impulsów.

 'Timer0 wykorzystany do migania diody LED.

 'Mikrofarady mierzone są wolno, z szybkością 60uF/1min.

 'Portd.5 jest wejściem impulsów zliczanych jako pF.

 'Diodę świecącą dołączamy do Portd.6.

 'Sterowanie procesora z oscylatora zewnętrznego 16MHz.

 'Wejście oscylatora zew. do procesora w Portb.6.

 'Opracował Henryk Wydmuch

 'Patrz: 7MierPojAtm8.png.

 'Program zajmuje 33% pamięci.

 

$crystal = 160000000                                        'Deklarujemy częstotliwość zewnętrzną 16MHz. (External clock 0000).

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

Config Lcd = 16 * 2                                         'Podajemy jaki użyjemy wyświetlacz.

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

'Iformujemy do jakich Pinów będzie podłączony wyświetlacz.

 

Config Timer1 = Counter , Edge = Rising                     'Konfigurujemy Timer1 jako licznik reagujący na zbocze opadające.

Config Timer0 = Timer , Prescale = 256                      'Konfigurujemy Timer0 jako dzielnik przez 256 (dla Led migającej).

Config Pind.6 = Output                                      'Pind.6 jako wyjście (dioda migająca).

Config Pind.5 = Input                                       'Pind.5 - wejście.

Config Pind.3 = Output                                      'Portd.3 - wyjście impulsu startu pomiaru.

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

Config Pinb.1 = Input                                       'Portb.1 - wejście dla przycisku startu pomiaru.

   Set Portb.1                                              'W Portb.1 ustaw rezystor podciągający, będzie poziom wysoki.

Config Pind.0 = Input                                       'Portd.0 wejście impulsu dodatniego (czas pomiaru).

Config Pinb.0 = Output                                      'Wyjście blokowania sygnału 1MHz.

Config Pinb.2 = Output                                      'Brzęczyk na czas pomiaru.

   Set Portb.2                                              '

 

On Timer0 Sekunda                                           'Podprogram do wykonania o nazwie Sekunda (dioda migająca).

On Timer1 Etykieta                                          'Podprogram Timera1 o nazwie Etykieta (co robić z przepełnieniami).

 

Cursor Off                                                  'Wyłącz kursor.

 Cls                                                        'Czyść Lcd.

 

 Dim Przep As Long                                          'Deklarujemy przepełnienia Timera1 o nazwie Przep.

 Dim Pojemnosc As Single                                    'Deklarujemy wyniku pomiaru, wynik jako Pojemnosc.

 Dim Licz As Byte                                           'Licz, zmienna Timera0.

 Dim Z As String * 5                                        'Z, jako zmienna słowna do umieszczenia słownego wyniku.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer1                                              'Odblokuj przerwanie Timera1.

 Enable Timer0                                              'Odblokuj przerwanie Timera0.

 

 Przep = 0                                                  'Zerujemy zmienną Przep.

 Pojemnosc = 0                                              'Zerujemy zmienną Pojemnosc.

 Z = " "                                                    'Zerujemy zmienną słowną Z.

 Locate 2 , 2                                               'Druga linia Lcd, czwarta pozycja od lewej.

 Lcd " Pomiar C "                                           'Wpisz tekst w cudzysłowie.

 Stop Timer1                                                'Zatrzymaj pracę Timera1.

 Timer1 = 0                                                 '

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

 Do                                                         'Początek pętli głównej programu.

 

 Bitwait Pinb.1 , Reset                                     'Jeśli wejście Pind.1 zmieni się na poziom niski to...

 Portd.3 = 0                                                'Portd.3 pozim niski.

 Set Portb.0                                                'Portb.0 poziom wysoki

 Reset Portb.2                                              'Włącz brzęczyk.

 

 Start Timer1                                               'Włącz Timer1.

  Bitwait Pind.0 , Reset                                    'Czekaj na poziom wysoki z zegara 555.

  Stop Timer1

  Reset Portb.0                                             'Podaj pozim niski do Portb.0.

  Toggle Portb.2                                            'Wyłącz brzęczyk.

 

 If Przep = 0 Then                                          'Jeśli nie było przepełnienia, to...

 If Counter1 < 20 Then                                      'Jeśli w Counter1 jest 20 pF pojemności montażowej, to...

 Pojemnosc = 0                                              'To przyjmij, że zmienna Pojemnosc załadowana jest 0 pF (zero impulsów).

 Home                                                       'Napisz tekst w pierwszej linii Lcd, ustaw napis na początku i tylko jeden raz.

 Lcd Pojemnosc ; " pF"                                      'Napisz w Lcd zawartość Countera1 przed pF w cudzysłowie.

Else                                                        'W przeciwnym razie....

 

 If Przep = 0 Then                                          'Jeśli nie było przepełnienia, to...

 Pojemnosc = Counter1 - 22                                  'Zmienna Pojemnosc zawiera: od zawartości Counter1 odejmij pojemność montażową.

 Home                                                       'Napisz tekst w pierwszej linii Lcd, ustaw napis na początku i tylko jeden raz.

 Lcd Pojemnosc ; " pF"                                      'Napisz w Lcd zawartość Countera1 przed pF w cudzymsłowie.

   End If                                                   'Koniec uwarunkowań gdy Przep = 0.

    End If                                                  '

     End If                                                 '

 

 If Przep > 0 Then                                          'Jeśli Przep jest większe od 0.

 Pojemnosc = Przep * 65536                                  'Liczbę Przep pomnóż przez 65536.

 Pojemnosc = Pojemnosc + Counter1                           'Do Pojemnosc dodaj resztę w Counter1.

 Pojemnosc = Pojemnosc / 100                                'Doprowadzamy do wyniku w uF.

 Pojemnosc = Pojemnosc / 100                                '

 Pojemnosc = Pojemnosc / 100                                '

                                                                                          '

 Z = Str(pojemnosc)                                         'Do Z wpisujemy wynik jako słowny.

 Z = Fusing(pojemnosc , "#.###")                            'Doprowadzamy do pokazywania tylko trzech liczb po przecinku.

 

 Home                                                       'Napisz tekst w pierwszej linii Lcd, ustaw napis na początku i tylko jeden raz.

 Lcd Z ; " uF  "                                            'Wynik wyświetl w uF.

 End If                                                     'Koniec warunku gdy Przep>0

   Exit Do

    Loop                                                    'Powtórz pętlę.

End                                                         'Tu jest koniec pętli.

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

Sekunda:                                                    'Podprogram Tim0 Sekunda.

   Incr Licz                                                'Poiększ zawartość Licz o jeden.

   If Licz = 100 Then                                       'Jeśli zawartość Licz wynosi 100, to...

   Licz = 0                                                 'Wyzeruj zmienną Licz.

   Toggle Portd.6                                           'Zmień stan Portd.0 na przeciwny.

    End If                                                  'Koniec uwarunkowania.

Return                                                      'Wróć do programu.

 

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

Etykieta:                                                   'Podprogram Tim1 Etykieta.

   Incr Przep                                               'Powiększ zawartość Przep o jeden.

Return                                                      'Wróć do programu.

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

 

'Instrukcja obsługi

'- włącz urządzenie,

'- naciśnij Reset,

'- jeśli wyświetlacz pokazuje 0 włóż C w szczęki pomiarowe,

'- naciśnij Start,

'- odczytaj wynik,

'- przy większych pojemnościach słychać brzęczyk w czasie pomiaru.

 

'Objaśnienia:

'Generator kwarcowy oscyluje z częstotliwością 16MHz. Następnie 16MHz jest dzielone przez 16.

'1MHz = 1000000 impulsów w ciągu 1sek.

'Do Portd.5 podane jest 1000000 impulsów na sekundę.

'1sek/1000000 = 0,000001sek = 1000nS.

'Więc, jeden ipuls trwa 1000nS.

'Na wyjściu nr.3 obwodu scalonego 555 pojawia się dodatni impuls do pomiaru pojemności.

'Czas trwania tego impulsu jest proporcjonalny do pojemności kondensatora.

'Przykładowo: jeśli mierzony kondensator ma pojemność 1pF, to czas tego impulsu wynosi 1000nS.

'10pF=10000nS=10uS

'100pF=100000nS

'1000pF=1000000nS

'Albo: jeśli mierzony kondensator ma pojemność 24736pF, to czas impulsu wynosi 24736*1000nS=24736000nS=0,024736s.

'Albo: jeśli kondensator ma pojemność 1uF czyli 1 000 000pF, to czas impulsu czyli czas pomiaru wynosi:

'1000000*1000nS=1000000000nS=1s. Odpowiedź: 1uF mierzony jest w czasie 1sek.

 

'Wyjście dodatniego impulsu (patrz schemat):

'jeśli potrzebujesz jeden impuls o długości 1sek (lub inny) włóż w szczęki pomiarowe C 1uF(lub inny) i naciśnij Start.