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] Multipleksacja wyświetlacza LED

mkpl 15 Paź 2010 20:22 3438 16
REKLAMA
  • #1 8623983
    mkpl
    Poziom 37  
    Witam
    Mam problem z przypisaniem danej wartości do danego wyświetlacza.
    Konkretnie Wyświetlacz 1 wartość 1, wyświetlacz 2 wart 2
    Sam układ znaków podłączenie wyświetlacza itp jest ok.
    Jedyne co mi się udało to albo wyświetla mi na danym wyświetlaczu 0 a na reszcie 888 albo zgaszę jedną cyfrę a w reszcie same 0.

    Jak poprawnie wpisać wartość do konkretnego wyświetlacza? Jestem bardzo początkujący i po 4 godzinach pass
    Naskrobałem coś takiego:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portd = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    
    Config Timer0 = Timer , Prescale = 256
    
    Declare Sub Pobr_znaku(cyfra As Byte)
    
    On Timer0 Mult_wysw
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    'Dim X As Byte
    
    'Dim Wart As Byte
    Dim Nr_wysw As Byte
    
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    
    Wait 2
    Set W1
    Set W2
    Set W3
    Set W4
    Wait 2
    
    Enable Interrupts
    
    Enable Timer0
    Load Timer0 , 125
    
    
    
    Do
    
    
    
    
    Loop
    
    
    
    
    
    End                                                         'Koniec pogramu
    
    '------------------------Obłsuga LED----------------------------------------
    Sub Pobr_znaku(cyfra As Byte)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub
    
    
    Mult_wysw:
    
    Load Timer0 , 150
    Set W1
    Set W2
    Set W3
    Set W4
    
    
    Select Case Nr_wysw
    
    
    Case 0:
    Call Pobr_znaku(a)
    Reset W1
    
    
    Case 1:
    Call Pobr_znaku(b)
    Reset W2
    
    
    Case 2:
    Call Pobr_znaku(c)
    Reset W3
    
    
    Case 3:
    Call Pobr_znaku(d)
    Reset W4
    
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    '--------------------------Kody Znaków-----------------------------------
    Kody7seg:
    
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00101001,
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
    ' 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 '
    
  • REKLAMA
  • #2 8624228
    Jaca
    Poziom 31  
    A gdzie przypisania zmiennych A, B, C, D z kodem cyfry danej wartości ?

    ps. Całą tą procedurę wyświetlania można zrobić bardziej przejrzyście...
  • #3 8624246
    mkpl
    Poziom 37  
    Jak napiszę np C = 9 to na wyświetlaczu 3 cyfra wyświetla 0 nie zależnie jaką wartość do zmiennej przypiszę. Próbowałem inaczej ale też nie wychodziło. Jak możesz to napisz jak takie przypisanie powinno wyglądać.
    Jestem żywcem wyrwany z PC'towego C++ i mi sie to chrzani
  • Pomocny post
    #4 8624332
    Jaca
    Poziom 31  
    W takich sytuacjach najlepiej zmniejszyć częstotliwość multipleksacji abyś mógł zaobserwować przełączanie wyświetlaczy i sprawdzić poprawność wyświetlania.

    
    Dim Display_buffer(4) As Byte
    [...]
    Display_buffer(1) = 2
    Display_buffer(2) = 4
    Display_buffer(3) = 6
    Display_buffer(4) = 8
    Do
       [...]
    Loop
    End
    [...]
    Mult_wysw:
       Load Timer0 , 150
       Portb = Portb or &B0000_1111
       Portd = Lookup(display_buffer(nr_wysw + 1) , Kody7seg)
       Portb.nr_wysw = 0
       Incr Nr_wysw
       Nr_wysw = Nr_wysw Mod 4
    Return
    
  • #5 8625030
    mkpl
    Poziom 37  
    Wielkie dzięki za pomoc ;D

    Wreszcie odpaliłem. Miałem błąd bo wieszał mi się na loopie

    Mam natomiast inny problem

    Pomija 1 cyfrę i powiela na pozostałych 3 wartość Display_buffer(1) = 7
    
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    Config Portd = Output
    
    
    'Config Timer0 = Timer , Prescale = 256
    
    
    Dim Nr_wysw As Byte
    Dim Display_buffer(4) As Byte
    
    
    Display_buffer(1) = 7
    Display_buffer(2) = 4
    Display_buffer(3) = 6
    Display_buffer(4) = 8
    
    
    
    
    Mult_wysw:
       Load Timer0 , 150
       Portb = Portb Or &B11111111
       Portd = Lookup(display_buffer(nr_wysw + 1) , Kody7seg)
       Portb.nr_wysw = 0
    
     Incr Nr_wysw
       Nr_wysw = Nr_wysw Mod 4
    
    Return
    
    End
    Kody7seg:
    
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00101001,
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
    ' 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 '
    


    Co ciekawe jak podmienię
    
    Incr Nr_wysw 
       Nr_wysw = Nr_wysw Mod 4


    na moje:
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If


    To oszczędzam 1% pamięci :D
  • REKLAMA
  • #6 8625526
    Jaca
    Poziom 31  
    To musi działać:

    $regfile = "m8def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    
    Ddrb = &B1111_1111
    Portb = &B1111_1111
    Ddrd = &B1111_1111
    Portd = &B0000_0000
    
    Dim Nr_wysw As Byte
    Dim Display_buffer(4) As Byte
    
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Mult_wysw
    Enable Timer0
    Enable Interrupts
    Load Timer0 , 150
    Start Timer0
    
    Display_buffer(1) = 7
    Display_buffer(2) = 4
    Display_buffer(3) = 6
    Display_buffer(4) = 8
    
    Do
       Waitms 100
    Loop
    End
    
    Mult_wysw:
       Load Timer0 , 150
       Portb = Portb Or &B11111111
       Portd = Lookup(display_buffer(nr_wysw + 1) , Kody7seg)
       Portb.nr_wysw = 0
       Incr Nr_wysw
       Nr_wysw = Nr_wysw Mod 4
    Return
    
    Kody7seg:
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00101001
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000
  • REKLAMA
  • #7 8625798
    mkpl
    Poziom 37  
    Hmm no to robi się dziwnie :|
    Skopiowałem kod 1:1 i uzyskałem 8888 a jak wywale END za RETURNa to wyświetla
    777 z pominięciem 1 wyświetlacza
  • #9 8626054
    mkpl
    Poziom 37  
    Wersja to 1.11.8.3. Wklepałem ten nowy kod i dokładnie to samo.
    Dziwne to bo kod jest dla mnie przejrzysty i całkowicie zrozumiały. Kombinuję jak mogę i uzyskuje to co uzyskiwałem. Podmiana procesora nic nie daje.

    Same multipleksowanie działa. Zwolniłem odpowiednio i widać jak się wyświetlacze przełączają. Wygląda na to że nie pobiera danych z tablicy znaków i cały port d ma stan niski. Procesor podmieniłem i jest dokładnie to samo.

    Edit..
    Podmieniłem w tablicy znaków tablice cyfry 8 wpisałem tam jakieś pierdoły (tak aby wyróżnić od reszty. I się okazało ze zmodyfikowany znak pojawił się na 3 wyświetlaczu a pozostałe nadal wyświetlają same 8
  • #10 8626181
    Jaca
    Poziom 31  
    To teraz 2 testy:

    1. Przypisz dane z tablicy najpierw do zmiennej tymczasowej a potem wyślij zmienną tymczasową na portd
    2. Poprzez Select Case Nr_Wysw na sztywno wyślij na port odpowiednią wartość dla konkretnego wyświetlacza (bez odczytu z tablicy)
  • #11 8626237
    mkpl
    Poziom 37  
    Nic to nie dało :| Jedyne efekty jakie uzyskałem to wklepanie mu na samym początku programu wartości na porcie i wtedy ustawia taki znak na wszystkich portach. Przemiatanie działa ale nie wpisuje wartości na port z tablicy. Tak jakby na samym początku programu na sztywno ustawił stany portów do których są podłączone katody wyświetlacza i już ich nie zmienia
  • REKLAMA
  • #13 8626360
    mkpl
    Poziom 37  
    Nic nie daje
    Wklepałem w case 0 na sztywno wartość liczby 6 a resztę zostawiłem jak jest i efekt taki że 1 liczba zamiast 6 pokazuje 0 a reszta same 8 a jeśli wpiszę do wszystkich to też same 8888

    
    Select Case Nr_wysw
    
    
    Case 0:
    Portd = &B00100100
    Reset W1
    
    
    Case 1:
    Portd = &B11010101
    Reset W2
    
    
    Case 2:
    Portd = &B00000000
    Reset W3
    
    
    Case 3:
    Portd = &B10010010
    Reset W4
    
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    [\code]
  • #14 8626395
    Jaca
    Poziom 31  
    1. Ten kod z Case użyj zamiast Lookup()
    2. Jakie masz rezystory w bazach PNP i segmentach ?
    3. Sprawdź na nowszej wersji BASCOM'a
    4. Format &B0000_0000 był dostępny od którejś wersji BASCOM'a. Dla pewności w DDRx i Portx użyj składni &B00000000 (bez "_")

    Dam Ci skompilowany kod, wgraj go do procka i sprawdź działanie:
  • #15 8626518
    mkpl
    Poziom 37  
    Twój kod też generuje same 8888. Płytkę mam gotową po jakimś tunerze satelitarnym oporniki w bazach jak i w katodach 100 ohm

    Edit...

    Czeski błąd założyłem że na fabrycznej płytce są tranzstory pnp w anodach. Okazało się że zastosowali NPN :|

    I w moim kodzie coś sensownie zaczęło wyświetlać.
    W tym Twoim wpisałem wait 1 zaraz po procedurze wyświetlania ale przed zliczaniem numeru wyświetlacza i efekt taki:

    Pojawia się 1 wyswietlacz następnie 2 wyświetlacz następnie 3 wyświetlacz i 4 wyświetlacz ale na wszystkich jest ta sama wartość która się zmienia zgodnie z tymi wartościami które podałem w programie głównym
  • #16 8626674
    Jaca
    Poziom 31  
    Jeśli kod działa na symulatorze i np na mojej płytce to szukaj winy w połączeniach (zwarcia, przeploty na taśmie, prawidłowość parowania połączenie-pin procesora, itp). Za dużo w tym wszystkim "czarów" :)
  • #17 8626884
    mkpl
    Poziom 37  
    Ok wszystko śmiga jak należy :)
    Temat do zamknięcia
REKLAMA