Schody.  Vstupní skupina.  Materiály.  Dveře.  Hrady a zámky  Design

Schody. Vstupní skupina. Materiály. Dveře. Hrady a zámky Design

» Použití posuvných registrů v zobrazovacích zařízeních. Posuvné registry Západka posuvného registru 4 bity

Použití posuvných registrů v zobrazovacích zařízeních. Posuvné registry Západka posuvného registru 4 bity

Podle hodinového signálu se obsah každého předchozího spouštěče přepíše do dalšího spouštěče v pořadí v řetězci. Kód uložený v registru se s každým hodinovým cyklem posouvá o jeden bit směrem k nejvýznamnějším bitům nebo směrem k nejméně významným bitům, což dává registrům tohoto typu jméno.

V souvislosti s názvem směru posunu v posuvné registryČasto dochází ke zmatkům. Existují dva typy posunu: doprava (hlavní režim, který má každý posuvné registry) a doleva (tento režim mají jen některé, obrácené). posuvné registry). Tyto názvy odrážejí vnitřní strukturu posuvné registry(obr. 8.14) a přepisování signálů postupně podél řetězce spouštěčů. V tomto případě jsou klopné obvody zcela přirozeně číslovány zleva doprava, například od 0 do 7 (nebo od 1 do 8) pro 8bitové registry. Výsledkem je, že posouvání informací o registr doprava je posun směrem k bitům s vyššími čísly a posunutí informace o registr doleva je posun směrem k bitům s nižšími čísly.

Jak však víte, v jakémkoli binárním čísle jsou nejvýznamnější bity vlevo a nejméně významné bity jsou vpravo. Proto posun binárního čísla doprava bude posunem směrem k bitům nižšího řádu a posun doleva bude posunem směrem k bitům vyššího řádu. To je rozpor, ne něčí zlý úmysl, prostě se to stalo historicky a vývojář digitálního zařízení si to musí pamatovat.


Rýže. 8.14.

Standardní řada digitálních mikroobvodů zahrnuje několik typů posuvné registry, lišící se možnými provozními režimy, režimem zápisu, čtení a posunu a také typem koncových stupňů (2C nebo 3C). Většina posuvné registry má osm číslic. Na Obr. 8.15 ukazuje jako příklad čtyři typy mikroobvodů posuvné registry.

Registr IR8 je nejjednodušší posuvné registry. Jedná se o 8bitovou zpožďovací linku, to znamená, že má pouze jeden informační vstup, na který se přivádí sériově posunutá informace (přesněji dva vstupy kombinované pomocí funkce 2I), a osm paralelních výstupů. Posun směrem k výstupům s vyššími čísly se provádí podél náběžné hrany hodinový signál C. K dispozici je také resetovací vstup –R, na kterém nulový signál vynuluje všechny výstupy registrů. Tabulka pravdy registr IR8 je uveden v tabulce. 8.5.


Rýže. 8.15.Tabulka 8.5. Tabulka pravdy posuvný registr IR8
Vstupy Výjezdy
-R C D1 D2 Q0 Q1 Q7
0 X X X 0 0 0
1 0 X X Neměňte se
1 1 X X Neměňte se
1 0 1 1 1 1 Q0 Q6
1 0 1 0 X 0 Q0 Q6
1 0 1 X 0 0 Q0 Q6

Registr IR9 vykonává inverzní funkci registru IR8. Pokud IR8 převádí vstupní sériové informace na výstupní paralelní, pak registr IR9 převádí vstupní paralelní informace na výstupní sériové informace. Podstata posunu se však nemění, pouze v IR9 mají všechny interní spouštěče paralelní vstupy a pouze jeden, poslední spouštěč, má výstup (přímý i inverzní). Vstupní kód je zapsán do registru na základě nulového signálu na vstupu -WR. Posun se provádí na kladné hraně na jednom ze dvou hodinových vstupů C1 a C2, dohromady

1. Obsah

2. Úvod ……………………………………………………………………………………… 2

3. Přehled literárních zdrojů ………………………………… 3

3.1. Obecné informace o registrech ………………………………… 3

3.2. Obecné informace o spouštěčích……………………………….. 6

3.3. Posunové registry ………………………………………….. 12

3.4. Univerzální registry …………………………………………. 20

4. Vývoj obvodu posuvného registru ………………………………… 24

4.1. Počáteční údaje ………………………………………………………………… 24

4.2. Postup pro vývoj posuvného registru ………………………………… 24

4.3. Vývoj čtyřfázového posuvného registru ………………………… 25

5. Závěr…………………………………………………………………. 27

6. Seznam literatury …………………………………. 28


2. Zavedení

Registry– nejběžnější součásti digitálních zařízení. Operují s mnoha souvisejícími proměnnými, které tvoří slovo. Se slovy se provádí řada operací: příjem, výdej, uložení, posun v bitové mřížce, bitové logické operace.

K posunu se používají posuvné (sekvenční) registry n-bitová čísla v jednom směru. Navíc je lze použít k posunu nečíselných informací.

Posuvné registry se používají jako paměťová zařízení, jako převodníky sériových na paralelní kódy, jako zpožďovací zařízení a čítače impulsů (použití posuvných registrů jako čítačů je však značně neekonomické).

3. Přehled literárních zdrojů

3.1. Obecné informace o registrech

Registry se skládají z bitových obvodů, které obsahují klopné obvody a nejčastěji i logické prvky. Působí jako jeden celek.

Podle počtu proměnných přenosových linek se registry dělí na jednofázové a parafázové a podle systému synchronizace na jednocyklové, push-pull a vícecyklové. Hlavním klasifikačním znakem je však způsob příjmu a výdeje dat. Na tomto základě rozlišují paralelní (statický) registry, sekvenční (posunující se) A paralelně-sériový .

V paralelních registrech jsou slova přijímána a vydávána ve všech bitech současně. Ukládají slova, která lze podrobit bitovým logickým transformacím.

V sekvenčních registrech se slova přijímají a vydávají číslici po číslici. Říká se jim posouvání, protože časovací signály při vstupu a výstupu slov je posouvají v bitové mřížce. Posuvný registr může být nevratný (s jednosměrnými posuvy) nebo reverzibilní (se schopností posuvu v obou směrech).

Sériově-paralelní registry mají vstupy a výstupy sériového i paralelního typu. K dispozici jsou možnosti se sériovým vstupem a paralelním výstupem (SIPO, Serial Input – Parallel Output), paralelním vstupem a sériovým výstupem (PISO, Parallel Input – Serial Output) a také možnosti s možností libovolné kombinace způsobů příjmu a výdeje slova.

V paralelních (statických) registrech mezi sebou bitové obvody nekomunikují. Společné pro bity jsou obvykle obvody hodin, obvody reset/nastavení, výstupní nebo přijímací povolení, tedy řídicí obvody. Příklad obvodu statického registru postaveného na klopných obvodech typu D s přímými dynamickými vstupy, které mají resetovací vstupy R a výstupy třetího stavu řízené signálem EZ, je znázorněn na Obrázek 1 .

Obrázek 1 Schéma statického registru (a) a jeho konvenční grafické označení (b)

Moderní obvodová technika se vyznačuje konstrukcí registrů na klopných obvodech typu D, převážně s dynamickým řízením. Mnohé mají výstupy s třetím stavem. Některé registry jsou klasifikovány jako vyrovnávací registry, to znamená, že jsou navrženy pro práci s velkými kapacitními a/nebo nízkoodporovými aktivními zátěžemi. Tím je zajištěn jejich provoz přímo na dálnici (bez dalších obvodů rozhraní).

Statické registry se používají k vytváření bloků paměti registrů – souborů registrů.

Hlavní funkce registrů:

1) úložiště informací,

2) Příjem informací,

3) Poskytování informací,

4) Informační posun,

5) Převod kódu,

6) Nastavení požadovaného čísla na nulu nebo jedničku,

7) Bitové logické operace: disjunkce, konjunkce, sčítání modulo 2.

3.2. Pochopení spouštěčů

Spouštěče – velká třída elektrických zařízení, která mu umožňují setrvat v jednom ze dvou (nebo více) stabilních stavů po dlouhou dobu a střídat je pod vlivem vnějších signálů (díky regeneračnímu procesu (přechodový proces v elektrickém obvodu pokrytém OBRÁZEK)).

Spouštěč je pulzní logické zařízení s pamětí (paměťový prvek – západka).

Existuje více než tucet různých integrálních spouštěčů. Jejich klasifikace je založena na:

Funkční znak

Metoda zápisu informací do spouštěče.

Na základě funkčních charakteristik se rozlišují spouštěče T, JK, RS, D, kombinované spouště (TV, DV, E, R) atd.

Podle způsobu záznamu (příjem) informací se rozlišují:

8) Asynchronní spouštěče:

a) s vnitřním zpožděním;

b) řízena úrovní vstupního impulsu;

9) Synchronní spouštěče (taktované):

a) s vnitřním zpožděním;

b) řízena úrovní časovacího impulsu:

Jednocyklové působení (jednostupňové);

Vícenásobná akce.

Informace se zapisují do taktovaných spouštěčů pouze tehdy, když je aplikován aktivační hodinový impuls. Takové spouštěče se dělí na úroveň řízené (pro činnost je nutná určitá úroveň signálu) a hranové řízené (nezávisí na úrovni signálu, důležitá je jeho přítomnost) časovacího impulsu. Hodinové impulsy se někdy také nazývají synchronizační, výkonné nebo povelové signály (obvykle se ve schématech označují písmenem C - Clock).

