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

Matryca led kłopoty z duszkami.

xamrex 13 Lip 2011 19:49 3342 24
REKLAMA
  • #1 9714542
    xamrex
    Poziom 28  
    Witam,
    Zrobiłem sobie taką matrycę LED
    Schemat:
    Matryca led kłopoty z duszkami.

    Wygląd:
    Matryca led kłopoty z duszkami.

    Mam taki kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i wszystko gra, na przemian jest zapalana 11 oraz 31 dioda w pierwszym rzędzie, reszta diod jest wyłączona.
    (Rzędy włączam stanem niskim)

    Teraz chciałbym zrobić, aby była zapalona 1sza dioda w 1 rzędzie i ostatnia dioda w 8 rzędzie.

    Pisząc coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dostaję duszki (świeci w pierwszym rzędzie dioda pierwsza i ostatnia, oraz w ostatnim rzędzie również świeci dioda pierwsza i ostatnia, w jaki sposób się tego pozbyć?(w jaki sposób zrobić aby tylko w pierwszym rzędzie świeciła się pierwsza dioda, a w ostatnim rzędzie ostatnia dioda)
    Matryca led kłopoty z duszkami.
    Zrobiłem tak jak się to robi w multipleksowaniu wyśw 7seg, a tu mi to nie chce działać ;(
  • REKLAMA
  • #2 9714677
    LoLek85
    Poziom 28  
    Kolego ja miałem podobnie, mam schemat podobny do Twojego, też oparty o 595 i gdy zaświeciłem cały wyświetlacz to właśnie te skrajne diody na końcu świeciły znowu słabiej, nie miałem wtedy czasu się z tym bawić i to zostawiłem.
    Jeżeli nie masz błędu w programie to może, jak to się mówi: "ten typ tak ma" :)
  • #3 9714696
    xamrex
    Poziom 28  
    Chyba mnie nie zrozumiałeś.
    Tu nie chodzi, że coś świeci słabiej/mocniej.

    Ja chciałbym po prostu włączyć przykładowo w pierwszym rzędzie pierwszą diodę i w ostatnim rzędzie ostatnią diodę.
    Ale dostaję 'duszki'

    Jeśli dodam opóźnienie w taki sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To działa dobrze (świeci się tylko pierwsza dioda w pierwszym rzędzie i ostatnia w ostatnim, ale nie sądzę, że to jest dobre rozwiązanie)
  • #4 9714727
    piotrva
    VIP Zasłużony dla elektroda
    Nie mam w tej chwili czasu na analizę kodów, ale czy na pewno robisz tak:
    1. wszystkie wiersze wyłączone
    2. wysyłasz dane na SPI, lecisz po zatrzasku
    3. włączasz określony wiersz
    4. opóźnienie
    5. wszystkie wiersze wyłączasz i wracasz do pkt. 2
    ?
  • REKLAMA
  • #5 9714737
    xamrex
    Poziom 28  
    No, wydaje mi się, że tak, ale oprócz punktu 4.

    Znaczy się, jak dam opóźnienie (2ms) to działa, ale chyba nie powinno się stosować opóźnień?
  • #6 9714762
    LoLek85
    Poziom 28  
    Kolego piotrva nie mieszaj koledze.
    Sterowanie tymi 595 powinno polegać następująco:
    wysyłasz określoną liczbę bajtów do rejestru przesuwnego, potem te dane wyrzucasz na wyjście 595 i zapalasz dany wiersz, potem wysyłasz kolejne bajty czyli to co ma być w 2 wierszu - gasisz wiersz, przerzucasz dane na wyjście i znowu zapalasz tylko 2 wiersz i tak w koło.
    W momencie gdy świeci się jeden wiersz, Ty wysyłasz już kolejne dane do rejestru przesuwnego.
  • #7 9714785
    rrytel
    Poziom 14  
    sprawdz to:
    xamrex napisał:

    Pisząc coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

  • #8 9714802
    LoLek85
    Poziom 28  
    Kolego po przyjrzeniu się kodowi wychodzi z tego że wysyłasz do 595 dane, a potem przełączasz tylko wiersze 1 i 8 więc się nie dziw że Ci 8 wiersz świeci.
    Multipleksujesz wszystkie wiersze tylko że jak chcesz żeby dany wiersz nie świecił musisz wysłać tam same 0.

    Dodano po 2 [minuty]:

    Chodziło mi oczywiście o to co wyżej a nie post kolegi rrytel.
  • #9 9714827
    xamrex
    Poziom 28  
    W między czasie udało mi się wyświetlić zero, jedynkę, dwójkę i trójkę(użyłem przerwań, bo tak czy siak i tak będę musiał ich używać), więcej liczb zrobię później
    taki kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Matryca led kłopoty z duszkami.


    Kod kolegi rrytel oczywiście nie działa :D
  • REKLAMA
  • #10 9714832
    piotrva
    VIP Zasłużony dla elektroda
    No ja powiem tylko, że jak takie LEDY się steruje, to najlepiej na przerwaniach od timera i wtedy opóźnienie robi się samo. A tak to zajmujemy całą moc obliczeniową procesora jakimiś wysyłaniem danych... No chyba że trzeba super jasność podkręcać, ale lepiej zrobić to zwiększając impulsowo prąd na diodach, niż podkręcać odświeżanie. Jeśli jestem w błędzie to proszę o wyjaśnienia.
    ---
    A no chyba, że Koledze chodzi o moment gaszenia - to tak, rzeczywiście żeby zminimalizować czas to powinno być tak:
    1. wszystkie wiersze wyłączone
    2. wysyłasz dane na SPI
    2a wyłączasz wszystko
    2b zatrzask
    3. włączasz określony wiersz
    4. opóźnienie
    5. lecisz do punktu 2
  • #11 9714888
    LoLek85
    Poziom 28  
    Przerwania to obowiązek, bo gdy zrobisz np przesuwanie to już wtedy robi się masakra, bo tekst nie jest płynny, tylko przeskakuje z różną prędkością. A co do odświeżania to minimum musi być około 50 Hz żeby mruganie nie było zauważalne, a około 70-80 Hz żeby oczy nie bolały.

    Trzeba również pamiętać że na 1 cykl odświeżania trzeba liczyć odświeżenie wszystkich wierszy.
    wszystkich wierszy.
  • #12 9714981
    xamrex
    Poziom 28  
    Mam jeszcze jedno pytanko i liczę na pomoc.
    Ustawiając timer w ten sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Mamy przerwanie generowane co 427Hz (czyli 2,4ms)

    I cyfra wyświetla się poprawnie
    Matryca led kłopoty z duszkami.

    Natomiast jeśli ustawimy tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Mamy przerwanie generowane co 5400Hz (czyli 0,18ms)

    I cyfra już się nie prezentuje tak dobrze:
    Matryca led kłopoty z duszkami.

    Dlaczego tak się dzieje?
  • #14 9715006
    xamrex
    Poziom 28  
    Mógłbyś rozwinąć twój post?
    Co powinienem poprawić?
  • #15 9715038
    LoLek85
    Poziom 28  
    Najnormalniej kolego nie wygaszasz wiersza zanim go przełączysz i dlatego występuję smużenie. Nie chce mi się myśleć nad kodem, ale musisz wygasić wiersz i dopiero przełączyć na następny, bo jak nie zrobisz tego to wychodzi tak jak Tobie.
  • #16 9717697
    xamrex
    Poziom 28  
    Aaaaa.
    Już mi działa.
    Zmieniłem kod w przerwaniu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 9719124
    bolek
    Poziom 35  
    żeby to goniło bez duchów musisz zadbać o odpowiednio szybkie załączenie nowego (i wygaszenie starego) segmentu przy wysyłaniu danych. Z 595 można to dobrze zrobić, słowo klucz "G" "RCK"
  • #18 9719479
    xamrex
    Poziom 28  
    ja mam schemat, że zamiast G i RCK jest to nazwane "output Enable" i Latch Clock.

    Z możliwości zatrzasku oczywiście korzystam
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a "G" mam na stałe do masy, no bo po co miałoby to być ustawiane w inny stan niż w stan odblokowania wejść Qa-Qh
  • #19 9719512
    gaskoin
    Poziom 38  
    xamrex napisał:
    Aaaaa.
    Już mi działa.
    Zmieniłem kod w przerwaniu:


    Przydała by się jakaś kontrola wersji na elektrodzie i podgląd zmian :P
  • #20 9726298
    max10
    Poziom 12  
    Witam

    Czy mógłbym prosić o wyjaśnienie w jaki sposób działa funkcja SendSpi ? Co to jest za wartość przekazywana w parametrze ? Jak realizowane jest przesyłanie danych do 74hc595 ?I czy kod jest w miarę optymalny ( chciałbym zbudować matrycę na atmega8 )?

    Próbuję uruchomić własną matrycę led 11x10 ale ciągle napotykam problemy których nie potrafię rozwiązać.
  • #21 9727163
    xamrex
    Poziom 28  
    max10 napisał:
    Witam

    Czy mógłbym prosić o wyjaśnienie w jaki sposób działa funkcja SendSpi ? Co to jest za wartość przekazywana w parametrze ? Jak realizowane jest przesyłanie danych do 74hc595 ?I czy kod jest w miarę optymalny ( chciałbym zbudować matrycę na atmega8 )?

    Próbuję uruchomić własną matrycę led 11x10 ale ciągle napotykam problemy których nie potrafię rozwiązać.


    Funkcja mogłbay wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ale że ja mam 4 układy 595, to muszę przesłać 4x8bitów stąd te przesunięcia bitowe w mojej funkcji.
    Jak działa?(najlepiej zobaczyć co oznaczają rejestry SPIF i SPSR)
    W skrócie czeka na flagę zakończenia wysyłania bajtu.
    Jeśli tak się stanie to zatrzaskuje rejestr
  • #23 9727172
    max10
    Poziom 12  
    Jesteś drugą osobą która poleca mi tą książkę i chyba się na nią skuszę. Dzięki wszystkim za pomoc.
  • REKLAMA
  • #25 9727457
    xamrex
    Poziom 28  
    A ja mam 2 książki i dla Ciebie zdecydowanie polecam książkę p.Mirka, jest wg.mnie dużo, dużo łatwiejsza.
    Więc na początek książka od Mirka, a potem od pana Tomasza :)
    Robi się offtopic więc temat zamykam :)
REKLAMA