slon Napisano Luty 15, 2020 Udostępnij Napisano Luty 15, 2020 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. Spis treści serii artykułów: Matryca led: podstawy, proste wyświetlanie znaków - część 1 Matryca led: podstawy, proste wyświetlanie znaków - część 2 Matryca led: podstawy, proste wyświetlanie znaków - część 3 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). 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). Teraz pora wprowadzić. W tym celu ustawiamy stan wysoki na pinie SHC czyli Clock_PIN I ponownie zmieniamy stan pinu SHC na niski. I to już prawie tyle 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: Postępujemy podobnie jak w poprzednim przykładzie z tym , że tym razem zmieniamy stan na pinie Data_Pin na niski. I ponownie Clock_Pin HIGH Clock_PIN LOW 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ć 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. 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: Matryca led: podstawy, proste wyświetlanie znaków - część 1 Matryca led: podstawy, proste wyświetlanie znaków - część 2 Matryca led: podstawy, proste wyświetlanie znaków - część 3
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »