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

Wyświetlacz ledowy 8x8 + Atmega16A+ rejestr przesuwny 74HC595

maxellxl 11 Lis 2011 23:35 5443 19
  • #1 10128510
    maxellxl
    Poziom 9  
    Witam wszystkich serdecznie,

    aktualnie bawię się elektroniką...mam projekt na studiach, ambicje poszły w góre i zamiast wybrać sobie gotowe płytki z mikrokontrolerami do zaprogramowania postanowilem wspolnie z kolegami stworzyć własny układ.

    Dodam, ze nie studiuje zadnej elektroniki czy automatyki i robotyki...a zwyklą informatykę :D i mam taki magiczny przedmiot jak systemy wbudowane :P

    Stworzyłem dwie płytki na jednej Atmega16A a na drugiej płytce zestaw diód 8x8, rezystory, tranzystory i rejestr przesuwny 74HC595.

    Sygnał przez tranzystory na wiersze diód puszczony jest z portu C atmegi i jest ok...działa gdy na sztywno podłączam mase pod kolumny. Problem polega na tym, ze chciałbym aby kolumny były sterowane przez rejestr przesuwny 74HC595...podpiety on jest kabelkami pod port B atmegi a dokladniej PB0, PB1 i PB2...

    PB0 podpiete jest pod port DS rejestru
    PB1 podpiete jest pod port OE rejestru
    PB2 podpiete jest pod pod STCP rejestru, przy czym STCP jest połączone cyną z SHCP wiec ten sam sygnał idzie na STCP i na SHCP jednoczesnie...

    Problem polega na tym, ze nie potrafie ustawić 8 bitów na wyjściu układu tak, żeby np paliły sie wszystkie diody...

    Czy ktoś z was wie jak to zrobić? ewentualnie fragment kodu podać byłoby mi najprościej zrozumieć...niestety dotychczasowego kodu ktory napisalem nie mam przy sobie, ponieważ kumpel pożyczył lapka na ktorym go mialem...ale tego nie bylo dużo...wysterowanie portem C atmegi i rejestrem to bylo może ze 30 linijek wiec podejrzewam, ze sam fragment kodu do obslugi rejestru nie zajmie wiecej jak 15-20 linijek.

    Dotychczasowy kod zapalał dwie graniczne kolumny wiec coś było nie tak...i nie mam szczerze pojecia już co...

    dodam, że jestem totalnym laikiem jeśli chodzi o mikrokontrolery i układy scalone...

    Język C; kompilator WinAVR...

    jako, ze jest kilka rodzajów a raczej oznaczen i kolejności pinów 74HC595, podaje link do dokumentacji, gdzie piny zgadzają się (strona 4): http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf fig 5. (taki bardziej podłużny)

    Bede wdzieczny za wszelką pomoc...

    Wyświetlacz ledowy 8x8 + Atmega16A+ rejestr przesuwny 74HC595
  • #2 10128798
    danthe
    Poziom 30  
    Rozewrzyj SCTP i SHCP. Wejście OE podłącz do masy, odłączone wyjście procka daj do SCTP.
    Na początek ustaw : SCTP = 0, SHCP = 0, DS = 0.

    Teraz ustawiasz wejście DS w stan wysoki, a na wejście SHCP podajesz 8 razy dodatni impuls czyli 1 i 0. W ten sposób zapełnisz rejestr przesuwny jedynkami.
    teraz wystarczy przepisać zawartość rejestru do wyjść impulsem dodatnim na wejściu SCTP.
  • #3 10128993
    lemos
    Poziom 17  
    Witam,
    ja do takiej matrycy led używam takiego kodu :
    [code]
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mam nadzieje, że to coś koledze rozjaśni.
    Dodatkowo google i tak np:
    http://embedded-lab.com/blog/?p=2661

    pierwszy link jaki znalazłem co prawda na PIC ale łatwo można przepisać na co się chce.

    Pozdrawiam
  • #4 10129241
    maxellxl
    Poziom 9  
    @danthe dlaczego trzeba rozewrzeć STCP i SHCP? wszedzie gdzie znalazłem w necie jakies rozwiazania to zawsze na te wejscia szedł ten sam sygnał...
    z OE do masy widziałem, ale tez czytalem na jakimś angielskim forum, ze OE na czas ustawiania bitów powinno być ustawione na 1...a w momencie kiedy skoncze ustawiać bity, daje na OE 0 żeby zapamietało...

    Teraz to sie już pogubilem całkowicie :/
  • #5 10129970
    GienekS
    Poziom 32  
    Jeżeli te sygnały są razem to dlatego OE należy wyłączyć aby zmiany wyjść, przy wpisywaniu nowych danych, nie były widoczne na wyjściach układu. A jak są one rozdzielone to wyjścia mogą być cały czas aktywne. Dopiero po zapisaniu wszystkich bitów do rejestru przesuwnego, jednym sygnałem SHCP przepisujesz cały rejestr do zatrzasku wyjściowego, co powoduję natychmiastową zmianę wszystkich wyjść układu na aktualne wartości.
  • #6 10129989
    maxellxl
    Poziom 9  
    Czyli moga być tak podłączone piny i nie musze rozdzielac STCP i SHCP?
    Jeśli tak to moglbys dać przyklad kodu jakbyś uzupełnił wyjścia np samymi jedynkami?
  • #7 10130050
    krru
    Poziom 33  
    maxellxl napisał:
    @danthe dlaczego trzeba rozewrzeć STCP i SHCP? wszedzie gdzie znalazłem w necie jakies rozwiazania to zawsze na te wejscia szedł ten sam sygnał...
    z OE do masy widziałem, ale tez czytalem na jakimś angielskim forum, ze OE na czas ustawiania bitów powinno być ustawione na 1...a w momencie kiedy skoncze ustawiać bity, daje na OE 0 żeby zapamietało...


    OE nie służy do zapamiętywania, tylko do odłączenia układu - tak jak masz to odcinasz układ na czas wprowadzania danych a potem go podłączasz.
    STCP umożliwia utrzymanie danych w niezmienionej postaci na wyjściach i potem
    zmienienie wszystkich w jednym momencie.
    Połączenie STCP i SHCP powoduje, że co każdy bit wyjścia są uaktualniane - co jest bez sensu, aczkolwiek LED to nie jest urządzenie, którym jakieś chwilowe impulsy bardzo przeszkadzają.
  • #8 10130172
    GienekS
    Poziom 32  
    maxellxl napisał:
    Czyli moga być tak podłączone piny i nie musze rozdzielac STCP i SHCP?
    Kolega już ci napisał jak to zrobić
    danthe napisał:
    Teraz ustawiasz wejście DS w stan wysoki, a na wejście SHCP podajesz 8 razy dodatni impuls czyli 1 i 0.
    i na końcu ustawić OE na aktywny czyli "0"
  • #9 10130209
    danthe
    Poziom 30  
    W takim zastosowaniu użył bym układu SCT2024, ale widzę, że płytka stykowa raczej wyklucza stosowanie układów smd. Ogólnie wygląda na to, że kolega nie rozumie idei transmisji szeregowej, synchronicznej.

    Cytat:
    @danthe dlaczego trzeba rozewrzeć STCP i SHCP? wszedzie gdzie znalazłem w necie jakies rozwiazania to zawsze na te wejscia szedł ten sam sygnał...


    W internecie jest masa różnych schematów, nie koniecznie poprawnych, a często błąd popełniony przez jednego konstruktora jest bezkrytycznie powielany.
  • #10 10130216
    maxellxl
    Poziom 9  
    czyli załóżmy, ze jak chce mieć same jedynki na wyjsciu to przykladowo w pseudokodzie bedzie wygladać to tak:

    OE = 1
    FOR 0..7
    DS = 1
    STCP = 1 (przy czym STCP i SHCP dalej są połaczone)
    STCP = 0
    ENDFOR
    OE = 0

    ??dobrze rozumiem?
  • #11 10130227
    danthe
    Poziom 30  
    W zasadzie powinno być ok, tylko czemu tak się upierasz na utrzymanie tego połączenia? Nadmienię też że można użyć sprzętowego interfejsu SPI ATmegi.
  • #12 10130260
    maxellxl
    Poziom 9  
    o SPI też prowadzący laboratoria mówił mi, ale zostało mi mało czasu, żeby to ogarnąć...sporo czasu zajeło mi kompletowanie elementów do układu i lutowanie...
    poza tym stacja lutownicza była pozyczona i aktualnie nie mam do niej dostępu a domyslam się, że piny PB0, PB1 i PB2 nie obsługują SPI, do nich mam na stałe kabelki przylutowane...

    no dobra a w sytuacji gdybym rozdzielił ST_CP i SH_CP, OE podpiał do masy to jak ten kod miałby wygladac ktory wyzej napisalem?

    jestem programistą i ciezko mi zrozumieć momentami "elektronike" :D wybaczcie z góry...za to zdecydowanie bardziej rozumiem algorytmy i kody...nie chce isć na łatwizne i prosić Was o cały program...a jedynie o wysterowanie 74HC595...z resztą sobie poradze bo to zwykła algorytmika...ten rejestr blokuje moje działanie juz od kilku dni niestety :/
  • #13 10130338
    danthe
    Poziom 30  
    STCP = 0 (na początek stan niski)
    SHCP = 0

    FOR 0..7
    DS = 1 (stan wysoki na wejściu danych)
    SHCP = 1 (zbocze dodatnie powoduje przesunięcie rejestru i wczytanie stanu wysokiego na początek rejestru)
    SHCP = 0

    ENDFOR (powtarzamy 8 razy)

    STCP = 1 (narastające zbocze przepisuje zawartość rejestru szeregowego do rejestru wyjściowego)
    STCP = 0


    Oczywiście wtedy wejście /OE stale podłączone do masy (lub można podłączyć PWM z atmegi do /OE i w ten sposób prosto sterować jasnością diod).
  • #14 10130404
    maxellxl
    Poziom 9  
    ok dzieki :) w takim razie musze skombinować lutownice jak najszybciej...

    i jeszcze jedno czy pin MR musi być podpiety pod 5V?

    czy ten for od 0 do 7 ma byc 8 razy powtorzony? czyli razem 64 razy?
  • #16 10130947
    maxellxl
    Poziom 9  
    ok dzieki wielkie :) jutro jak pożycze lutownice dam znac jak poszło i czy działa :)
  • #18 10136502
    maxellxl
    Poziom 9  
    heh dzieki...

    jednak wszystko ruszyło przy starym połączeniu, popełniłem totalną głupote...aż szkoda gadać :D

    ale pojawił sie kolejny problem...

    przykładowo wyświetlam sobie jakąś literkę np Y...i świeci się fajnie, z tym, że np 3 diody gdzieś tam obok literki świecą ale bardzo słabo...tak jakby na nie niepotrzebnie szedł jakiś słaby sygnał.

    Czy macie jakiś pomysł co to moze byc?
  • #19 10137165
    asembler
    Poziom 32  
    Zdarza sie przy "eksluzywnych" diodach, że dioda nie jest już diodą, czyli przewodzi także w drugą stronę. Wystarczy aby takie dwIe sie spotakły w projekcie i masz taki efekt.
  • #20 10139632
    maxellxl
    Poziom 9  
    masz na myśli tanie diody?
REKLAMA