Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega16/32][bascom] sterowanie matrycą LED

MaRo88PL 09 Lip 2010 23:54 3302 1
  • #1 09 Lip 2010 23:54
    MaRo88PL
    Poziom 10  

    Witam.

    Od jakiegoś czasu studiowałem w sieci różne materiały na temat matryc LED i ich sterowania.

    Mój projekt teoretycznie powinien działać, jednak jest bardzo toporny w oprogramowaniu, a przy chęci wyświetlenia dłuższego tekstu po prostu (z powodu archaicznego programu) zaczyna brakować w uC pamięci Flash.

    Przechodząc do rzeczy.

    W Eaglu zaprojektowałem matrycę LED 5 rzędów - 24 kolumny sterowanej za pomocą Atmegi16 (ewentualnie 32).

    Kolumny załączane są kolejno przy pomocy 3 szeregowo połączonych rejestrów przesuwnych 74HC595. Do kolumn podłączone są Anody diod.
    Port B.0 atmegi ustawiony jest na stałe w stanie wysokim (1) czyli takim w jakim mają być kolejne załączane kolumny.
    Porty B.1 i B.2 otrzymują równocześnie stany wysokie (1) bądź niskie (0) w celu przechodzenia rejestrów na kolejne kolumny.

    Porty A.0, A.1, A.2, A.3 i A.4 (które odpowiadają za załączanie odpowiednich rzędów - do nich podłączone są Katody diod) na samym początku mają stan wysoki (1).

    Zasada działania mojego obecnego programu polega na tym, że jeden cykl (w którym każda kolumna załączana na 1ms) powtarzam 10 razy, dzięki czemu na matrycy pojawia się część napisu, po czym ręcznie zmieniam wartości portów A dla załączonych poszczególnych kolumn i powtarzam wszystko do czasu do póki napis nie przewinie się na matrycy.

    Niestety tak jak wspomniałem na początku metoda ta jest bardzo pracochłonna i przy dłuższych napisach zaczyna brakować pamięci w uC.

    Próbowałem na różne sposoby (na ile pozwala mi moja umiejętność programowania) ulepszyć program, lecz nie przynosi do jakiś oszałamiających rezultatów.

    Poniżej zamieszczam mój obecny kod:

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 1000000

    Config Porta = Output
    Config Portb = Output

    Porta = &B11111111
    Portb = &B00000000

    Const Kropka = &B11101111

    Const 2kropek = &B11110101

    Const Nic = &B11111111

    Const A1 = &B11100001
    Const A2 = &B11110110
    Const A3 = A1

    Const B1 = &B11100000
    Const B2 = &B11101010
    Const B3 = &B11110001

    Const C1 = B3
    Const C2 = &B11101110
    Const C3 = C2

    Const D1 = B1
    Const D2 = C2
    Const D3 = C1

    Const E1 = B1
    Const E2 = B2
    Const E3 = C2

    Const F1 = B1
    Const F2 = &B11111010
    Const F3 = &B11111110

    Const G1 = B1
    Const G2 = C2
    Const G3 = B2
    Const G4 = &B11100010

    Const H1 = B1
    Const H2 = &B11111011
    Const H3 = B1

    Const I = B1

    Const J1 = C2
    Const J2 = C2
    Const J3 = &B11110000

    Const K1 = B1
    Const K2 = H2
    Const K3 = &B11110101
    Const K4 = C2

    Const L1 = B1
    Const L2 = Kropka
    Const L3 = L2

    Const M1 = B1
    Const M2 = &B11111101




    Const M3 = K2
    Const M4 = M2
    Const M5 = B1

    Const N1 = B1
    Const N2 = M2
    Const N3 = K2
    Const N4 = &B11110111
    Const N5 = B1

    Const O1 = B3
    Const O2 = C2
    Const O3 = B3

    Const P1 = B1
    Const P2 = F2
    Const P3 = &B11111000

    Const R1 = B1
    Const R2 = &B11110010
    Const R3 = &B11101000

    Const S1 = &B11101001
    Const S2 = B2
    Const S3 = &B11110010

    Const T1 = &B11111110
    Const T2 = T1
    Const T3 = B1
    Const T4 = T1
    Const T5 = T1

    Const U1 = J3
    Const U2 = Kropka
    Const U3 = J3

    Const W1 = B1
    Const W2 = N4
    Const W3 = H2
    Const W4 = N4
    Const W5 = B1

    Const Y1 = T1
    Const Y2 = M2
    Const Y3 = &B11100011
    Const Y4 = M2
    Const Y5 = T1

    Const Z1 = &B11100110
    Const Z2 = B2
    Const Z3 = &B11101100

    Const Wyk1 = &B11111100
    Const Wyk2 = &B11101000
    Const Wyk3 = Wyk1

    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte

    Do

    Z = 23

    For X = 0 To 9

       For Y = 0 To Z

          Portb = &B00000001
          Portb = &B00000111

          Porta = Nic

          Waitms 1

       Next Y

    Next X

    Z = Z - 1

    For X = 0 To 9

       For Y = 0 To Z

          Portb = &B00000001
          Portb = &B00000111

          Waitms 1

       Next Y

       Portb = &B0000001
       Portb = &B0000111

       Porta = M1

       Waitms 1

    Next X

    Z = Z - 1

    For X = 0 To 9

       For Y = 0 To Z

          Portb = &B0000001
          Portb = &B0000111

          Porta = Nic

          Waitms 1

       Next Y

       Portb = &B00000001
       Portb = &B00000111

       Porta = M1

       Waitms 1

       Portb = &B00000001
       Portb = &B00000111

       Porta = M2

       Waitms 1

    Next X

    Loop
    End


    W woli wyjaśnienia:
    - Kolejne wartości stałych (Const) odpowiadają załączeniu kolejnych wierszy w kolumnie aby wyświetlić część znaku.
    - w I pętli X program 10 razy przelatuje przez wszystkie 24 kolumny pozostawiając je wygaszone
    - w II pętli X program 10 razy wyświetla w pierwszej od prawej strony kolumnie początek znaku M, po czym w pozostałych 23 kolumnach pozostawia wygaszone diody
    - w III pętli X program 10 razy wyświetla w pierwszej od prawej strony kolumnie 2 część znaku M, w drugiej kolumnie od prawej strony pierwszą część tego znaku, a w pozostałych 22 kolumnach pozostawia diody wygaszone.

    Cały program zawierał oczywiście więcej znaków, ale jest to analogia do tego co zamieściłem więc żeby oszczędzić miejsce w poście pominąłem resztę.

    Tak jak wspominałem poszukuję sposobu, aby program uprościć i zmniejszyć jego wielkość.

    Pozdrawiam.

    Dodano po 3 [godziny] 42 [minuty]:

    Dorzucam schemat na jakim się opierałem projektując matrycę

    [atmega16/32][bascom] sterowanie matrycą LED

    Różnice pomiędzy tym schematem, a moim układem to:
    - zamiast 259 i ULN wiersze steruje prosto z portów (A) Atmegi.
    - mam 5 wierszy
    - mam 3 595
    - użyłem Atmegi16
    - 595 sterowane z portów B, a nie D

    0 1
  • #2 10 Lip 2010 14:44
    MaRo88PL
    Poziom 10  

    Problem rozwiązany - można zamknąć temat.

    0