Skocz do zawartości

Matryca led: podstawy, proste wyświetlanie znaków - część 2


slon

Pomocna odpowiedź

Druga część artykułu będzie poświęcona na krótkie omówienie rejestru przesuwnego  (z takim określeniem spotkałem się w literaturze) 74HC595. Zagadnienie to chciałem zawrzeć w pierwszej części ale się nie udało. Dlatego teraz kontynuuję jako kolejną część pod tym samym tytułem. Temat nie jest na forum nowy ale warty odświeżenia. W/w układ jest dostępny w bardzo przystępnej cenie i daje też ciekawe możliwości. Podobnie jak ostatnio użyję symulatora SimulIDE aczkolwiek z góry też zaznaczę , że w rzeczywistości też sprawdziłem działanie układu. Podobnie jak poprzednio zaczniemy od podejścia manualnego.

Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac »
Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay.
PCBway_logotyp-350x233.png

Spis treści serii artykułów:

shift595_manual.thumb.png.5643fdc1db951afbce9261b27d7b368d.png

 

To będzie nasz układ testowy czyli trzy rejestry połączone w jeden łańcuch. Z góry zaznaczam , że kwadraty po prawej należy traktować jako podłączone do mikrokontrolera czyli na ten moment mamy stan LOW. Zgodnie z tym co podaje karta katalogowa piny od Data_Pin po Reset muszą być podłączone. Inaczej mówiąc musi być tam stan HIGH lub LOW w innym wypadku nasz układ nie będzie działał lub będzie działał niepoprawnie. Teraz pora zapoznać się z wprowadzaniem danych do rejestru (czyli 1 lub 0). 

 

shift595_manual1.thumb.png.a3004b6d0d113f6513582d18e53280b0.png

 

Na początek musimy ustawić stan wysoki na pinie DS czyli nasz Data_Pin następnie ustawiamy stan wysoki na pinach MR czyli Reset (tutaj wszystkie  są połączone razem). 

 

shift595_manual2.thumb.png.ea565a6038051fa09a751ba3433be53c.png

Teraz pora wprowadzić. W tym celu ustawiamy stan wysoki na pinie SHC czyli Clock_PIN 

 

shift595_manual3.thumb.png.c9b2d37fdb7df7aa6061e58481f78d9c.png

I ponownie zmieniamy stan pinu SHC na niski. I to już prawie tyle

 

shift595_manual4.thumb.png.e1911e743eb1240ebf86763842bced8c.png

 

Ostatnia czynność jaka nam została to ustawienie stanu wysokiego na pinie STC czyli Latch_Pin. I jak widać mamy aktywne wyjście Q0. Jeżeli chcemy ustawić stan wysoki na pinie Q1 to musimy ustawić stan niski na Latch_Pin i powtórzyć resztę procedury czyli Clock_Pin HIGH, Clock_PIN LOW, Latch_Pin HIGH. Teraz gdyby chcieć przełożyć działanie tego rejestru na codzienne życie ta dla mnie najlepiej kojarzy się to z zajęciami w szkole czyli: Dzwoni dzwonek na lekcję. Przychodzi pani/pan nauczyciel i otwiera klasę (ustawiamy Latch_PIN LOW). Następnie do klasy wchodzą uczniowie czyli stan osób zaczyna się zmieniać (również my zmieniamy stan na Pinie Clock_PIN HIGH i ponownie LOW). W momencie gdy wszyscy uczniowie weszli do klasy pani/pan nauczyciel zamyka drzwi (my ustawiamy Latch_Pin w na HIGH). Teraz sprawdzana jest obecność ale kilku osób brakuje więc i my musimy to w jakiś sposób zaznaczyć w naszym rejestrze. Zrobimy to wprowadzając zero:

 

shift595_manual5.thumb.png.c8289129bd7ad5560d1bc239430e92ac.png

Postępujemy podobnie jak w poprzednim przykładzie z tym , że tym razem zmieniamy stan na pinie Data_Pin na niski.

 

shift595_manual6.thumb.png.ce08c0d17dc24ee09c0fcb8bfe93c7be.png

I ponownie Clock_Pin HIGH

 

shift595_manual7.thumb.png.472236f4cb5b3255bb21c530c8363f2d.png

 

Clock_PIN LOW

 

shift595_manual8.thumb.png.3808e73d02ebd6a006b645f897a4700c.png

 

