Rejestr przesuwny 74HC595

Na ostatnich zajęciach nadal zajmowaliśmy się programowaniem wyświetlaczy siedmiosegmentowych. W przypadku podłączania wyświetlacza bezpośrednio do Arduino, zajmujemy aż osiem pinów cyfrowych. To sprawia, że płytka Arduino UNO (wyposażona w 14 wejść/wyjść cyfrowych) może sterować tylko jednym wyświetlaczem. Można co prawda wykorzystać piny analogowe (A0..A5) jako cyfrowe, ale to da możliwość podłączenia jedynie drugiego wyświetlacza. To mało. Jest jednak sposób, aby sterować wieloma wyświetlaczami bez straty wszystkich pinów cyfrowych. Umożliwia nam to rejestr przesuwny 74HC595. Dzięki temu małemu układowi scalonemu mamy możliwość sterowania osmioma wyjściami za pomocą jedynie trzech pinów cyfrowych z Arduino. Bardziej szczegółowe informacje o tym układzie znajdują się w jego specyfikacji technicznej (ang. datasheet).

Podłączanie rejestru przesuwnego

Rejestr przesuwny podłączamy używając schematu pokazanego poniżej. Należy zwrócić uwagę na wyżłobienie po jednej stronie układu, które oznacza górną część.

Wyjście 8 (GND) podłączamy standardowo do pinu o tej samej nazwie na Arduino. Układ wymaga zasilania (to oczywiste) – które podłączamy do pinu 16 (VCC). Rejstr akceptuje zasilanie z przedziału od 2 do 6V – dlatego pin 16 śmiało łączymy z pinem 5V w Arduino UNO. Dodatkowo wyjścia 10 i 16 rejestru łączymy ze sobą (10 to pin odpowiedzialny za czyszczenie stanów rejestru – my to będziemy robić „ręcznie”, więc ustawiamy go w stan wysoki). Kluczowe są wyjście 14, 12 i 11 rejestru, które sterują jego pracą – łączymy je z wybranymi pinami cyfrowymi Arduino (ja wybrałam piny 8,9 i 10 na mojej płytce Arduino). Osiem wyjść rejestru (QA..QH, czyli piny 15, 1..7) podłączamy do kolejnych ledów na wyświetlaczu według tego schematu:

Oczywiście aby układ działał prawidłowo, do wyświetlacza siedmiosegmentowego również należy podłączyć zasilanie i odpowiedni rezystor (poprzednie zajęcia).

Opis pinów i sposób działania rejestru

Do pinów cyfrowych Arduino podłączamy trzy wyjścia rejestru. Są one kluczowe we wzajemnej komunikacji.

  • Pin 11 SRCLK to pin przesuwający wszystkie osiem stanów rejestru – przesuwanie odbywa się zawsze do przodu. Praca rejestru polega właśnie na cyklicznym przesuwania swoich stanów. Aby wykonać przesunięcie ustawiamy SRCLK w stanie LOW, a potem w stanie HIGH – ta sekwencja to komenda „przesuń stany rejestru”.
  • Pin 14 SER to pin ustawiający pierwszy rejest w stanie wysokim (gdy SER= HIGH) lub niskim (gdy SER=LOW).
  • Pin 12 RCLK (latch pin) – ustawienie go w stan niski (LOW) powoduje zablokowanie wyjść rejestru QA..QH, przez co nie widać zmian na tych pinach a tym samym nie widać etapów przejściowych przesuwania (które są wymagane do uzyskania końcowej konfigurajci ośmiu pinów). Ustawienie go w stan wysoki (HIGH) powoduje aktywację pinów QA..QH i to, co jest do nich podłączone – działa tak, jak chcieliśmy. 

Rejestr przesuwny działa w taki sposób, że ustawia (bądź pozostawia je w stanie zerowym) pierwsze wyjście (SER), po czym stan wszystkich wejść przesuwa o jedno miejsce do przodu (SRCLK). Następnie powtarza te czynności tyle razy ile tego zarządamy, aż osiągniemy oczekiwany ciąg zer i jedynek.  Wynika z tego, że zapisując docelową konfigurację wyjść QA..QH w tablicy (gdzie na pierwszym miejscu tablicy powinien znajdować się pierwszy led itd) to odczyt takiej tablicy (i związane z tym ustawianie pinu SER) powinien odbywać się „od tyłu” – aby po ośmiu przesunięciach osiągnąć naszą konfigurację.

