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

[Atmega8][C] Problem z wyświetlaczem 7 SEG

rozumek 06 Wrz 2008 12:24 2258 7
REKLAMA
  • #1 5510709
    rozumek
    Poziom 10  
    Witam

    Jestem nowicjuszem w programowaniu mikrokontrolerów (wogole) i natknałem sie na problem ktorego nie wiem jak rozwiazac. Jest to własciwie problem czysto ideowy. Bo nie wiem poprostu jak sie wziasc za wyswietlacz 7 SEG.

    Dysponuje zestawem uruchomieniowym Atmega8 AVR zl2avr.
    Problem jest następujacy:

    Chce napisac podprogram obdługi wyświetlacza 7 SEG.

    Napisałem badzo prosty programik wyswietlajacy cyfry o 0 do 9 na jednym wyswietlaczu. Pojawil sie natomiast problem obsługi wiekszej ilosci wyswietlaczy. W moim układzie mam 8 pinów obsługującym kazda "pałke" wyswietlacza + kropke, oraz 4 piny sterujace odpowiednimi wyswietlaczami. I nie wiem w jaki sposób sterowac własnienimi, zeby móc wyswietlac liczby w postaci 4 cyfrowej.

    Udało mi sie napisac osobno 2 podprogramy obsługujace jednosci i czesci dziesietne i teoretycznie program działa. Ale jesli chodzi o kweste wyswietlania, to problem jest taki ze jedna cyfra swieci sie prawie nieprzerwanie, a druga miga ledwo widocznie, podejrzewam ze jest to jakis problem z czasem.

    Miałbym taka prosbe zeby ktos mi wytłumaczyl ide działania takiego wyswietlacza (o ile sie nie myle nazywa to tryb multipleksowalny czy jakos tak) kwestia napisania programu to nie problem dla mnie, ale chodzi jaki jest algorytm działania.

    Bardzo uprzejmie prosze o pomoc i wyrozumiałosc
  • REKLAMA
  • #2 5510740
    Lysoleq
    Poziom 17  
    W każdym z wyświetlaczy masz jedną nogę wspólną anodę, bądź katodę. Załużmy że jest to anoda. Jeżeli masz wyświetlacz 4 cyfrowy to takich anod masz również 4. Podłączasz je przez tranzystor do + zasilania, bazę do mikrokontrolera, a pozostałe wyprowadzenia do mikrokontrolera. Jeżeli wyprowadzenie danego segmentu podłączone do mikrokontrolera będzie mialo stan wysoki to segment będzie wygaszony.

    Początek:
    SEKCJA 1 -> O_TRANZYSTOR1 -> Z_TRANZYSTOR1 ->
    SEKCJA 2 -> O_TRANZYSTOR2 -> Z_TRANZYSTOR2 ->
    SEKCJA 3 -> O_TRANZYSTOR3 -> Z_TRANZYSTOR3 ->
    SEKCJA 4 -> O_TRANZYSTOR4 -> Z_TRANZYSTOR4 ->
    WRACASZ NA POCZĄTEK

    SEKCJA X - ustalasz stan pinów mikrokontrolera w zazleżności od tego co ma się pojawić

    O_TRANZYSTOR X - otwierasz tranzystor sekcji X, tak aby zapalić sekcję

    Z_TRANZYSTOR X - zamykasz tranzystor sekcji X, tak aby zgasić sekcją

    Jeżeli robisz to szybko, ludzkie oko nie zauważy migania. Polecam ostatni numer Elektroniki Praktycznej. Jest tam schemat wyświetlacza sterowany interfejsem i2c.
  • REKLAMA
  • #3 5510890
    rozumek
    Poziom 10  
    mam mały problem ze zrozumieniem tego sposobu, w jaki sposób mam sterowac tymi tranzystorami?

    Mógłbym prosic o dokładny numer ten elektoniki praktycznej?
  • REKLAMA
  • #5 5511339
    Lysoleq
    Poziom 17  
    Elektronika Praktyczna numer 9/2008 :)
    "Modułowy wyświetlacz LED sterowany magistralą I2C"
  • REKLAMA
  • #6 5513256
    gregoorr
    Poziom 17  
    Multipleksowanie jest dość proste. Musisz tylko zrozumieć jak to działa. Przy dwóch to działa mniej więcej tak: gasisz wszystko, zapalasz pierwszy, gasisz wszystko, zapalasz drugi, itd.
    Podobnie przy większej liczbie wyświetlaczy.
    Np: tak
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portd = Output
    Config Pinb.0 = Output
    Config Pinb.1 = 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 Wart As Byte
    Dim Nr_wysw As Byte
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    
    
    Enable Interrupts
    
    Enable Timer0
    Load Timer0 , 125
    C = 0
    
    Do
    
    Wart = C
    Wart = Makebcd(wart)
    B = Wart And &B00001111
    Shift Wart , Right , 4
    A = Wart
    Wait 1
    C = C + 1
    If C > 99 Then
    C = 0
    End If
    
    Loop
    
    End                                                         'end program
    
    
    Sub Pobr_znaku(cyfra As Byte)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub
    
    
    Mult_wysw:
    
    Load Timer0 , 125
    Set W1
    Set W2
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Reset W1
    
    
    Case 1:
    Call Pobr_znaku(b)
    Reset W2
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 2 Then
    Nr_wysw = 0
    End If
    Return
    
    
    Kody7seg:
    
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
    
    
    
  • #7 5514453
    marek-c
    Poziom 19  
    I należy dodać że to 'gaszenie i zapalanie' po kolei każdej z cyfr jest sztuczką .. po prostu oko ludzkie nie zauważa 'migania' powyżej 16Hz.
    Osiem linii na każdy segment (7 + kropka) plus 4 linie na każdy wyświetlacz to mniej niż zapalać każdy segment ('pałkę') wyświetlacza osobno (4x8 = 32!)

    Marek
  • #8 5547188
    rozumek
    Poziom 10  
    Wielkie dzięki, za wkretaka:) wszystko mi działa.
REKLAMA