I proszę nasza jedynka przesunęła się o jedno miejsce do przodu. Skończyliśmy na sprawdzaniu listy. Wiadomo po sprawdzeniu listy zaczyna się lekcja. Podobnie w naszym wypadku ustawiany jest stan na pinach rejestru Q0....Q7 oraz Q7'. Z tym , że aby ten stan mógł być ustawiony musimy mieć pin OE czyli Output_Enable ustawiony w stan niski. W przeciwnym wypadku czyli jeśli mamy pin Out_En ustawiony na HIGH nasze wyjścia przestają być aktywne zachowują się tak jak by nie były do niczego podłączone czyli HIGH IMPEDANCE czyli niema tam ani 0 ani 1. Przy czym należy zaznaczyć , że stan rejestru jest zachowany. To tak jakby nauczyciel przerwał zajęcia i wyszedł z klasy. Zajęcia się nie odbywają ale ilość uczniów w klasie pozostaje taka sama. Nauczyciel po powrocie do kasy kontynuuje lekcję z tą samą ilością uczniów. I podobnie w naszym wypadku jeśli ponownie ustawimy pin Out_En na LOW będziemy mieli te same aktywne wyjścia. Tutaj pojawia się kolejna ciekawa możliwość. W trakcie gdy pin Out_en jest ustawiony na HIGH czyli wyjścia są nieaktywne możemy wprowadzić do rejestru nowe dane a po ustawieniu stanu LOW na pinie Out_en zobaczymy nową konfigurację dla wyjść. Można by to porównać do sytuacji gdy nauczyciel wychodzi z klasy a w trakcie jego nieobecności do klasy dochodzi jeden uczeń. Nauczyciel po powrocie do klasy aktualizuje listę obecności o jednego ucznia więcej i wznawia lekcję. Piny Out_en mogą być połączone razem tak jak na schemacie lub każdy oddzielnie (wtedy możemy kontrolować piny dla każdego z tych rejestrów oddzielnie). Pin MR czyli Reset działa inaczej. Jak zapewne większość osób się domyśla pin ten jest odpowiedzialny za kasowanie rejestru. Aby zresetować nasz rejestr należy kolejno ustawić pin MR na LOW i ustawić Latch_Pin na HIGH. I tu ponownie taka analogia do zajęć lekcyjnych czyli kończy się lekcja uczniowie wychodzą z klasy drzwi są zamykane i klasa zostaje pusta. Dla lepszego zrozumienia tematu najlepiej będzie poćwiczyć 

 

 

shift595_x3.thumb.png.4a5b47fec21fceae244b199814108184.png

 

Arduino całkiem dobrze nada się do celów ćwiczebnych chodziarz nie ukrywam , że metody z przyciskami bez arduino też są dobre. Pin którego jeszcze nie omówiliśmy to Q7' czyli pin na którym pojawia się stan wysoki w momencie gdy na pinie Q7 jest stan wysoki. Dlatego też pin Q7' z pierwszego rejestru jest podłączony z pinem DS czyli Data_Pin drugiego rejestru. Czyli rejestr drugi odbiera od pierwszego a trzeci od drugiego.


#define LATCH_PIN_MODE DDRB
#define CLOCK_PIN_MODE DDRB
#define DATA_PIN_MODE DDRB

#define LATCH_PIN_STATE PORTB
#define CLOCK_PIN_STATE PORTB
#define DATA_PIN_STATE PORTB

void setup() {
  DATA_PIN_MODE |= 0b00000001; // D8 OUTPUT
  LATCH_PIN_MODE |= 0b00010000; //D12 OUTPUT
  CLOCK_PIN_MODE |= 0b00100000; //D13 OUTPUT
}

void loop() {
  LATCH_PIN_STATE &= 0b00101111; // LOW
  DATA_PIN_STATE  ^= 0b00000001; // TOGGLE kratka
  CLOCK_PIN_STATE |= 0b00100000; // HIGH
  CLOCK_PIN_STATE ^= 0b00100000; // LOW
  LATCH_PIN_STATE ^= 0b00010000; // HIGH
  delay(500);
}

Kod dla w/w schematu jak widać jest bardzo prosty.  Robimy dokładnie to samo co wcześniej tylko już sami nie klikamy.

 

shift595_x3_2.thumb.png.6c13bafcece15981f5c58aa70802e222.png

 

tutaj typowa linijka oraz kod poniżej.


void loop() {
  LATCH_PIN_STATE &= 0b00101111; // LOW
  DATA_PIN_STATE  |= 0b00000001; // HIGH linijka
  CLOCK_PIN_STATE |= 0b00100000; // HIGH
  CLOCK_PIN_STATE ^= 0b00100000; // LOW
  LATCH_PIN_STATE ^= 0b00010000; // HIGH
  delay(500);
}

Polecam w w/w schemacie ustawić stan wysoki na jednym pinie OE (najlepiej dla środkowego rejestru) i zobaczyć co będzie się działo dla jednego i drugiego kodu. Następnie przywrócić stan niski na pinie OE a pin MR (też tylko dla środkowego rejestru) ustawić na LOW. Można dojść do ciekawych wniosków np:  można podpiąć drugi taki sam łańcuch z trzema rejestrami do tych samych pinów arduino a efekty mogą być różne. Podobnie jak ostatnio dodaje pliki do SimulIDE shift595_schematic.zip

Spis treści serii artykułów:

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.