Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Rejestr przesuwny 74HC595 - sterowanie 16 diodami

kamilsos 14 Jun 2010 13:01 38861 17
  • Rejestr przesuwny 74HC595 - sterowanie 16 diodami

    Czasem znajdujemy się w takiej sytuacji gdy nasze założenia projektowe nie pokrywają się z elementami elektronicznymi jakie posiadamy. Może zaistnieć konieczność zwiększenia wyjść logicznych mikroprocesora jaki wykorzystujemy. Ten krótki poradnik dla początkujących pokaże wszystkim zainteresowanym jak sterować 16 wyjściami logicznymi w tym wypadku wykorzystanymi do zapalania diod LED przy użyciu jedynie 3 wyjść mikroprocesora.

    Aby tego dokonać będziemy potrzebowali 8-bitowego rejestru przesuwnego. Informacje są zapisywane seryjnie do rejestru przesuwnego, a później utrwalone w rejestrze pamięci. Rejestr pamięci kontroluje 8 wyjść logicznych.

    Rejestr przesuwny 74HC595 - sterowanie 16 diodami

    Obrazek pokazuje piny rejestru. Gdy stan pinu 11 (SH_CP lub SRCLK oznaczane zależnie od producenta) zmienia się z niskiego na wysoki to wartość DS (zależnie od podanego stanu logicznego na pinie 14) zapisywana jest w rejestrze przesuwnym a wartości rejestru przesuwane zostają o jeden bit tak aby zrobić miejsce na następną porcję informacji.

    Pin 12 (ST_CP lub RCLK oznaczane zależnie od producenta) jest w stanie niskim podczas gdy informacje są zapisywane do rejestru. Stan wysoki powoduje zapisanie danych do rejestru pamięci, po czym stan wyjściowy pojawia się na pinach Q0-Q7.

    Rejestr przesuwny 74HC595 - sterowanie 16 diodami

    Prezentowany schemat pokazuje przebieg sygnałowy potrzebny do ustawienia wyjść logicznych (Q0-Q7) tak aby pokazywały wartość 11000011, zakładając że ich pierwotny stan równy był 00000000.

    Rejestr przesuwny 74HC595 - sterowanie 16 diodami

    Możemy poznać praktyczne zastosowanie rejestru przesuwnego na przykładzie mikrokontrolera Atmega8, 2 rejestry 74HC595 oraz 16 diod LED. Elementy należy podłączyć według wskazanego schematu. Ten przykład pokazuje sterowanie 16 diodami LED jednak poprzez połączenie kaskadowe kolejnych rejestrów możemy uzyskać niemal nieskończona ilość wyjść logicznych.

    Poniższy kod spowoduje migotanie diod LED w układzie ‘knight rider’.

    #include <avr/io.h>
    #include <util/delay.h>
    
    #define DS_PORT    PORTC
    #define DS_PIN     0
    #define ST_CP_PORT PORTC
    #define ST_CP_PIN  1
    #define SH_CP_PORT PORTC
    #define SH_CP_PIN  2
    
    #define DS_low()  DS_PORT&=~_BV(DS_PIN)
    #define DS_high() DS_PORT|=_BV(DS_PIN)
    #define ST_CP_low()  ST_CP_PORT&=~_BV(ST_CP_PIN)
    #define ST_CP_high() ST_CP_PORT|=_BV(ST_CP_PIN)
    #define SH_CP_low()  SH_CP_PORT&=~_BV(SH_CP_PIN)
    #define SH_CP_high() SH_CP_PORT|=_BV(SH_CP_PIN)
    
    //Define functions
    //===============================================
    void ioinit(void);
    void output_led_state(unsigned int __led_state);
    //===============================================
    
    int main (void)
    {
       ioinit(); //Setup IO pins and defaults
    
       while(1)
       {
          // Output a knight rider pattern
          
          for (int i=15;i>=0;i--)
          {
             output_led_state(_BV(i));
             _delay_ms(50);
          }
          for (int i=1;i<15;i++)
          {
             output_led_state(_BV(i));
             _delay_ms(50);
          }
       }
    }
    
    
    void ioinit (void)
    {
        DDRC  = 0b00000111; //1 = output, 0 = input
        PORTC = 0b00000000;
    }
    
    void output_led_state(unsigned int __led_state)
    {
       SH_CP_low();
       ST_CP_low();
       for (int i=0;i<16;i++)
       {
          if ((_BV(i) & __led_state) == _BV(i))  //bit_is_set doesn’t work on unsigned int so we do this instead
             DS_high();
          else   
             DS_low();
          
    
          SH_CP_high();
          SH_CP_low();
       }
       ST_CP_high();
    }


    Źródło: http://www.protostack.com/forum/blog.php?u=2&b=35&sid=50384afa8d72f982e6ce2b736934eefc
    About Author
    kamilsos
    Level 13  
    Offline 
    kamilsos wrote 106 posts with rating 26. Live in city Lublin. Been with us since 2008 year.
  • #2
    Karol966
    Level 31  
    Można też to zrobić na rejestrach 74HC164 wykorzystując 2 piny ;)
    Piszesz, że takimi rejestrami można rozszerzyć ilość wyjść - a kto zabroni rozszerzyć w ten sam sposób jednocześnie ilość wyjść oraz wejść ;) Jest to wykonalne - wystarczy się nad tym chwilke zastanowić. Osobiście tak rozwiązałem bark wolnych linii I/O przy atmedze32 podczas budowy jednego z projektów.
  • #3
    PIEKNY1234
    Level 15  
    A taki PCA9544 sterowany przez I2C by sie nienadał? był juz taki opisywany na elektrodzie.
  • #4
    vulture30
    Level 11  
    Czy rejestr da radę bezposednio sterowac MOSFETami z serii L?
  • #5
    jacynka84
    Level 26  
    tak, mosfety LogicLevel powinny współpracować.

    A czy z dwóch lub więcej 8 bitowych rejestrów przesuwnych, serial output, da się zrobić 1 16bitowy rejestr ?? ostatnie wejście pierwszego należy załączyć do pierwszego wejścia drugiego ?
  • #6
    wd40
    Level 21  
    Jeżeli chodzi o sterowanie samych diód to można się obyć bez rejestru, wystarczy trochę pokombinować:
    3 wyjściami można wysterować 6 diód,
    4 - 12
    5 - 20
    itd.
    Wszystko (prawie) bezpośrednio podłączane do wyjść ukontrolera.
  • #7
    tobiaszu
    Level 2  
    Rozwiązanie bardzo wygodne. Tym nie mniej okazuje się, że 74HC595 bądź podobne z zatrzaskiem coraz trudniej dostać w lokalnych sklepach (Wrocław).
    Oczywiście jest to jak najbardziej do dostania, ale czy tego typu układy nie odchodzą powoli do przysłowiowego lamusa?
    A jeśli tak, to jak sądzicie, jak można rozwiązać to zagadnienie w jak najprostszy sposób unikając przy tym przerostu formy nad treścią?
    Oczywiście mam na myśli zatrzaskiwanie wyjść, aby uniknąć efektu 'przygasania' diod.
  • #8
    legalglog
    Level 2  
    Moim zdaniem bardzo fajny układ, myślę, że zwłaszcza tym którzy nie mają jeszcze dużego doświadczenia z elektroniką pozwala poznać zastosowanie rejestrów przesuwnych. Więc nie ma co pisać, że można to zrobić inaczej, bo prawda jest taka że 99% układów na elektrodzie można rozwiązać inaczej. Na prawdę duży plus ;]
  • #10
    hexen2k
    Level 16  
    Karol966 wrote:
    Można też to zrobić na rejestrach 74HC164 wykorzystując 2 piny ;)
    Piszesz, że takimi rejestrami można rozszerzyć ilość wyjść - a kto zabroni rozszerzyć w ten sam sposób jednocześnie ilość wyjść oraz wejść ;) Jest to wykonalne - wystarczy się nad tym chwilke zastanowić. Osobiście tak rozwiązałem bark wolnych linii I/O przy atmedze32 podczas budowy jednego z projektów.


    Ciekaw jestem bardzo w jaki sposób można wykorzystać rejestr jako wejście... trochę się naszukałem ale nic na temat wejść nie znalazłem. Może ktoś powie jak to można faktycznie zrealizować ?
  • #11
    DiodaLed
    Level 13  
    Można. Rejestr 74HC164 to niemal taki sam rejestr co 74HC595 z tą różnicą, że nie posiada zatrzasków. Tak więc wysyłając do niego szeregowo dane, na jego wyjściach pojawia się od razu równoległa reprezentacja tego co mu wyślemy. Oczywiście w momencie wysyłania do niego danych zauważylibyśmy na diodach coś jakby ich błyśnięcie (tych, które nie powinny się świecić), gdyż dane są wysyłane bardzo szybko. Nie przeszkadzałoby to w pierwszym układzie, jednak w wyświetlaczu pokazującym jakąś zawartość, było by to nieestetyczne. Nic jednak przecież nie stoi na przeszkodzie, aby programowo, na chwilę przed wysyłaniem danych do rejestrów, ustawić wszystkie tranzystory sterujące wierszami diod, w stan zatkania, a dopiero po wysłaniu wszystkich danych, wybrany wiersz uaktywnić. Tak więc jest to możliwe, jednak czasami może przysporzyć pewnych problemów. Dzięki 74HC595 możemy także zaoszczędzić część wyprowadzeń uC, gdyż do dekodowania 1 z 8 możemy zastosować dodatkowo 74HC259 i zamiast 8 wyprowadzeń uC użyjemy tylko 3.
  • #12
    hexen2k
    Level 16  
    DiodaLed wrote:
    Można. Rejestr 74HC164 to niemal taki sam rejestr co 74HC595 z tą różnicą, że nie posiada zatrzasków. Tak więc wysyłając do niego szeregowo dane, na jego wyjściach pojawia się od razu równoległa reprezentacja tego co mu wyślemy. Oczywiście w momencie wysyłania do niego danych zauważylibyśmy na diodach coś jakby ich błyśnięcie (tych, które nie powinny się świecić), gdyż dane są wysyłane bardzo szybko. Nie przeszkadzałoby to w pierwszym układzie, jednak w wyświetlaczu pokazującym jakąś zawartość, było by to nieestetyczne. Nic jednak przecież nie stoi na przeszkodzie, aby programowo, na chwilę przed wysyłaniem danych do rejestrów, ustawić wszystkie tranzystory sterujące wierszami diod, w stan zatkania, a dopiero po wysłaniu wszystkich danych, wybrany wiersz uaktywnić. Tak więc jest to możliwe, jednak czasami może przysporzyć pewnych problemów. Dzięki 74HC595 możemy także zaoszczędzić część wyprowadzeń uC, gdyż do dekodowania 1 z 8 możemy zastosować dodatkowo 74HC259 i zamiast 8 wyprowadzeń uC użyjemy tylko 3.


    No tak tylko ja pytałem o to jak zrobić wejście za pomoca tego układu... :)
  • #15
    malyhenio1
    Level 11  
    pytam sie bo nie mogę nic znaleśc ,szukam jak majac listwe led uzykac efekt Knight Rider
  • #16
    derytrus
    Level 12  
    @malyhenio: z listwą nic nie podziałasz, musisz mieć przynajmniej jedno wyprowadzenie każdej diody "wolne", właśnie, żeby je podłączyć do wspomnianego '595.

    Mam natomiast inne pytanie. Napisałem własną funkcję do obsługi tego układu (co do poprawności jestem pewien, wielokrotnie testowane miernikiem). Martwi mnie inna rzecz - za niskie napięcie wyjściowe przy stanie wysokim podczas obciążenia.
    Podczas, gdy świeci jedna dioda, UOH=4,8V, UOL=0,8V. Natomiast, gdy świeci ich 7, UOH=2,3V, UOL=1,8V. Oczywiście, świecą się wtedy wszystkie diody (wartości katalogowe są zupełnie inne) :/ Co może być tego przyczyną? Przy świecących 8 LEDach pobór prądu to tylko 24mA... Dodam, że korzystam z wersji SMD układu, a pin !MR jest podciągnięty do zasilania rezystorem 1k.
    Kolejny objaw: wyjścia uC są połączone z wejściami układu rezystorami 4,7kΩ. Przy stanie niskim na portach uC pojawia się na wejściach 595 napięcie rzędu 3V...

    Nieaktualne. Wlutowałem nowy układ i działa :) pewnie przez brak rezystorów na liniach sterujących coś spaliłem. Teraz jestem szczęśliwym posiadaczem wskaźnika wysterowania na '595 :)[/b]
  • #17
    cichy999
    Level 20  
    Witam

    A można prosić o kod w bascomie??

    Pozdrawiam
  • #18
    Anonymous
    Anonymous