Dynamický vstup může být přímý nebo inverzní. Přímé dynamické řízení umožňuje přepínání při změně hodinového signálu z nuly na jedničku (). Inverzní dynamické řízení - změna hodinového signálu z jedné na nulu (). Řízení hrany časovacího impulsu: Řízení poklesu časovacího impulsu: Řízení horní úrovně časovacího impulsu:

Ovládání spodní úrovně časovacího impulsu:

Taktované spouštěče s vnitřním zpožděním (spouštěné po skončení signálu) jsou zpravidla jednokoncové. Vícecyklový spouští palbu po n- nogo impuls.

Spouštěč RS má dva informační vstupy: S (Set) a R (Reset). Současná aplikace signálů S a R není povolena. Na Obrázek 2 ukazuje synchronní spouštění RS spouštěné hranou časovacího signálu.

Obrázek 2 Synchronní RS spoušť

Nejjednodušší spouštěč RS má kromě vstupů také dva výstupy. Výstupy indikují Q A

. Výstup Q nazývaný přímý, a - inverzní. Úrovně napětí na obou výstupech jsou vzájemně inverzní: pokud je signál Q= 1, pak = 0, nebo pokud Q= 0, pak = 1. Je třeba také poznamenat, že stav spouště, ve kterém Q= 1, a = 0, se nazývá jednotka. Když je spoušť nula Q= 0 a = 1. Když signály dorazí na vstupy spouště, v závislosti na jejím stavu dojde buď k přepnutí, nebo se zachová původní stav.

Obrázek 3. - spoušť: její konvenční grafické označení a obvod se dvěma logickými prvky AND-NOT

Posunový registr- jedná se o sadu postupně zapojených spouštěčů (obvykle jich je 8). Na rozdíl od standardních registrů posuvné registry podporují funkce posuvu doprava a doleva. (tj. přepisování dat z každého předchozího spouštěče na další).

Funkčnost a účel posuvných registrů je poměrně velký. Dnes jeden z nich představíme Arduinu (Skvělý způsob, jak znásobit výstupy z Arduina: půjčte si 3, získejte 8).

Pravděpodobně nejoblíbenější mikroobvod, který představuje takový registr, je 74HC595.

Funguje na rozhraní SPI: nohy DS, ST_CP, SH_CP jsou řídicí sběrnice. Podle toho: datová sběrnice (MOSI), západka (SS) a hodinová linka (SCK). Připojíme na libovolné 3 piny Arduina (v kódu nebude použita knihovna SPI). Pro mě je to 12, 10, 13 výstupů Arduino (standard).

Nohy Q0, Q1, ..., Q7 jsou výstupy registru (bity). Abychom mohli sledovat stav každého z nich, zavěsíme na každou svorku LED (s rezistorem zapojeným do série. Jmenovitá hodnota od 150 do 330 Ohmů)

VCC a GND jsou napájecí zdroje. Připojte k +5V a GND.

