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.

74HC595 - Sterowanie wyświetlaczem 4 cyfrowym siedmio segmentowym LED

mirek1968 23 Lis 2012 18:13 10590 38
  • #1 23 Lis 2012 18:13
    mirek1968
    Poziom 13  

    Mam pytanie dotyczące sterowaniem wyświetlacz 4 cyfrowego o wspólnej anodzie rejestrem przesuwnym typu 74HC595 który jest sterowany trzema liniami z atmegi 16.
    W jaki sposób wyświetlić cokolwiek na LED 7-segmentowym pisząc program w c. ,jak to działa?

    Poniżej zamieszczam schemat podłączenia tych układów na mojej płytce szkoleniowej.

    74HC595 - Sterowanie wyświetlaczem 4 cyfrowym siedmio segmentowym LED

    Proszę o pomoc w zrozumieniu sposobu sterowania tych wyświetlaczy

    0 29
  • #2 23 Lis 2012 18:33
    tmf
    Moderator Mikrokontrolery Projektowanie
  • #3 03 Lut 2013 17:44
    mirek1968
    Poziom 13  

    Piszę znowu w tej sprawie ponieważ dalej nie rozumiem w jaki sposób wyświetlać daną cyfrę na wyświetlaczu LED w tym moim układzie powyżej.
    Wiem już jak aktywować pojedynczy wyświetlacz ale wtedy zaświecają się wszystkie segmenty wyświetlacza i mam wpływ tylko na to który chcę aktywować i zależy to od wartości zmiennej i

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli ktoś chce mi pomoc to proszę o konkrety.

    0
  • #4 06 Lut 2013 22:54
    30402
    Użytkownik usunął konto  
  • #6 07 Lut 2013 23:22
    mirek1968
    Poziom 13  

    Zmieniłem program na coś takiego.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I w zależności od bitu w bajcie cnt zapala mi się dany wyświetlacz ale jak ustawie np 0b10000000 to zapala mi się cyfra 8 a jak zmienię na 0b01000000 to wtedy wyświetla mi się na następnym wyświetlaczu 0 .
    Jak teraz zrobić to z drugim bajtem,proszę o pomoc to podstawie tego programu powyżej.

    0
  • #7 10 Lut 2013 19:08
    mirek1968
    Poziom 13  

    i jeszcze jedno pytanie dlaczego 0b00000000 to cyfra 8?,wiem że tak jest bo wyświetla mi 8 ale nie wiem dlaczego,no i jak np. mają się inne cyfry do kodu dwójkowego(np1,2,3,4,5,6,7,8,9,0).

    0
  • #9 11 Lut 2013 17:06
    mirek1968
    Poziom 13  

    Niby wszystko logiczne ale nie potrafię tego zrealizować w kodzie c ,ani do końca zrozumieć. Niestety na mojej płytce szkoleniowej której rysunek podałem na początku moich postów muszę i chcę korzystać ze sprzętowego SPI z wykorzystaniem tej komunikacji przez wyjścia MOSI ,SS SCK procesora Atmega16 .Ponieważ na mojej płytce jest to tak zaprojektowane.Jeśli ktoś jest biegły w jezyku c i potrafi mi dopisać coś co zadziała do mojego ostatniego kodu c to poproszę a jeśli nie to trudno będę musiał spasować z tą częścią płytki testowej.
    Większość rzeczy już przetestowałem na mojej płytce ale z multipleksowaniem mam problemy:-)

    0
  • #10 10 Mar 2013 22:50
    mirek1968
    Poziom 13  

    Zrobiłem już coś podobnego wczoraj i zadziałało mi to w końcu.Wcześniej pogłębiłem moje wiadomości czytając ze zrozumieniem o multipleksowaniu w książce M.Kardasia-Mikrokontrolery AVR.
    U mnie wygląda to tak

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli coś pokręciłem to proszę o krytykę kodu,ale faktem jest że działa mi to fajnie i liczy od 0 do 7 a następnie wraca znów w drugą stronę od 7 do 0 itak w kółko:-)

    0
  • #11 10 Mar 2013 23:02
    BlueDraco
    Specjalista - Mikrokontrolery

    Jak by Ci tu powiedzieć... Wszystko pokręciłeś.

    1. Zastąp enum dwiema tablicami stałych - jedną do wyboru cyfr (niekonieczna), drugą do przechowywania obrazów cyfr (konieczna) - dzięki temu pozbędziesz się z programu tych bezsensownych sekwencji if.
    2. Zmień podręcznik.
    3. Uruchom przerwanie timera o częstotliwości ok. 300 Hz * liczba cyfr. Jak już to zrobisz - zgłoś się po dalsze dobre rady.

    0
  • #13 11 Mar 2013 10:23
    uzi18
    Poziom 23  

    Zapalasz segmenty "0" dlatego ze to wyswietlacz ze wspolna anoda.
    czyli w srodku jedna cyfra wyglada mniej wiecej tak:

    Code:

    a---------|<|---\
    b---------|<|---|
    c---------|<|---|
    d---------|<|---|
    e---------|<|---|
    f---------|<|---|
    g---------|<|---|
    h---------|<|---\---Anoda


    Teraz zalaczamy +5V ("1") na anode i 0V ("0") na segmentach ktore maja sie zapalic.
    Przy wspolnej katodzie jest odwrotnie.
    Code:

    0V ---------|<|--- 0V - nie swieci - brak roznicy potencjalow
    5V ---------|<|--- 0V - nie swieci - dioda nie przewodzi
    5V ---------|<|--- 5V - nie swieci - brak roznicy potencjalow
    0V ---------|<|--- 5V - swieci - dioda przewodzi


    Pominalem oporniki, ktore musza byc aby ograniczyc prad diod.

    Kod oczywiscie napisany jest nadmiarowo, a kolega bedzie mial jeszcze w przyszlosci
    czas aby zauwazyc ze mozna go napisac optymalniej.

    0
  • #14 12 Mar 2013 15:18
    mirek1968
    Poziom 13  

    Ok zrobiłem zamiast "enum" dwie tablice ze zmiennymi.Jedna tablica to wybór wyświetlacza a druga to poszczególne cyfry w kodzie liczb szestnastkowych.Wykorzystałem także timer1 dla funkcji przerwania sprzętowego na moim atmedze 16 o częstotliwości około 300Hz.
    Dlaczego 300Hz?,druga sprawa co jest złego w "enum"?,trzecia sprawa książkę cenię sobie bardzo bo ułatwia mi start w podstawy programowania:-)
    Jak chcesz wykorzystać przerwanie 300Hz do sterowania wyświetlaczami?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W jaki sposób wykorzystać 300Hz dla sześciu wyświetlaczy LED,dopisz jak możesz swój pomysł do tego kodu

    0
  • #15 12 Mar 2013 15:32
    BlueDraco
    Specjalista - Mikrokontrolery

    OK, prawie dobrze - miały być stałe - const uint8_t cyfra[] = {...}.

    Nic złego nie ma w enum, ale tu nie potrzebujesz enum tylko stablicowanych wartości.

    Do wyświetlania cyfr nie potrzebujesz żadnych if - wystarczy napisać SendSpi(Display[i]); SendSpi(Cyfra[i]); / zostanie wyświetlona cyfra o indeksie i. Do tego właśnie były potrzebne tablice, przy czym zamiast tej pierwszej wytarczyłoby napisać SendSpi(1 << i);

    Możesz ten kod wypróbować w pętli, potem zabierz się za przerwanie.

    W przerwaniu należy kolejno:
    - zatrzasnąć poprzednio wsuniętą zawartość rejestrów HC595,
    - wsunąć nową zawartość - te SendSpi.

    Przerwanie ma być zgłaszane z częstotliwością 300 Hz razy liczba cyfr, czyli zapewne 2400 Hz. Może być trochę mniej niż 2400, ale nie mniej niż jakieś 1200.

    W tym przerwaniu po kolei

    0
  • #16 12 Mar 2013 17:21
    mirek1968
    Poziom 13  

    Niby działa tak samo jak przedtem ale są prześwity na wyświetlaczach w tym czasie jak powinny być nie aktywne to coś cały czas impulsowo na nich mruga.Co to dalszej części związanej z przerwaniem i umieszczeniem tak kodu to proszę o dopisanie Twojego pomysłu do mojego kodu w celu szkolenia dla mnie:-)

    0
  • #17 12 Mar 2013 18:01
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie widzę w Twoim kodzie sterowania linią RCLK, czyli STCP. Trzaba zmienić jej stan jeden raz z niskiego na wysoki po wysłaniu OBU bajtów.

    0
  • #18 13 Mar 2013 15:22
    mirek1968
    Poziom 13  

    oto cały kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #19 13 Mar 2013 16:32
    BlueDraco
    Specjalista - Mikrokontrolery

    1. A gdzie sterowanie STCP? Przeczytaj dokumentację HC595, np. na stronach TI.

    2. Usuń nadmierne odstępy pionowe (sekwencje kilku pustych wierszy) - tego się nie daje czytać.

    3. Tablica Cyfra powinna mieć typ const uint8_t.

    4. W pętlach for potrzbujesz tylko jednej pary SendSpi. Obecnie w każdym obiegu pętli wysyłasz 7 razy to samo. Po co?

    0
  • #20 14 Mar 2013 17:06
    mirek1968
    Poziom 13  

    Ok racja. pętli for nie potrzebnie wysyłałem "sendspi" siedem razy ,poprawiłem to.
    Nie wiem w jaki sposób wykorzystać przerwanie 300ms*8 w moim układzie i jaka jest koncepcja Twojego pomysłu z tym przerwaniem.No i co z tym sterowaniem STCP nie rozumiem pytania przecież po wysłaniu bajtu steruję STCP poniżej podaję ten kawałek kodu.

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Impuls sygnału CS z niskiego na wysoki po wysłaniu pełnego baitu to wejście STCP rejestru przesuwnego które zdefiniowane mam przed programem głównym.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #21 14 Mar 2013 17:40
    BlueDraco
    Specjalista - Mikrokontrolery

    No to pomyśl, jaką to czynność musi wykonywać ciągle twój program, żeby na wyświetlaczu widać było wszystkie cyfry...

    Jeżeli ta czynność nie jest wykonywana w równych odstępach czasu (czyli w procedurze obsługi przerwania) - skutkiem jest nierówne świecenie - któraś cyfra jest jaśniejsza od pozostałych.

    STCP ma zmienić stan po wysłaniu dwóch bajtów, a nie jednego. To stąd na wyświetlaczu biorą się duchy.

    0
  • #22 14 Mar 2013 18:57
    mirek1968
    Poziom 13  

    Czyli jeśli chodzi o STCP to w moim przypadku aby móc wysyłać dwa bajty to mam stworzyć nową funkcje np. "bajt 1" która bedzie kopią funkcji "bajt" i wywołac ją tak samo jak wywołuję funkcję czyli "void SendSpi( uint8_t bajt )" ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale co mam umieścić w funkcji przerwania

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Prosze wszystkich o dalszą pomoc

    0
  • #23 14 Mar 2013 19:15
    BlueDraco
    Specjalista - Mikrokontrolery

    Zrób funkcję, która tylko wysyła bajt, a po wysłaniu dwóch bajtów machnij linią CS. Nie potrzebujesz oczekiwania.

    W obsłudze przerwania umieść to, co Twój program robi w kółko w pętli - wysyłanie pojedynczej cyfry i przesunięcie indeksu na następną cyfrę.

    0
  • #24 16 Mar 2013 20:03
    mirek1968
    Poziom 13  

    Ale co to znaczy "a po wysłaniu dwóch bajtów machnij linią CS"_proszę dokładniej to opisać.:-)
    jak zmieniłem prędkość transmisji SPI na 4 to przestały pojawiać mi się duszki.

    0
  • #25 16 Mar 2013 20:07
    BlueDraco
    Specjalista - Mikrokontrolery

    Czyli zamaskowałeś błąd przez skrócenie czasu wyświetlania śmieci. Nie wiem, jak można Ci przystępniej wytłumaczyć, co to znaczy, że masz zmienić stan (a dokładnie podać narastające zbocze na linię CS) jeden raz po wysłaniu dwóch bajtów sterujących wyświetlaczem. Które słowo jest dla Ciebie niejasne?

    Zajrzyj do karty katalogowej HC595.

    1
  • #26 16 Mar 2013 21:37
    mirek1968
    Poziom 13  

    Od początku moich postów podaję po wysłaniu bajtu na linię CS stan wysoki

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli ktoś ma inne pomysły na tzw. duszki na wyświetlaczach to proszę o nie:-)

    0
  • #28 16 Mar 2013 21:57
    BlueDraco
    Specjalista - Mikrokontrolery

    Od początku Twoich postów podajesz na CS stan wysoki po każdym bajcie, czyli wsuwasz do rejestru segmentów sterowanie cyfr, uaktywniasz CS i w ten sposób zapalasz śmieci, następnie wsuwasz do rejestru segmentów sterowanie segmentów, uaktywniasz CS i zapalasz to, co trzeba. Gdybyś nie uaktywniał CS po pierwszym bajcie - nie byłoby śmieci.

    Piszę to od dawna, piszę, co trzeba zrobić, a czego nie robisz - nie reagujesz.

    0
  • #29 17 Mar 2013 19:44
    mirek1968
    Poziom 13  

    Dobrze Ok,ale w jaki sposób mam przyblokować CS przy wsuwaniu do rejestru cyfr a uaktywniać tylko wtedy gdy wsuwam do rejestru segmenty skoro wysyłam je w tym samym czasie i tą samą funkcję SendSpi.
    Proszę się nie gorączkować bo ja nie mam jeszcze doświadczenia w tych sprawach i dlatego jestem na forum początkujących a nie zaawansowanym ,dlatego proszę więcej spokoju i wyrozumiałości.Jeśli ktoś ma chęć a nie zaboli go palec przy dopisaniu kilku linijek kodu do moich wypocin to poproszę.

    0