logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

mega8][basc][przetwornik adc 0-3] lcd 4x20 jako 4 linijki?

lok56 22 Sie 2009 22:38 1713 2
REKLAMA
  • #1 6922537
    lok56
    Poziom 12  
    Witam!
    Jak w tytule , atmega 8 na wejsciu przetworników ADC (0-3 ) podawane napiecie ktore jest w przybliżeniu wswietlane na LCD 4x20 w postaci 4 linijek swietlnych. Napisałem szkielet programu
    (niektóre łatki z elektrody;) ). jestem poczatkujący i moja koncepcja może jest skomplikowana a może byc prościejsza i krótsza występuje łąd w symulaji programowej w lini 1,16 i 2,16
    zapalone segmenty wyswietlacza
    tutaj kod programu:

    $sim
     $regfile = "m8def.dat"
    $crystal = 1000000
    Config Lcd = 16 * 4
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
    Cursor Off
    
    Deflcdchar 1 , 32 , 32 , 32 , 32 , 16 , 16 , 16 , 32
    Deflcdchar 2 , 32 , 32 , 32 , 32 , 20 , 20 , 20 , 32
    Deflcdchar 3 , 32 , 32 , 32 , 32 , 21 , 21 , 21 , 32
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
    
    Start Adc
    Dim W As Word
    Dim Volt As Word
    Dim Volt_d As Byte
    Dim Pozycja As Byte
    Dim Licznik As Byte
    Dim Calosc As Byte
    Dim Ulamek As Byte
    Dim Spacja As Byte
    Cls
    
    Do
     W = Getadc(0)
      Volt = W * 4
      Volt_d = Volt Mod 10
      Volt = Volt / 10
      'Locate 1 , 19
      'Lcd Volt ; " " ; Volt_d
    
    Gosub Linijka1
    Waitms 25
    W = Getadc(1)
      Volt = W * 4
      Volt_d = Volt Mod 10
      Volt = Volt / 10
    Gosub Linijka2
    Waitms 25
    
     W = Getadc(2)
      Volt = W * 4
      Volt_d = Volt Mod 10
      Volt = Volt / 10
    
    Gosub Linijka3
    Waitms 25
    W = Getadc(3)
      Volt = W * 4
      Volt_d = Volt Mod 10
      Volt = Volt / 10
    Gosub Linijka4
    Waitms 25
    Loop
    End
    
    Linijka1:
    
    
    Pozycja = Volt / 10                                         'przeliczenie max zakresu zm wartość na ilość
                                                                 'dostępnych pozycji wyświetlacza - 48 (16*3)
    Calosc = Pozycja / 3                                        'Jedna pozycja wyświetlacza może wyswietlać 3 wartości
    Ulamek = Pozycja Mod 3                                      'O rodzaju znaku zakończenia linijki informuje zmienna Ulamek
    
    For Licznik = 0 To Calosc
    Locate 1 , Licznik
    Lcd Chr(3)
    Next Licznik                                                'Wyśwetlamy ilość całości
    
    If Ulamek = 1 Then
    Locate 1 , Licznik
    Lcd Chr(1);
    Incr Licznik
    End If
                                'Dopisujemy niepełną pozycję  1/3 lub 2/3
    If Ulamek = 2 Then
    Locate 1 , Licznik
    Lcd Chr(2);
    Incr Licznik
    End If
    
    For Spacja = Licznik To 16                                  'Resztę wypełniamy spacjami
    Locate 1 , Spacja
     Lcd " ";
    Next Spacja
    
    Return
    
    
     Linijka2:                                                                       ' 2-4 linijka tak samo jak pierwsza
    
    
    Pozycja = Volt / 5                                   
                                                                 
    Calosc = Pozycja / 3                                      
    Ulamek = Pozycja Mod 3                                    
    
    For Licznik = 0 To Calosc
    Locate 2 , Licznik
    Lcd Chr(3)
    Next Licznik                                            
    
    If Ulamek = 1 Then
    Locate 2 , Licznik
    Lcd Chr(1);
    Incr Licznik
    End If
                                '
    If Ulamek = 2 Then
    Locate 2 , Licznik
    Lcd Chr(2);
    Incr Licznik
    End If
    
    For Spacja = Licznik To 16                             
    Locate 2 , Spacja
     Lcd " ";
    Next Spacja
    
    Return
    
    
    Linijka3:
    
    
    Pozycja = Volt / 5                                         
                                                                 
    Calosc = Pozycja / 3                                       
    Ulamek = Pozycja Mod 3                                    
    
    For Licznik = 0 To Calosc
    Locate 3 , Licznik
    Lcd Chr(3)                                                  
    Next Licznik
    
    If Ulamek = 1 Then
    Locate 3 , Licznik
    Lcd Chr(1);
    Incr Licznik
    End If
    
                                                                   
    If Ulamek = 2 Then
    Locate 3 , Licznik
    Lcd Chr(2);
    Incr Licznik
    End If
    
    
    
    For Spacja = Licznik To 16                               
    Locate 3 , Spacja
     Lcd " ";
    Next Spacja
    
    Return
     Linijka4:
    
    
    Pozycja = Volt / 5                                        
                                                                 
    Calosc = Pozycja / 3                                       
    Ulamek = Pozycja Mod 3                                      
    
    For Licznik = 0 To Calosc
    Locate 4 , Licznik
    Lcd Chr(3)
    Next Licznik                                              
    
    If Ulamek = 1 Then
    Locate 4 , Licznik
    Lcd Chr(1);
    Incr Licznik
    End If
                               
    If Ulamek = 2 Then
    Locate 4 , Licznik
    Lcd Chr(2);
    Incr Licznik
    End If
    
    For Spacja = Licznik To 16                              
    Locate 4 , Spacja
     Lcd " ";
    Next Spacja
    
    Return


    prosze o ewentualne uwagi co by poprawić i wyeliminować błedy
    pozdrawiam


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • REKLAMA
  • Pomocny post
    #2 6922923
    MatrixCat
    Poziom 11  
    Niebardzo rozumiem o co dokładnie tu chodzi ale:

    1. Każde wystąpienie

    powinno być

    żeby nie były dodawane znaki nowej linii.

    2. Żeby modulo 10 się obliczało poprawnie, to zamiast
    Dim Volt_d As Byte

    musi być
    Dim Volt_d As Word

    To jest związane z tym, że BASCOM nie potrafi rzutować typów z większego (Word) na mniejszy (Byte). W sumie to samo dotyczy wszystkich zmiennych "zarażonych" wynikiem z ADC, który musi być 16-bitowy.

    3. Te pętle
    For Licznik = 0 To Calosc

    muszą być
    For Licznik = 1 To Calosc

    To właśnie to Locate n,0 daje nieporządane efekty na pozycjach 1,16 i 2,16

    4. Pętlę
    For Spacja = Licznik To 16 'Reszte; wype?niamy spacjami
    Locate 1 , Spacja
    Lcd " ";
    Next Spacja

    da się zredukować do
    Spacja = 16 - Licznik
    Lcd Spc(spacja);


    5. Jeśli Linijka2-4 tak samo jak Linijka1, to po co masz cztery Gosub-y zamiasty jednego? Ja bym to przepisał tak:
    
    $sim
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Lcd = 16 * 4
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
    Cursor Off
    
    Deflcdchar 1 , 32 , 32 , 32 , 32 , 16 , 16 , 16 , 32
    Deflcdchar 2 , 32 , 32 , 32 , 32 , 20 , 20 , 20 , 32
    Deflcdchar 3 , 32 , 32 , 32 , 32 , 21 , 21 , 21 , 32
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
    
    Start Adc
    Dim W As Word
    Dim Pozycja As Word
    Dim Calosc As Word
    Dim Ulamek As Word
    Dim Pasek As String * 17
    Dim Dlugosc As Byte
    Dim Kanal As Byte
    Cls
    
    Const Debugging = 0                                         'flage mozna ustawic na 1 do symulacji
    
    Kanal = 0
    Do
       W = Getadc(kanal)
       #if Debugging
          W = Rnd(1024)                                         'max 1024
       #endif
       Incr Kanal
       Gosub Wyswietl_linijke
       Waitms 25
       If Kanal > 3 Then Kanal = 0
    Loop
    End
    
    Wyswietl_linijke:
       Locate Kanal , 1                                         'dlatego przed wywolaniem robimy Incr Kanal
       Pozycja = W / 22                                         ' 22 = 1024 max ADC / ( 16 znakow w szerz * 3 ulamki)
       Calosc = Pozycja / 3                                     ' dlaczego 3 a nie 4?  Czyzby blad "zerowy"?
       Ulamek = Pozycja Mod 3
       #if Debugging
          Print "P: " ; Pozycja ; " C: " ; Calosc ; " U: " ; Ulamek
       #endif
       Pasek = ""
       If Calosc > 0 Then
          Pasek = String(calosc , 3)
       End If
       If Ulamek > 0 Then
          Pasek = Pasek + Chr(ulamek)
       End If
       Dlugosc = Len(pasek)
       If Dlugosc < 16 Then
          Dlugosc = 16 - Dlugosc
          Pasek = Pasek + Space(dlugosc)
       End If
       Lcd Pasek;
       #if Debugging
          Print "[" ; Pasek ; "]"
       #endif
    Return
    
  • #3 6923399
    lok56
    Poziom 12  
    Witam!
    dzieki MatrixCat za poprawienie kodu . juz wyjaśniam o co tu chodzi,
    mam do wykonania wsaznik temperatury na pionowym buforze CO
    (1000l obj. 2.2m wys) .
    w poprzedniej wersji był zrobiony na 3LED-ach na kazdy kanał.
    1 led>30 oC ; 2 led>55 oC ;3 led> 80 oC ,czujniki to LM 35.
    Wskazniki pełniły rolę orientacyjną lecz po pewnym czasie stwierdziłem ze linijka na lcd 4x20 moze byc bardziej wiarygodna.
    LM35 musiały zostac bo są zabudowane na buforze i ich zmiana równała by sie z rozebraniem izolacji bufora co nie bardzo mi sie usmiechało.
    mozna by zastosować DS 18B20 zamiast LM35 w innym wariancie wskaznika ,ale najpierw muszę troche popracowac na Bascomem aby mi rozjasniło trochę
    pozdrawiam

    Dodano po 4 [minuty]:

    zapomniałem że pomiar jest dokonywany na 4 wysokościach bufora
    0.2m ;1m ;1,5m ;2m.
REKLAMA