BASCOM


Woltomierz do 10V z rozdzielczością 1mV.




'LinijkaPomiarowa1.bas

'Pomiar napięcia wejściowego (do 10V).

'Wynik na Lcd.

'Tutaj bez przełączania Portd.7.

'W pierwszej linii Lcd - wynik liczbowy.

'W drugiej linii Lcd - linijka.

'Tutaj miernik na Atmega8 z kwarcem 16MHz.

'Fusebit ustawiony na kwarc zewnętrzny 1111.

'Patrz sch. LinijkaPomiarowa.png.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 35%.

 

$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.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.

 

 Deflcdchar 1 , 12 , 4 , 6 , 12 , 4 , 4 , 14 , 32           'Napisaliśmy ł.

 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.

 

 Cursor Off

 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                                               '

 Cls

 Lcd "Pomiar U"                                             '

 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ę.

 

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

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

     Cls

     Lowerline

     Lcd "Brak sygna" ; Chr(1) ; "u"                        'Pokaż komunikat (Brak sygnału).

     End If

 

  Wynik_pomiaru = Wynik_pomiaru * 1                         'Pomiar * 1.

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

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

  Lcd Z ; " mV   "                                          'Pokaż ją na Lcd.

 

   Home

   Lowerline                                                'W drugiej linii...

 

   If Wynik_pomiaru => 400 Then                             'Jeśli wynik pomiaru będzie równy lub większy od 10mV, to...

   Lcd "|" ;                                                'Pokaż na Lcd jedną kreskę pionową.

   End If                                                   '

 

   If Wynik_pomiaru => 700 Then                             '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 1000 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 1600 Then                            '

   Lcd "|";                                                 '

   End If                                                   '

 

   If Wynik_pomiaru => 2200 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 2800 Then                            '

   Lcd "|";                                                 '

   End If                                                   '

 

   If Wynik_pomiaru => 3400 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 4000 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 4600 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 5200 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 5800 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 6400 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 7000 Then                            '

   Lcd "|";                                                 '

   End If                                                   '

 

   If Wynik_pomiaru => 7600 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 8200 Then                            '

   Lcd "|" ;                                                '

   End If                                                   '

 

   If Wynik_pomiaru => 8800 Then                            '

   Lcd "|";                                                 '

   End If                                                   '

 

    End If                                                  'Koniec warunków.

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

  'Liczbą 51388 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ędzie 78 przepełnień.

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

 Return                                                     'Wróć do programu.

 'Koniec.