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.

BASCOM - LED Matrix - niepoprawne wyświetlanie, jak wysterować?

splawik00 26 Lut 2014 13:56 3573 26
  • #1 26 Lut 2014 13:56
    splawik00
    Poziom 23  

    Witam.
    Mam zrobioną matrycę LED z sześciu wyświetlaczy 8x8.
    Sterowanie poprzez PORTA (ULN2803) procesora dla kolumn i HC595 dla wierszy.
    Męczę się już od jakiegoś czasu, ale nie mogę dać rady z jedną rzeczą.
    Podczas przewijania tekstu widzę go rozmytego, tak jakby byłu dwa napisy na sobie, ale przesuniętę o jeden piksel w bok (pogdubione litery). Ogólonie ciężko na to spojrzeć, bo oczy się męczą. Podczas statycznego napisu nie ma widocznego przemiatania. Częstotliwość jaką ustawiłem to:
    11059200 (kwarc) / 64 (preskaler timera) = 172800
    172800 / 15 (255-240 przepełnienie timera) = 11520
    11520 / 48 kolumn = 240 Hz
    Chyba, że coś pomyliłem :|
    Na razie chcę tylko poprawnie wysterować przesuwanie. Później dopiero zajmę się innymi rzeczami, np. tym że litera i zajmuje 5 kolumn itp.
    Chodzi mi o te rozmyte litery. Co jest przyczyną?
    Zamieszczam filmik, który niestety nie oddaje w 100% tego rozmycia znaków.
    Schemat różni się tylko tym, że ja mam 6 matryc 8x8, co daje 48 kolumn.

    BASCOM - LED Matrix - niepoprawne wyświetlanie, jak wysterować?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    0 26
  • #2 26 Lut 2014 14:56
    BlueDraco
    Specjalista - Mikrokontrolery

    Przyczyna ta sama, co we wszystkich wyświetlaczach multipleksowanych z "duchami" - nie wyłączasz wszystkich wierszy przed załadowaniem zawartości kolumn lub odwrotnie, w zależności od tego, co kluczujesz, a do czego ładujesz dane. W ten sposób przez chwilę stary wiersz wyświetla się w nowej kolumnie lub na odwrót. Szkolny błąd.

    0
  • #3 26 Lut 2014 18:19
    splawik00
    Poziom 23  

    BlueDraco napisał:
    Przyczyna ta sama, co we wszystkich wyświetlaczach multipleksowanych z "duchami" - nie wyłączasz wszystkich wierszy przed załadowaniem zawartości kolumn lub odwrotnie, w zależności od tego, co kluczujesz, a do czego ładujesz dane. W ten sposób przez chwilę stary wiersz wyświetla się w nowej kolumnie lub na odwrót. Szkolny błąd.


    Wydaje mi się, że kolega nie ma racji.
    Wyświetlanie wygląda tak:
    1. Gaszę PORTA (tablica gaśnie)
    2. Ustawiana jest kolumna (przy wyłączonej tablicy)
    3. Zapalam PORTA (tablica świeci)
    4. Czekam na kolejne przerwanie takie samo jak od 1-3

    Poza tym to nie są duszki :!:
    Duszki wyglądają inaczej.

    Dziwna rzecz jest taka, że jeżeli patrzę nie bezpośrednio na napis, ale na nieruchomy element, np. na obudowę tych wyświetlaczy 8x8 to nie widac żadnych nieprawidłowości. Napis jest taki jak ma być.
    Dopiero jak się spojrzy bezpośrednio na napis (diody) to wtedy oczy świrują i widać napis podwójnie.
    Więc to co innego, niż duszki.

    0
  • #4 27 Lut 2014 08:23
    seba_x
    Poziom 31  

    splawik00 napisał:
    to wtedy oczy świrują i widać napis podwójnie.


    Może musisz zwiększyć odświeżanie tej matrycy ?

    0
  • #6 27 Lut 2014 13:21
    splawik00
    Poziom 23  

    Próbowałem również z preskalerem 8 zamiast 64 dla timera.
    Co teoretycznie da:
    11059200/8/256/48=112Hz
    Zwiększyłem dodatkowo prędkość wpisując 200 do wartości licznika, kiedy wchodzi w przerwanie, tak aby zliczał tylko do 56 (200->256)
    11059200/8/56/48=514Hz
    To chyba wystarczy??
    Ale i tak nic to nie dało.

    piotrva napisał:
    Przy przewijaniu wypada zrobić podwójne buforowanie, bo inaczej te migania mogą być spowodowane zmianą zawartości tablicy w czasie zmiany zawartości (generowania kolejnej klatki)


    Nie wiem, czy dobrze rozumiem. Jeżeli chodzi o tablicę o nazwie "reeks" to do niej tylko na początku programu zostają wpisane dane. Później juz się nie zmieniają.
    No chyba, że chodzi o coś innego?

    0
  • #7 08 Mar 2014 19:16
    Szumlus
    Poziom 17  

    Witam,

    Miałem podobny problem, tylko zamiast ULN miałem tranzystory a zamiast HC miałem SCT2024 (wyświetlacz z diod 5mm, pole wyświetlania 210x1680mm, 8x64 piksele).

    U mnie problem leżał w tym że tranzystory nie zdążyły się wyłączyć zanim wpisałem dane do SCT2024 (SPI z częstotliwością 4 MHz).
    Pomogło wyłączenie tranzystorów plus wyjść scalaków na czas wpisania danych w rejestry szeregowe.

    0
  • #8 08 Mar 2014 19:49
    splawik00
    Poziom 23  

    Nie wiem, czy dobrze rozumiem. :/
    Ja mam dodane tranzystory do układów 74HC595, więc może to one nie wyrabiają?
    Czy ULN2803 też może nie nadążać?
    Bardzo zależy mi na rozwiązaniu problemu, bo utknąłem w miejscu i nie mogę dalej kontynuować prac nad tą matrycą.
    Czyli przy wejściu w przerwanie na początku wyłączam ULN2803. Następnie wpisuję dane do 74HC595, zatrzask i włączam ULN2803. I nic to nie daje.
    Może właśnie te tranzystory BC327 które pracują na każdym wyjściu 74HC595 po jednym coś powodują? W chwili obecnej mam tak, że w tej samej chwili następuje włączenie kolejnego tranzystora, kiedy wyłączenie poprzedniego. Czy powinienem wyłączyć poprzedni tranzystor i poczekać przed włączeniem kolejnego? Jeżeli tak to ile orientacujnie czasu zajmuje takie przeładowanie BC327?

    0
  • #9 09 Mar 2014 17:49
    Szumlus
    Poziom 17  

    Ja wyłączam wszystkie tranzystory na czas wpisania danych.
    Dam koledze kod przerwania w C.

    [code]

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Więcej informacji da koledze oscyloskop ;]
    Trzeba pooglądać trochę przebiegi i wysnuć wnioski. W ciemno kolega nie wiele ustali.

    0
  • #10 09 Mar 2014 22:48
    splawik00
    Poziom 23  

    A mam jeszcze dwa pytania.
    Jak są wyłączane SCT2024? Poprzez wpisanie przez SPI wartości do nich, czy poprzez ustalenie stanu wysokiego na pinie OE/?
    I drugie. Jak kolega przemiata matryce? Z góry na dół, czy z lewej do prawej tak jak ja?

    0
  • #11 10 Mar 2014 11:45
    Szumlus
    Poziom 17  

    Pin OE w stan wysoki i odłącza wyjścia od rejestru szeregowego układu. Pinem OE można nawet regulować jasność świecenia sterując go PWM.

    Wiersze mają zasilanie z tranzystorów a SCT ściągają odpowiednie kolumny do GND.
    Czyli z tego co widzę po schemacie tak jak u kolegi.

    Wpisuje dane do kolumn i włączam tranzystor zasilający wiersz 1.
    W kolejnym przerwaniu wyłączam tranzystor wiersza 1 wpisuje kolejne dane kolumn do SCT i włączam tranzystor zasilający wiersz 2 i tak cyklicznie po wszystkich wierszach i kolumnach.
    Dane wpisuje dla całej długości wiersza.
    W ośmiu wyżej wymienionych cyklach odświeżam cały wyświetlacz.

    Z tego co widzę w programie ma kolega prędkość przesuwania zawartości matrycy w przerwaniu, a co za tym idzie prędkość wykonania przerwania zależy od prędkości przesuwania zawartości matrycy.

    Mogę się mylić nie znam dobrze Bascom'a ;]

    Ale jeśli mam rację to proponuję to przerobić przerwanie, powinno się wykonać jak najszybciej dla całego wyświetlacza.


    Przesuwanie można rozwiązać inaczej. Trzeba stworzyć tablicę pikseli dla zawartości wyświetlacza. Przy starcie programu pobieramy tablicę znaków do wyświetlenia (tekst ;p) konwertujemy ją na pojedyncze piksele i zapełniamy nimi tablicę pikseli.
    W przerwaniu wysyłamy tylko całą zawartość tablicy pikseli na matryce.
    Wszelkiego rodzaju efekty przesuwania migania itp. realizujemy w programie głównym na matrycy pikseli.

    Przy przewijaniu można kolejne znaki doczytywać do tablicy pikseli dynamicznie aby uzyskać efekt zapętlenia wyświetlacza.

    0
  • #12 11 Mar 2014 01:18
    splawik00
    Poziom 23  

    Mogę się mylić, ale wydaje mi się, że prędkość przerwań nie zależy od szybkości przesuwania :|
    Jednej rzeczy nie rozumiem. Pisze kolega o tranzystorach zasilających kolumny.
    Ale czy przypadkiem nie chodzi o wiersze? A kolumny "zasilane" przez SCT do masy.
    Poza tym podciągnięcie OE do zasilania spowoduje stan HiZ na wyjściu SCT, czyli pewnie ma kolega podłączone SCT bez tranzystorów tak jak ja, bo inaczej by się nie wyłączały bez dodatkowych rezystorów podciągających. Gubię się już w tym wszystkim.
    Jest jakaś szansa zobaczyć schemat matrycy kolegi? Sama część sterowania wyświetlaczami by wystarczyła :D

    0
  • #13 11 Mar 2014 18:31
    Szumlus
    Poziom 17  

    Faktycznie ma kolega rację ;] chyba zmęczony byłem, post poprawiony dla potomnych.

    Ledy mam połączone bezpośrednio do SCT bez żadnych "pośredników", mają regulację prądu i sporą obciążalność na pin (zależy od wersji 5-45[mA]). Wartość prądu ustawiamy rezystorem dla całego układu. Datasheet jest jasny więcej tam można poczytać ;]

    Co do schematu mam identyczny jak kolega tylko zamiast HC mam SCT ;] (podłączenie dokładnie takie jak sugeruje dokumentacja) a zamiast ULN mam tranzystory (para NPN - PNP), musiałem uzyskać większą wydajność prądową niż pozwala na to ULN (potrzebowałem około 1,5[A]).

    Jak się kolega uprze to wrzucę ten schemat ;]

    Sprawdziłem jeszcze schemat według którego kolega robił matrycę. OE w HC jest na stałe do GND. Jak koledze się nie zdążą wyłączyć całkowicie tranzystory w ULN to wpychając dane do rejestrów szeregowych diody święcą przez ułamek sekundy zanim się cykl shift'u nie skończy. Do tego dochodzą drobne przepięcia spowodowane pracą impulsową przy przełączaniu wierszy i tak się zbiera powoli wiele czynników od których świeci nam to co akurat nie powinno ;]

    Może przemyśli kolega przejście na SCT zamiast HC są za śmieszne pieniądze do kupienia odpadną rezystory ograniczające prąd przy zasilaniu odpowiednim napięciem (5[V] dwie diody w szereg dla zmniejszenia napięcia i gotowe) i mogę coś więcej z nimi pomóc to też plus xD

    0
  • #14 11 Mar 2014 18:57
    splawik00
    Poziom 23  

    W sumie już rozumiem :D
    A jakich tranzystorów kolega użył?
    Jedna rzecz mnie zastanawia, czy powodem tego zachowania które opisałem, nie jest to, że przemiatam wyświetlacze w poziomie. Kolega z kolei w pionie więc inaczej.
    Ale nie będzie mi łatwo sprawdzić czy zadziała przy przemiataniu w pionie, bo musiałbym przebudować całą matrycę do tego :D
    Wolałbym poziomo, tylko czy to nie to może być przyczyną złego wyświetlania?
    Z drugiej strony zastanawiam się, czy to może odstępy pomiądzy ledami nie są winne.
    Pomiędzy jednym punktem świecącym, a drugim jest odstęp około 2/3 średnicy punktu świecącego (punkt ma 5mm). W wyświetlaczach, które można kupić w sklepach są diody led, a nie gotowe matryce led, w dodatku są upchane jedna przy drugiej. Może to jest przyczyną? Że u mnie są za daleko od siebie?

    Wcześniej kiedy budowałem tę matrycę (ze 2 lata temu :D) to miałem wgrany inny kod. Tam nie używałem timera. Polegało to na tym, że nie przemiatam wyświetlaczem z konkretną częstotliwością, a jedynie raz na jedno przesunięcie piksela. Tzn. kolumny lecą od lewej do prawej tylko raz, po czym w kolejnym przejściu napis jest już przesunięty o jeden piksel, itd. Nie uzyskałem w ten sposób powolnego przesuwania napisu, bo było widoczne migotanie diod, ale przy umiarkowanie szybkim już nie było widać migania. Co najlepsze takie rozwiązanie nie powodowało tego efektu, że napis jest rozmazany, jak teraz.

    Ten kod (fragment) zamieszczam poniżej. Jest to wszystko co wyświetlało napis.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Reszta kodu taka jak w powyższych postach.
    Niech ktoś pomoże, bo już nie mam siły :|
    Ja chcę tylko przesuwać tekst od prawej do lewej, żadnych animacji i innych gadzetów. A pomimo tego nie mogę dać rady. :|

    0
  • #15 11 Mar 2014 19:46
    Szumlus
    Poziom 17  

    Właśnie przemiatanie może być tutaj przyczyną. Przy szybkim odświeżaniu matrycy pojawiają się duszki, jak kolega robił na "piechotę" bez timera to odświeżanie było na tyle wolne że pojedyncze mignięcie diody nie było widoczne. Przy odświeżaniu z timera tych mignięć jest już sporo a ludzkie oko jako świetny filtr uśredniający widzi to jako poświatę.
    Co do oka było gdzieś na necie taki test pojawiał się obrazek kolorowy a po jakimś czasie zmieniał się na czarno-biały. Moment zmiany był zaznaczony. Co ciekawe przez około sekundę jak obrazek zmienił się na czarno-biały człowiek widzi go nadal jako kolorowy ;]. Przypominam że moment utraty kolorów był zaznaczony ;P
    Wyżej wymieniony przykład sprawdziłem na własnej skórze.

    Co do odległości diod to nie wiem jaki może to mieć wpływ nie robiłem niczego na matrycach ;/.

    0
  • #16 11 Mar 2014 20:09
    splawik00
    Poziom 23  

    No właśnie i tu jest pytanie, jak to zrobić, żeby oko nie widziało tej poświaty :D
    Dlatego też pytanie, czy to musi być przemiatane z jakąś konkretną częstotliwością, czy im większa tym lepsza? Teoretycznie wychodzi, że im większa tym nie koniecznie lepiej.
    Ciężki temat z tymi matrycami :|
    Chyba rzeczywiście muszę przerobić całą matrycę z zastosowaniem przy okazji tych SCT zamiast HC595. Jakie tranzystory użyć do zapalania wierszy? Wolę zapytać, niż żeby później się okazało, że nie nadążają się przełączać.

    0
  • #17 12 Mar 2014 00:21
    Szumlus
    Poziom 17  

    Ja mam odświeżanie z częstotliwością około 60 Hz i wystarcza ;]
    Tranzystory są opisane na schemacie załączonym do poprzedniego posta. Przy tak niskiej częstotliwości każdy tranzystor sobie poradzi.

    0
  • #18 24 Sty 2017 14:19
    FastProject
    Poziom 28  

    Pytanie do autora tematu:

    Możesz mi wytłumaczyć po co jest ten fragment:

    Cytat:
    X = Char * 5

    podczas wypełniania tablicy kolumn?

    Dla przykładu litera A ma numer ASCII=65. W takim wypadku X=65*5 da nam indeks znaku=325, nie za bardzo rozumiem po co taka operacja? Przecież po odczycie:
    Cytat:
    Char = Asc(str_temp)

    w Char już mamy właściwy numer znaku do odczytu za pomocą Reeks(c) = Lookup(x , Text_data).
    Po co więc to mnożenie
    Cytat:
    X = Char * 5
    ???

    0
  • #19 24 Sty 2017 14:56
    373522
    Użytkownik usunął konto  
  • #20 24 Sty 2017 15:16
    FastProject
    Poziom 28  

    Aaaa ok już rozumiem. Tak dopiero zaczynam tworzenie własnej matrycy, z tym, że będę skanował wiersze. Ale tym, że mnożysz x8 mnie naprowadziłeś, bo ja też będę miał matrycę 8x8. Więc podobnie jak Ty będę mnożył x8. W zasadzie dla oszczędności Flash, można by usunąć poszczególny bajty kolumn od 0 do 32 i wtedy nie trzeba mnożyć x5 czy x8.

    0
  • #21 24 Sty 2017 15:30
    373522
    Użytkownik usunął konto  
  • #22 24 Sty 2017 15:36
    FastProject
    Poziom 28  

    Chodzi mi o pozbycie się nie zer z poszczególnych znaków, a tego fragmentu znaków które nie są "drukowalne", czyli o usunięcie:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Bez tego fragmentu (poza spacją) nie jest wtedy potrzebny offset i to mnożenie x5 czy x8. Mam racje?

    0
  • #23 24 Sty 2017 15:43
    373522
    Użytkownik usunął konto  
  • #24 24 Sty 2017 15:52
    FastProject
    Poziom 28  

    A nie tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    0
  • #25 24 Sty 2017 15:53
    373522
    Użytkownik usunął konto  
  • #26 24 Sty 2017 20:37
    Marek_Skalski
    Moderator Projektowanie

    niveasoft napisał:
    Mój kod wyświetla te znaki jako TrueType

    Serio, operujesz na czcionkach True Type i wyliczasz ich kształt z krzywych Beziera?
    Chyba raczej chodzi o fonty proporcjonalne albo kerning, a nie true type. Po definicje i opis czym się różnią odsyłam do Wikipedii. W wersji angielskiej opisy są dużo lepsze.
    To jest forum techniczne i precyzja wypowiedzi ma znaczenie.

    0
  • #27 24 Sty 2017 22:16
    373522
    Użytkownik usunął konto