Nedotýkáme se výstupu Q7` (určeného pro sériové připojení takových registrů)

MR je reset. Připojte k +5v (reset není aktivní).

No, přitáhneme OE k zemi (připojíme ke kontaktu GND).

Ukázalo se, že toto je schéma:

Můžete jej umístit na BreadBoard takto:

Nyní ke kódu:

Jak bylo uvedeno dříve, knihovna SPI nebude použita. Existuje pohodlná funkce shiftOut() .

Nejprve pojmenujeme naše piny (hodinová čára - hodiny, data - data, západka - západka):

#definovat hodiny 13 #definovat data 12 #definovat západku 10

pak je v void setup() označíme jako výstupy a okamžitě nastavíme latch na vysokou úroveň, aby registr nepřijímal signály:

Void setup())( pinMode(hodiny, OUTPUT); pinMode(data, OUTPUT); pinMode(latch, OUTPUT); digitalWrite(latch, HIGH); )

teď zkusíme něco poslat do registru:

Nejprve nastavte LOW na západce (zahájíme přenos dat. Nyní registr přijímá signály z Arduina).

DigitalWrite(latch, LOW);

Poté odešleme data (to znamená, že pošleme bajt v digitální nebo binární podobě. V binární podobě je to jednodušší, protože každý z 8 bitů je zodpovědný za svůj vlastní bit v registru. Je snazší se orientovat očima):

Nejprve odešleme bajt 0b10000000; (první LED by se měla rozsvítit):

ShiftOut(data, hodiny, LSBFIRST,0b10000000);

A na konci nastavíme latch na HIGH (dokončíme přenos dat).

DigitalWrite(latch, HIGH);

Výsledkem je, že celý náš kód:

#define clock 13 #define data 12 #define latch 10 void setup() ( pinMode(hodiny, OUTPUT); pinMode(data, OUTPUT); pinMode(latch, OUTPUT); digitalWrite(latch, HIGH); ) void loop() ( digitalWrite(latch, LOW); shiftOut(data, hodiny, LSBFIRST, 0b10000000); digitalWrite(latch, HIGH); )

Nyní jej načteme do Arduina. Výsledek by měl být takový (rozsvítí se první LED):

(pokud nesvítí první, ale poslední LED, pak ve funkci shiftOut změňte LSBFIRST na MSBFIRST a vše zapadne na své místo).

Tak to se povedlo! Navrhuji vytvořit funkci, abych tyto 3 ŘÁDKY nepsal pokaždé:

Nazvu to: sendbyte;

Void sendbyte(byte value)( digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH); )

Tato funkce posílá do registru stav všech bitů najednou. To se bude hodit např. Chcete-li však použít registr jako expandér portů, musíte ovládat každý bit samostatně (podobně jako funkce digitalWrite()):

Do registru můžeme poslat pouze celé bajty (8 bitů - 0b00000000). Pokud nepošlete 8, ale 5 bitů (například: 0b00000 000), pak registr počká na chybějící 3 bity. To znamená, že když chceme změnit stav jednoho bitu registru (zapnout nebo vypnout), musíme ve skutečnosti odeslat dříve odeslaný bajt se změnou jednoho bitu.

(P.S.: Teď je tu dlouhé a zdlouhavé vysvětlování (pro začátečníky), koho to nezajímá, slezte o něco níž :);

Nejprve si tedy vytvoříme tzv. (mnou) databázi, která bude ukládat stav každého bitu (zapnuto (HIGH) nebo vypnuto (LOW)). typ: booleovský:

Booleovské stavy;

Každá proměnná v tomto poli označuje svou vlastní číslici (nula (počítání) uloží stav 1. číslice, druhé - 3. atd.)

Nyní napíšeme funkci (budu jí říkat: sendpin). Bude to mít 2 hodnoty: číslo číslice a úroveň, kterou musíme této číslici přiřadit: vysoká (HIGH) nebo nízká (LOW).

Void sendpin(int pin, booleovský stav)( pin--; stavy=stav; hodnota bajtu = 0; přidání bajtu = 1; for(int i=0; i<8; i++){ if(states[i]==HIGH) value+=add; add*=2; } digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH); }

Vzhledem k tomu, že počítání začíná od nuly, budeme muset první pin volat nula. Abych to napravil (napíšeme to tak, jak to je (první znamená první) a samotné Arduino jich zapíše více), napsal jsem:

Poté označíme změny v databázi:

Státy=stát;

Nyní potřebujeme vytvořit bajt z 8 bitů a poslat jej do registru.

Nejprve vytvoříme proměnné:

hodnota je bajt, který odešleme. (ve výchozím nastavení by mělo být nastaveno na nulu):

Hodnota bajtu = 0;

add je proměnná, která uloží bajt aktuální číslice. pro první bit je to byte 1 (0b10000000);

Byte add = 1;

Nyní musíme procházet všemi 8 proměnnými v databázi a vytvořit bajt (uděláme to pomocí cyklu for():

For(int i=0; i<8; i++){ }

Pokaždé tedy zkontrolujeme další číslici v databázi. Pokud by měla mít vysokou úroveň, pak přidáme k hodnotě a přesuneme se na další číslici v řetězci (jako bychom se posunuli o jednu číslici výše (doleva). To znamená, že v binárním kódu je vše jednoduché: bylo takhle: 0b01000000 posunuto doleva a dopadlo to takto: 0b10000000 Ale v digitální podobě je všechno jiné jako násobení 2 (a mimochodem doprava je dělení. od 2)). Ukazuje se něco takového:

If(stavy[i]==VYSOKÉ) hodnota+=přidat; add*=2;

Nyní zbývá pouze odeslat hodnotu do registru:

DigitalWrite(latch, LOW); shiftOut(data, hodiny, LSBFIRST, hodnota); digitalWrite(latch, HIGH);

V zásadě, pokud rozumíte, je vše velmi jednoduché.

Zkusme tedy zapnout 2, 4, 6 a 8 číslic samostatně (naši funkci napíšeme 4krát ve smyčce):

Sendpin(2, VYSOKÝ); sendpin(4, VYSOKÝ); sendpin(6, VYSOKÝ); sendpin(8, VYSOKÝ);

A mimochodem, v setup-e je potřeba vymazat registr (poslat 0).

Můžete dokonce vytvořit funkci jako je tato:

Void cleanreg())( for(int i=0; i<8; i++) states[i]=LOW; digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, 0); digitalWrite(latch, HIGH); }

Obecně je výsledkem:

Seznam radioprvků

Označení Typ Označení Množství PoznámkaNakupovatMůj poznámkový blok
Deska Arduino

Arduino Uno

1

V určitém okamžiku nevyhnutelně narazíte na problém, že na svém Arduinu nemáte dostatek pinů, aby vyhovovaly potřebám vašeho projektu nebo prototypu. Řešení tohoto problému? Posuvný registr, nebo spíše posuvný registr Arduino 74hc595.

Každý, kdo dělal projekty Arduino, kde používají hodně LED, si uvědomil, že jsou do značné míry omezeni piny Arduina a nemohou vytvářet obrovské projekty, které vyžadují velký počet pinů. V našem konkrétním projektu je 16 LED řízeno pouze třemi piny Arduino. Klíčovým prvkem je posuvný registr Arduino 74hc595. Každý posuvný registr 74HC595 pojme až 8 LED a pomocí sekvenčních řetězců registrů můžete zvýšit počet kontaktů desky z konvenčních 3 na nekonečný počet.

Než začneme připojovat čip, podívejme se, jak proces funguje.

První věc, kterou je třeba objasnit, je koncept „bitů“ pro ty z vás, kteří nejsou obeznámeni s binárním kódem. Když mluvíme o „bitech“, máme na mysli jedno z čísel, které tvoří binární hodnotu. Na rozdíl od běžných čísel obvykle považujeme první bit za největší. Pokud tedy vezmeme binární hodnotu 10100010, první bit je ve skutečnosti 0 a osmý bit je 1. Je třeba také poznamenat, že pokud to nebylo implikováno, každý bit může být pouze 0 nebo 1.

Čip obsahuje osm pinů, které můžeme použít pro výstup, z nichž každý je spojen s bitem v registru. V případě posuvného registru 74HC595 se na ně podíváme od QA po QH.

Pro zápis těchto výstupů přes Arduino musíme poslat binární hodnotu do posuvného registru a z tohoto čísla posuvný registr může určit, které výstupy použít. Pokud jsme například odeslali binární hodnotu 10100010, kontakty zvýrazněné zeleně na obrázku výše budou aktivní a ty červeně zvýrazněné neaktivní.

To znamená, že bit zcela vpravo je mapován na QH a bit zcela vlevo je mapován na QA. Výstup je považován za aktivní, když je s ním spojený bit nastaven na 1. Je důležité si to zapamatovat, protože jinak budete mít velmi těžké vědět, které piny používáte.

Nyní, když máme základní znalosti o tom, jak používáme bitový offset k určení, které piny použít, můžeme jej začít připojovat k našemu Arduinu.

Začínáme s 8 LED diodami

Pro první část lekce budeme potřebovat následující komponenty:

  • Arduino Uno
  • Vývojová deska
  • Posuvný registr Arduino 74HC595
  • 8 LED diod
  • 8 rezistorů - 220 ohmů by mělo stačit
  • Dráty/propojky

Začněte umístěním posuvného registru na své rozvržení a ujistěte se, že každá strana je na samostatné straně rozvržení, jak je znázorněno níže.

S nápisem nahoru, kolíky 1-8 na levé straně shora dolů a 16-9 na pravé straně shora dolů, jak je znázorněno na obrázku níže.

Sestavení obvodu

Nejprve připojte piny 16 (VCC) a 10 (SRCLR) k 5v výstupu na Arduinu a připojte piny 8 (GND) a 13 (OE) k pinu Gnd na Arduinu. Pin 13 (OE) se používá k povolení výstupů, protože je to aktivní nízký pin, který můžeme připojit přímo k zemi.

Dále musíme připojit tři piny, které budeme používat k ovládání posuvného registru:

  • Pin 11 (SRCLK) posuvného registru 74HC595 na pin 11 na Arduinu – tomu se bude říkat „synchronizační pin“
  • Pin 12 (RCLK) posuvného registru ke kolíku 12 na Arduinu – toto bude označováno jako „západkový kolík“
  • Pin 14 (SER) posuvného registru na pin 13 na Arduinu – tomu se bude říkat „datový pin“

Všechny tři tyto piny se používají k provádění bitového posunu zmíněného dříve v tomto návodu. Naštěstí Arduino poskytuje pomocnou funkci speciálně pro posuvné registry s názvem shiftOut, která za nás zvládne téměř vše, ale k tomu se ještě vrátíme, až se podíváme na kód.

Nyní stačí připojit všechny výstupní kolíky k našim LED diodám a zajistit, aby byl před LED umístěn odpor pro snížení proudu a že katody LED směřovaly k zemi.

Abychom minimalizovali změť drátů, umístili jsme rezistory a LED na samostatné prkénko na krájení, ale můžete použít i jeden prkénko na krájení.

Při umísťování LED se ujistěte, že jsou zapojeny v pořadí, aby QA byla připojena k první LED a QH k poslední LED, jinak náš kód nerozsvítí LED ve správném pořadí. Až budete hotovi, měli byste mít něco takového:

Skica pro Arduino

Nyní jsme připraveni nahrát kód. Připojte své Arduino k počítači a stáhněte si do něj následující skicu pro 74hc595 Arduino:

Int latchPin = 12; int clockPin = 11; int dataPin = 13; byte LED = 0; int currentLED = 0; void setup() ( pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); LED = 0; ) void loop() ( LED = 0; if (currentLED == 7) ( currentLED = 0; else ( currentLED++; ) bitSet(leds, currentLED); shiftOut(dataPin, clockPin, led);

Nejprve definujme následující v horní části náčrtu:

  • Umístění pinů: synchronizátor, západka a data
  • Bajt, který bude ukládat bity, které říkají posuvnému registru, který pin má použít
  • Proměnná, která nám bude hlídat, jakou LEDku máme rozsvítit

V metodě nastavení jednoduše inicializujeme režimy pinů a proměnnou LED.

V metodě smyčka(smyčka) vymažeme bity v proměnné LED diody na začátku každé iterace, takže všechny bity jsou nastaveny na 0, protože chceme rozsvítit pouze jednu LED najednou. Poté inkrementujeme nebo restartujeme aktuální proměnnou aktuální LED poté znovu rozsviťte správnou LED.

Po těchto dvou operacích přejdeme k důležitější části – bitovému posunu. Nejprve začneme voláním metody bitSet. Přejdeme k metodě bitSet bajt, který ukládá bity, a proměnnou aktuální LED.

Tato metoda nám umožňuje nastavit jednotlivé bity bytu určením jejich pozice. Například pokud chceme ručně nastavit bajt na 10010 , mohli bychom použít následující volání, protože bity, které potřebujeme nastavit na 1, jsou druhý zprava (což je pozice 1, když začínáme na pozici 0) a pátý zprava, který je na pozici 4:

BitSet(leds, 1); bitSet(leds, 4);

Takže pokaždé, když inkrementujeme aktuální proměnnou aktuální LED a předat to metodě bitSet, nastavíme bit nalevo od předchozího pokaždé na 1 a řekneme tak posuvnému registru, aby aktivoval výstup nalevo od předchozího.

Po nastavení bitů zapíšeme na latch pin, abychom posuvnému registru oznámili, že do něj budeme posílat data. Jakmile to uděláme, zavoláme metodu vyřadit, což je Arduino. Tato metoda je navržena speciálně pro použití posuvných registrů a umožňuje jednoduše posouvat bity v jediném volání. Za tímto účelem předáme data a synchronizaci jako první dva parametry a poté předáme konstantu LSBFIRST což metodě říká, že první bit by měl být nejméně významný bit, a pak procházíme bajtem obsahujícím bity, které skutečně chceme přesunout, do posuvného registru.

Jakmile dokončíme posouvání bitů, znovu přistoupíme k západkovému kolíku (tentokrát pomocí HIGH), abychom indikovali, že jsme odeslali všechna data. Jakmile je operace zápisu dokončena, příslušná LED se rozsvítí a poté se zpozdí o 250 milisekund, než se bude opakovat.

16 LED diod

Nyní přejdeme ke složitějšímu obvodu využívajícímu 74hc595 Arduino pro 16 LED.

Podrobnosti

Celkově vzato, v tomto případě zdvojnásobíme počet všech komponent, samozřejmě kromě Arduino Uno:

  • Arduino UNO (x1)
  • Posuvný registr 74HC595 (2x)
  • LED diody (16x)
  • odpory 220 ohmů (16x)
  • Dráty/propojky
  • Dvě vývojové desky (jedna se 400 piny, druhá s 830 piny)
  • Potenciometr pro ovládání jasu (volitelné)

Schéma zapojení

Schéma zapojení je již větší než u 8 LED a jednoho posuvného registru 74HC595.

Sestavte obvod jako na obrázku výše a připojte první posuvný registr následovně:

  • GND (pin 8) k zemi
  • Vcc (pin 16) - 5V
  • OE (pin 13) k zemi (GND)
  • MR (pin 10) - 5 V
  • DS (pin 14) - pin 11 Arduina
  • SH_CP (pin 11) na Arduino pin 12
  • ST_CP (pin 12) na pin 8 Arduina

Druhý posuvný registr připojte stejným způsobem, ale připojte DS (vývod 14) k prvnímu vývodu 9 registru. Poté připojte piny 1, 2, 3, 4, 5, 6, 7 a 15 z registrů a LED. Díky tomuto připojení jsou všechny piny vždy aktivní a adresovatelné, ale když zapnete Arduino, některé LED se mohou rozsvítit. Řešením je připojit MR (pin 10) a OE (pin 13) přímo k Arduinu, ale tímto způsobem musíte obětovat 2 piny arduina.

Chcete-li přidat další posuvné registry, spojte je dohromady jako druhý registr. Vždy připojte piny MR a OE přímo k pinu Arduino a pin DS k předchozímu registru. Pokud chcete upravit jas LED diod, připojte prosím potenciometr, jak je znázorněno na obrázku výše, abyste mohli ovládat odpor pro všechny LED. To je však volitelné a obejdete se bez něj.

Skica pro Arduino

Varianty náčrtu jsou obvykle navrženy pro omezený počet posuvných registrů, protože Univerzální funkce/metoda na to neexistuje. Níže uvedený kód byl přepracován tak, abyste mohli používat neomezený počet posuvných registrů:

int latchPin = 8; int clockPin = 12; int dataPin = 11; int numOfRegisters = 2; byte* registerState; long effectId = 0; long prevEffect = 0; dlouhý efektOpakovat = 0; dlouhý účinek Rychlost = 30; void setup() ( //Inicializace stavu registru pole = nový bajt; for (size_t i = 0; i< numOfRegisters; i++) { registerState[i] = 0; } //set pins to output so you can control the shift register pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { do{ effectId = random(6); } while (effectId == prevEffect); prevEffect = effectId; switch (effectId) { case 0: effectRepeat = random(1, 2); break; case 1: effectRepeat = random(1, 2); break; case 3: effectRepeat = random(1, 5); break; case 4: effectRepeat = random(1, 2); break; case 5: effectRepeat = random(1, 2); break; } for (int i = 0; i < effectRepeat; i++) { effectSpeed = random(10, 90); switch (effectId) { case 0: effectA(effectSpeed); break; case 1: effectB(effectSpeed); break; case 3: effectC(effectSpeed); break; case 4: effectD(effectSpeed); break; case 6: effectE(effectSpeed); break; } } } void effectA(int speed){ for (int i = 0; i < 16; i++){ for (int k = i; k < 16; k++){ regWrite(k, HIGH); delay(speed); regWrite(k, LOW); } regWrite(i, HIGH); } } void effectB(int speed){ for (int i = 15; i > < i; k++){ regWrite(k, HIGH); delay(speed); regWrite(k, LOW); } regWrite(i, HIGH); } } void effectC(int speed){ int prevI = 0; for (int i = 0; i < 16; i++){ regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(speed); } for (int i = 15; i >= 0; i--)( regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(speed); ) ) void effectD(int speed)( for (int i = 0; i< 8; i++){ for (int k = i; k < 8; k++) { regWrite(k, HIGH); regWrite(15 - k, HIGH); delay(speed); regWrite(k, LOW); regWrite(15 - k, LOW); } regWrite(i, HIGH); regWrite(15 - i, HIGH); } } void effectE(int speed){ for (int i = 7; i >= 0; i--)( for (int k = 0; k<= i; k++) { regWrite(k, HIGH); regWrite(15 - k, HIGH); delay(speed); regWrite(k, LOW); regWrite(15 - k, LOW); } regWrite(i, HIGH); regWrite(15 - i, HIGH); } } void regWrite(int pin, bool state){ //Determines register int reg = pin / 8; //Determines pin for actual register int actualPin = pin - (8 * reg); //Begin session digitalWrite(latchPin, LOW); for (int i = 0; i < numOfRegisters; i++){ //Get actual states for register byte* states = ®isterState[i]; //Update state if (i == reg){ bitWrite(*states, actualPin, state); } //Write shiftOut(dataPin, clockPin, MSBFIRST, *states); } //End session digitalWrite(latchPin, HIGH); }

Kód přidává několik efektů pro těchto 16 LED. Pokud chcete přidat další LED, připojte více posuvných registrů jako výše a změňte hodnotu numOfRegisters v kódu.

Tento kód můžete také použít pro více než jen LED, pokud potřebujete více pinů pro vaše Arduino, použijte funkci regWrite (int pin, bool state) k zápisu stavu libovolného pinu. Počet posuvných registrů, které používáte, není omezen, stačí změnit hodnotu numOfRegisters a zbytek je již automatizován.

Tato recenze je ve skutečnosti věnována začínajícím uživatelům Arduina nebo těm, kteří se chtějí zapojit do tohoto podnikání. Budeme se bavit o zvýšení počtu výstupů mikrokontroléru pomocí posuvného registru, a to nevyžaduje velké výdaje (ve srovnání například s nákupem Arduina Mega). Nejjednodušší aplikací je blikání LED diod, tak si to vyzkoušíme v praxi.

Když jsem se začal seznamovat s mikrokontroléry (v podstatě stále pokračuji v „seznamování“), jedna z prvních otázek byla: jak můžete ovládat stejných sto tisíc LED s pouhým tuctem výstupů na ovladači? Ano, můžete použít multiplexování signálu, protizapojení a mnoho dalších triků, ale přesto je maximální počet připojených LED omezen a je nutné hledat jiné řešení. A navrhli mi jednu z možností – „vezmi si jeden, dva, deset čipů posuvného registru a bav se“. Bylo rozhodnuto je okamžitě objednat a v budoucnu z nich dokonce sestavit LED kostku. To druhé jsem opravdu musel opustit, našel jsem jednodušší možnost, ale to je téma jiné recenze.
Objednal jsem 20 kusů 74HC595N najednou, naštěstí stály pouhé haléře. Písmeno N na konci označení znamená, že mikroobvod je v balení DIP-16, což je velmi výhodné pro experimenty na prkénku, nemusíte ani nic pájet; Vypadá to takto:




Co je to za mikroobvod? Jedná se o osmibitový posuvný registr typu sériový vstup, sériový výstup nebo paralelní výstup se západkovým klopným obvodem a třístavovým výstupem.
Jednoduše řečeno, pomocí pouhých 3 výstupů ovladače můžete ovládat 8 výstupů posuvného registru. A pokud jsou mikroobvody zapojeny sériově za sebou, tak lze počet řízených výstupů navýšit na libovolnou rozumnou mez (maximální počet jsem nenašel, ale stovky se zdají být bez problémů zkombinované; pokud někdo ví, jaký je max. počet mikroobvodů zahrnutých v kaskádě závisí na, bylo by zajímavé zjistit v komentářích).
Data jsou přenášena na čip sériově. Bity 0 a 1 jsou do registru přenášeny jeden po druhém, bity jsou čteny při příchodu hodinového impulsu. Vysílaných 8 bitů - přijatých 8 výstupních stavů na výstupech registru. Při kaskádovém zapojení 74HC595 (pokud je požadováno 16, 24 atd. výstupů) se data z prvního registru přenesou do dalšího.
Výstup registru může být nejen ve stavu logické 0 nebo 1, ale může být také ve stavu vysoké impedance, když je výstup odpojen od obvodu. Do tohoto stavu lze najednou převést pouze všechny výstupy. To se používá zřídka, ale může být užitečné například při přepínání řízení na jiný ovladač.

Vstupní/výstupní pinout

Q0…Q7 – výstupy registru, mohou být ve stavu 0, 1 nebo vysoké impedanci
GND – zem
Q7′ – výstup pro sériové připojení registrů.
MR – reset registru
SH_CP – hodinový vstup
ST_CP – datový latching vstup
OE – vstup převádějící výstupy z vysoké impedance do provozního stavu
DS – zadávání dat
VCC – napájení 2-6 voltů

Zbývá jen zkontrolovat práci, abychom to udělali, sestavíme obvod, který je oblíbený mezi začátečníky. GND (pin 8) je připojen k zemi, Vcc (pin 16) k napájení 5V, OE (pin 13) k zemi, MR (pin 10) k napájení 5V. Posuvný registr je nyní napájen a všechny výstupy jsou aktivní. Nyní je čas připojit mikroobvod k Arduinu: připojte datový vstup DS (pin 14) k 9. digitálnímu výstupu Arduina, vstup hodin SH_CP (pin 11) k 10. digitálnímu výstupu, vstup ST_CP latch (pin 12 ) na 8. pin Arduino. Pro minimalizaci šumu se doporučuje umístit mezi zem a západku kondenzátor 0,1 µF.
Zbývá připojit LED - přes odpory 150-300 Ohm je připojíme z výstupů registru k zemi. To je vše. Zde je schéma, které jsem našel pro ty, kteří mají rádi vizuální materiály (všimněte si prosím, že pinout skutečného mikroobvodu a schematický obrázek na tomto schématu se liší!)


Sestavil jsem obvod na prkénku a dopadlo to takto.

sestavený obvod








V Arduinu je vhodné použít funkci shiftOut(), která postupně (bit po bitu) vydává bajt informace na vstupní/výstupní port. . Načteme testovací kód do Arduina a získáme čítač od 0 do 255 v binární podobě:
int latchPin = 8; //ST_CP int clockPin = 10; //SH_CP int dataPin = 9; //DS void setup() ( pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); ) void loop() ( for (int numberToDisplay = 0; numberToDisplay< 256; numberToDisplay++) { // установка синхронизации "защелки" на LOW digitalWrite(latchPin, LOW); // передаем последовательно на вход данных shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); //"защелкиваем" регистр, устанавливаем значения на выходах digitalWrite(latchPin, HIGH); delay(500); } }
U mě se to stalo takto, vše funguje podle očekávání:


S minimálním využitím pinů ovladače tedy můžete ovládat velké množství LED (nebo něco jiného). Všechno by bylo v pořádku, ale také vám řeknu o nedostatcích. Jak vidíte, proud pro každou LED musí být omezen rezistorem a při sestavování velkých LED matic je to značně pracné. Pro ovládání LED existuje zajímavější řešení - driver DM13A, který je posuvným registrem a navíc omezuje proud na každém výstupu. O tom vám povím příště a jako bonus - moje úplně první LED kostka, 5x5x5, sestavená na základně zjednodušených prvků, bez použití 74HC595.

Mám v plánu koupit +37 Přidat k oblíbeným Recenze se mi líbila +35 +61