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

Bascom ATMEGA8 "duchy" na wyświetlaczu LED

rj1307 09 Mar 2010 17:58 2057 3
REKLAMA
  • #1 7806064
    rj1307
    Poziom 15  
    Witam!

    Mam problem z wyświetlaniem liczb na 5 wyświetlaczach LED.
    Docelowo ma to być wyświetlacz sterowany poprzez RS232 i wyświetlający liczby z zakresu -999 do +29999. Na razie jednak zatrzymałem się na etapie samego wyświetlania.
    Problem polega na tym, że co jakiś czas pojawiają się "śmieci" na wygaszonych segmentach , czasami także zapalona cyfra potrafi na chwilę przygasnąć. Zauważyłem, że duży wpływ na to ma wartość opóźnienia w pętli głównej programu - czym mniejsze tym gorzej. Gdzie popełniam błąd?
    Przypisanie zmiennym A-E konkretnych wartości, bez rozbierania liczby na poszczególne cyfry powoduje prawidłowe wyświetlanie.
    Atmega8, kwarc zewnętrzny 8MHz, sterowanie katodami przez ULN2803, sterowanie anodami przez pary tranzystorów BC847/BD140
    Kod programu:

    
    $regfile = "m8def.dat"
    $crystal = 800000
    
    'Portc.0 = segment a
    'Portc.1 = segment b
    'Portc.2 = segment c
    'Portc.3 = segment d
    'Portc.4 = segment e
    'Portc.5 = segment f
    'Portb.4 = segment g
    'Portd.6 = anoda wyświetlacz 1
    'Portd.7 = anoda wyświetlacz 2
    'Portb.0 = anoda wyświetlacz 3
    'Portb.1 = anoda wyświetlacz 4
    'Portb.2 = anoda wyświetlacz 5
    
    Config Portc = Output
    Config Portb = &B00101000
    Config Timer0 = Timer , Prescale = 256
    
    
    Declare Sub Pobr_znaku(cyfra As Integer)
    
    On Timer0 Mult_wysw
    
    Dim A As Integer , B As Integer , C As Integer , D As Integer , E As Integer
    Dim Nr_wysw As Byte
    Dim Wart As Integer
    
    W1 Alias Portd.6
    W2 Alias Portd.7
    W3 Alias Portb.0
    W4 Alias Portb.1
    W5 Alias Portb.2
    G Alias Portb.4
    
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 90
    
    Wart = 23145                                                'tymczasowo do testów
    
    Do
    '---rozbicie liczby na poszczególne cyfry------
    A = Wart \ 10000
    B = Wart Mod 10000
    B = B \ 1000
    C = Wart Mod 1000
    C = C \ 100
    D = Wart Mod 100
    D = D \ 10
    E = Wart Mod 10
    
    '---wygaszanie niepotrzbnych zer--------------
    If A = 0 Then
       A = 10
       If B = 0 Then
          B = 10
          If C = 0 Then
             C = 10
             If D = 0 Then
                 D = 10
                If E = 0 Then
                    E = 10
                End If
             End If
          End If
      End If
    End If
    
    Wait 1
    Incr Wart                                                   'tymczasowo do testów
    Loop
    End
    
    
    
    Sub Pobr_znaku(cyfra As Integer)
    If Cyfra < 10 Then
       If Cyfra = 0 Or Cyfra = 1 Or Cyfra = 7 Then              'zapalanie i gaszenie segmentu g
          Reset G
       Else
          Set G
       End If
    Portc = Lookup(cyfra , Kody7seg)
    Else
       Portc = Portc And &B01000000                             'wygaszenie segmentów a,b,c,d,e,f
       Reset G                                                  'wygaszenie segmentu g
    End If
    End Sub
    
    '---wyświetlanie------------------------
    Mult_wysw:
    Load Timer0 , 90
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    Reset W5
    
    Select Case Nr_wysw
    Case 0:
    Call Pobr_znaku(a)
    Set W1
    
    Case 1:
    Call Pobr_znaku(b)
    Set W2
    
    Case 2:
    Call Pobr_znaku(c)
    Set W3
    
    Case 3:
    Call Pobr_znaku(d)
    Set W4
    
    Case 4:
    Call Pobr_znaku(e)
    Set W5
    
    End Select
    Incr Nr_wysw
    If Nr_wysw = 5 Then
       Nr_wysw = 0
    End If
    Return
    
    '---kody cyfr---------------------------
    Kody7seg:
    Data &B01111111 , &B01000110 , &B01011011 , &B01001111 , &B01100110
    Data &B01101101 , &B01111101 , &B01000111 , &B01111111 , &B01101111
  • REKLAMA
  • Pomocny post
    #2 7806996
    sp3ots
    Poziom 38  
    Witam !
    Zacznij od tego:
    $crystal = 800000 --- jedno zero za mało.
    następna poprawka:
    Config Portb = &B00101000
    0 jako wejście
    1 jako wyjście

    porty B0. B1, B2 masz 0 a powinny być 1

    Brak konfiguracji Portu D

    Pozdrawiam. Stefan
  • REKLAMA
  • #3 7807438
    rj1307
    Poziom 15  
    Załamałem się tym zerem w kwarcu, to było to. Port D miałem ustawiony, B poprawiłem. Wyświetlacz działa jak należy.
    Mam jeszcze jedno pytanie, dotyczące instrukcji opóźnienia Wait w pętli głównej. Dla czego jest ona potrzebna i dla czego wpisując w jej miejsce Waitms z dowolną wartością wyświetla mi "000 0"?
  • #4 7807533
    sp3ots
    Poziom 38  
    Nie mam zielonego pojęcia dlaczego tak się dzieje.
    Ja ten program sprawdziłem z wyświetlaczem LED 5 x 7seg bez użycia tranzystorów i UL2803, poszczególne segmenty steruję tylko przez rezystory 1kom. Kod programu troche zmieniłem.
    Pozdrawiam. Stefan
REKLAMA