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:
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ę
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
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:
$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ę
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