Kod programu

Na początku programu definiujemy dwie stałe (dyrektywy #define). Pierwsza stała oznacza liczbę  rejestrów przesuwnych (u nas na razie 1), natomiast druga całkowitą liczbę pinów podłączonych do wyświetlaczy ledowych (liczbę ileScalaków mnożymy razy osiem, ponieważ każdy wyświetlacz ma osiem ledów). Następnie deklarujemy trzy piny cyfrowe łączące Arduino z rejestrem. Należy zwrócić na to uwagę, gdyż w przypadku nieprawidłowego podłączenia, nasz program może zachowywać się nieprzewidywalnie, bądź nie działać. Tablica rejestr odnosi się do wcześniejszej stałej ilePinow, czyli oznacza całkowitą liczbę pinów, którymi będziemy sterować.

#define ileScalakow 1
#define ilePinow ileScalakow * 8
int SER=8; 
int RCLK=9;
int SRCLK=10; 
int rejestr[ilePinow];

Funkcja void czyscRejestr() pozwala na wyczyszczenie tablicy rejestr, aby umożliwić jej ponowne zapełnienie. Robimy to używając pętli for, ustawiając kolejno każdą wartość na zqero (LOW).

Funkcja void zapiszRejestr() to główna funkcja programująca rejest przesuwny – ustawia piny QA..QH w takich stanach, jakie ma tablica rejestr w pamięci Arduino. Ustawienie pinu RCLK na pozycję LOW zamraża stany QA..QH – nie widać przełączania (=przesuwania) stanów rejestru. Pętlę for wykonujemy od końca, od liczby pinów odejmujemy 1, ze względu na numerowanie tablic od 0. Dzięki włączeniu pinu RCLK w stan HIGH zobaczymy dokonane zmiany.

W funkcji void ustawPin(int ktory, int wartosc) zmieniamy tablicę rejestr na pozycji ktory, nadającj jej wartość. Można się jej pozbyć – programując bezpośrednio tablicę rejestr – ale funkcja ta powstała aby ćwiczyć programowanie strukturalne.

void setup(){
  pinMode(SER, OUTPUT);
  pinMode(RCLK, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  czyscRejestr();
  zapiszRejestr();
}
void czyscRejestr(){
  for(int i=0; i<ilePinow; i++)
    rejestr[i]=LOW;
}
void zapiszRejestr(){
  digitalWrite(RCLK, LOW); 
  for(int i=ilePinow-1; i>=0; i--){
    digitalWrite(SRCLK, LOW);
    digitalWrite(SER, rejestr[i]);
    digitalWrite(SRCLK, HIGH); 
  }
  digitalWrite(RCLK, HIGH); 
}
void ustawPin(int ktory, int wartosc){
  rejestr[ktory]=wartosc;
}

W funkcji głównej void loop() tworzymy pętlę, która najpierw ustawi wszystkie piny w pozycję low, abyśmy mogli zobaczyć przyszłe zmiany. Program ten najpierw zapali wszystkie ledy, poczeka pół sekundy, po czym po kolei je zgasi i ponownie zapali po półsekundowej przerwie.

void loop(){
  int i;
  for(i=0;i<ilePinow;i++)
    ustawPin(i, LOW);
    zapiszRejestr();
    delay(500);
   for(i=0;i<ilePinow;i++){
    ustawPin(i, HIGH);
    zapiszRejestr();
    delay(500);
}
}

Nie jest to program wyświetlający cyferki 0,1,2,…9 a jedynie program testujący działanie ośmiu wyjść QA..QH rejestru – naszą pracą domową jest zamiana powyższego kodu aby wyświetlała cyferki.

Podsumowanie

W tym tygodniu poznaliśmy prosty sposób na sterowanie wyświetlaczem siedmiosegmentowym za pomocą jedynie trzech pinów cyfrowych. Stwarza to duże możliwości, ponieważ rejestry przesuwne można ze sobą łączyć – a ciągle do ich sterowania będą potrzebne tylko 3 piny cyfrowe  z Arduino! Ale o tym za tydzień.

Praca domowa

Wykorzystując powyższy kod, wyświetlić cyfry na wyświetlaczu.

(c) Ewelina, 2017

 

Posted in FiBot and tagged , , , , .