Port bővítés Shift regiszterrel

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00
Tartózkodási hely: Budapest

Port bővítés Shift regiszterrel

HozzászólásSzerző: Bence » 2010. április 9. péntek, 21:09

Sziasztok!

Írtam két egyszerű programot 74HC165 és 74HC595-ös 8 bit-es shift regiszterhez. Gondoltam, megosztom veletek, hátha valakinek szüksége lesz rá!

A 74HC165 egy párhuzamos bemenetű, soros kimenetű shift regiszter. A másik soros bemenetű, párhuzamos kimenetű. Így a 74HC165-ös bemenet bővítésre, a 74HC595-ös kimenet bővítésre jó.

Ami jó bennük, hogy az AVR-ből 3 lábat foglalnak el és 8 lábat adnak. Ha 2-t teszünk belőle, akkor is csak 3 láb kell, szóval 3 lábra szinte akármennyi felfűzhető.

A program a 74HC165-höz (bemenet bővítés):

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 16000000
$baud = 38400


Load_out Alias Portc.0                                      'Összes 74HC165 1-es lába
Clock_out Alias Portc.1                                     'Összes 74HC165 2-es lába
Data_in Alias Pinc.2                                        'Első 74HC165 9-es lába

'A második IC 9-es lábát az első IC 10-es lábára kell kötni.
'A harmadik IC 9-es lábát a második IC 10-es lábára, stb...
'További lábak:
'11-14 (D0-D3) és 3-6 (D4-D7) bemenetek
'7 (/Q7): üres, 8 (GND): föld, 15 (/CE): föld, 16 (VCC): +5V

Config Load_out = Output
Config Clock_out = Output
Config Data_in = Input

Dim Ic1 As Byte
Dim Ic2 As Byte
Dim Ic3 As Byte

Set Clock_out
Set Load_out


Ic1 = 0
Ic2 = 0
Ic3 = 0

Print "Start"

Do

  Reset Load_out                                            'Betöltjük a regiszterbe a 8 bemenet értékét
  Set Load_out                                              'Visszaállítjuk alaphelyzetbe
  Shiftin Data_in , Clock_out , Ic1 , 0                     'Első IC beolvasása
  Shiftin Data_in , Clock_out , Ic2 , 0                     'Második IC beolvasása
  Shiftin Data_in , Clock_out , Ic3 , 0                     'Harmadik IC beolvasása
  'Annyiszor kell a Shiftin rész, ahány IC van

  'Kiírás UART-on IC-nként egybe:
  Print "IC1: " ; Bin(ic1)
  Print "IC2: " ; Bin(ic2)
  Print "IC3: " ; Bin(ic3)

  'Vagy lábanként külön:
  Print "IC1.0: " ; Ic1.0
  Print "IC1.1: " ; Ic1.1
  Print "IC1.2: " ; Ic1.2
  'stb...
  'így szinte ugyanúgy lehet használni, mint egy portot az AVR-en
Loop

End



Program a 74HC595-höz (kimenet bővítés):

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 16000000
$baud = 38400


Clock_out Alias Portc.0                                     'Összes 74HC595 11-es lába
Latch_out Alias Portc.1                                     'Összes 74HC595 12-es lába
Data_out Alias Portc.2                                      'Első 74HC595 14-es lába

'A második IC 14-es lábát az első IC 9-es lábára kell kötni.
'A harmadik IC 14-es lábát a második IC 9-es lábára kell kötni, stb...
'További lábak bekötése:
'15 (Q0) és 1-7 (Q1-Q7): kimenetek
'8 (GND): föld, 10 (/MR): +5V, 13 (/OE): földre, 16 (VCC): +5V

Config Clock_out = Output
Config Latch_out = Output
Config Data_out = Output


Dim Ic1 As Byte
Dim Ic2 As Byte
Dim Ic3 As Byte

Set Clock_out
Reset Latch_out


Ic1 = 0
Ic2 = 0
Ic3 = 0

Print "Start"

Do
  Input "Ic1: " , Ic1
  Input "Ic2: " , Ic2
  Input "Ic3: " , Ic3


  Shiftout Data_out , Clock_out , Ic1 , 0                   'Első IC feltötltése
  Shiftout Data_out , Clock_out , Ic2 , 0                   'Második IC feltöltése
  Shiftout Data_out , Clock_out , Ic3 , 0                   'Harmadik IC feltöltése
  'Annyiszor kell a Shiftout rész ahány IC van.
  Set Latch_out                                             'Ez azért kell hogy az IC lábain "kiírja" amit az előbb betöltöttünk
  Reset Latch_out
Loop


End


Szerkesztés: Most már tudom, hogy nem szükséges a /MR lábat (10-es láb) az AVR-re kötni a 74HC595-ön, ezt a +5V-ra kell kötni.
Szerk. 2.: Néhány apró módosítás. + Ha a 74HC595 13-as ( /OE ) lábát PWM-el vezéreljük (kimenetek alacsony szinten aktívak), akkor az 595-re kötött LED-ek fényerejét tudjuk állítani!
A hozzászólást 2 alkalommal szerkesztették, utoljára Bence 2014. április 26. szombat, 11:23-kor.
Bence

Avatar
SirLeslie
Pákabűvész
Hozzászólások: 247
Csatlakozott: 2005. április 14. csütörtök, 6:00
Tartózkodási hely: Zalaegerszeg
Kapcsolat:

Re: Port bővítés Shift regiszterrel

HozzászólásSzerző: SirLeslie » 2010. április 10. szombat, 6:40

Bence írta:Sziasztok!

Írtam két egyszerű programot 74HC165 és 74HC595-ös 8 bit-es shift regiszterhez. Gondoltam, megosztom veletek, hátha valakinek szüksége lesz rá!...


Köszönjük szépen, már régóta gondolkodtam rajta én is, de idő hiányában még nem került kivitelezésre.
Mégegyszer: köszönöm.

Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00
Tartózkodási hely: Budapest

Re: Port bővítés Shift regiszterrel

HozzászólásSzerző: Bence » 2010. április 10. szombat, 12:37

SirLeslie írta:
Köszönjük szépen, már régóta gondolkodtam rajta én is, de idő hiányában még nem került kivitelezésre.
Mégegyszer: köszönöm.


Szívesen! Örülök, hogy segíthettem!
Bence

Avatar
Allspark
Bitmanipulátor
Hozzászólások: 106
Csatlakozott: 2009. július 9. csütörtök, 6:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Allspark » 2011. január 16. vasárnap, 17:16

Hello

Nekem itthon 74HC164 regisztereim vannak. Ezzel is megoldható a portbővítés? Ahogy a kapcsolásokat néztem ugyanúgy működik csak itt az A B bemenetekre kell kötni a data szálat. Egyedül ez a "Latch" bemenet nincs rajta.
Ha jól értelmezem ez úgy működik hogy míg az új adatot töltöm rá addig az előző még aktív a kimeneteken és mikor magasra emelem betölti az újat a kemenetekre?
A 74HC164-en pedig ahogy töltöm rá már azonnal írja ki?
Ezt a kapcsolást néztem: http://frank.bol.ucla.edu/AVR2LCD.htm

Köszönöm.

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2011. január 16. vasárnap, 17:49

Pontosan. A jóöreg '164 csak hiftregiszter, nem tartalmaz kimeneti tárolókat. Amikor pl. LEDeket hajtanak vele, néha látszik, hogy felvillan az összes LED rövid időre (az átírás alatt).
A kimeneti tárolókat tartalmazóknál (régebben csak a CD4094 volt, ha jól emlékszem) egyszerre jelenik meg az új adat a kimeneteken. Kis trükkel a latch jelet is meg lehet spórolni ezeknél, szóval elég 2 madzag. nagyobb trükkel meg elég 1 :)
JAni

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2011. január 16. vasárnap, 17:51

Pontosan. A jóöreg '164 csak hiftregiszter, nem tartalmaz kimeneti tárolókat. Amikor pl. LEDeket hajtanak vele, néha látszik, hogy felvillan az összes LED rövid időre (az átírás alatt).
A kimeneti tárolókat tartalmazóknál (régebben csak a CD4094 volt, ha jól emlékszem) egyszerre jelenik meg az új adat a kimeneteken. Kis trükkel a latch jelet is meg lehet spórolni ezeknél, szóval elég 2 madzag. nagyobb trükkel meg elég 1 :)
JAni

Avatar
Allspark
Bitmanipulátor
Hozzászólások: 106
Csatlakozott: 2009. július 9. csütörtök, 6:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Allspark » 2011. január 16. vasárnap, 17:58

Nah ez szuper.

Azt az időt akkor megspórolom az 595-ön amíg ráírom az adatokat, mert ledeket szerenék én is meghajtani és amíg írom rá az újat addig is világít az előző adat. Míg a 164-nél ez kiesik ami rontja a fényerőt. Pláne ha pwm is lesz benne.

Mégvalami. Lesz belőle 5db. Tudok azzal időt spórolni ha mindegyikre rááldozok egy-egy data kimenetet az avr-en? Vagy ugyanott tartok ha sorba kötöm?

Köszönöm.

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2011. január 16. vasárnap, 18:07

Ha kvázi párhuzamosan vezérled a DATA bemeneteket, akkor mindig csak 8 órajel kell a teljes kivitelhez. No, akkor gondolkozzunk Béláim: Ezek nagysebességű regiszterek, tehát lehet neki lökni bátran az órajelet. Melyik lehet a hosszabb idő? SW szétválogatja az 5 kimenetre a különböző változókban tárolt biteket, kiteszi, vagy bírkanagy sebességgel kiviszed sorban az 5 változódat? Főleg mondjuk a hardver SPI segítségével, hipp-hopp.
Ezt ki kellene próbálnod.
De ha már ilyen széles (5) bittel dolgozol, lehet, elforgatva hipergyors lenne. Tehát van 8 változód, amiben nem bitsorrendben vannak a bitjeid, hanem a tömböd elforgatva. Ebben az esetben csak :
-byte ki egy portra
-orajel
-következő byte ki a portra
-órajel (8x) és kész is vagyunk.
JAni

Avatar
Allspark
Bitmanipulátor
Hozzászólások: 106
Csatlakozott: 2009. július 9. csütörtök, 6:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Allspark » 2011. január 16. vasárnap, 18:47

Ez az elforgatós dolog tényleg nagyon gyors lenne. Szerintem jó is lesz.
Köszönöm a segítséget.

Avatar
Allspark
Bitmanipulátor
Hozzászólások: 106
Csatlakozott: 2009. július 9. csütörtök, 6:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Allspark » 2011. február 12. szombat, 21:58

Üdv.

Akinek már volt dolga a 74HC595D-vel kérem ossza meg tapasztalatait mert én most elég sokat szívok velük.

Nem tudom miért de sorra mennek tönkre.

Bekötöttem 5-öt az előző hozzászólásaim alapján. Ledeket hajtok velük 5x8-at.

Közös az órajel a kapu és a törlés lábuk. A data szálakat az E port vezérli egy atmega64-en.

A jelenség az volt hogy az 5-ből 3 nem működött rendesen. A "Q0" ami a 15-ös lábon van -- a többi kimenettel ellentétben a másik oldalon -- nem akarta az igazságot. Mikor annak a lednek kellett volna égnie nem égett az egész sor.
Volt még itthon, kicseréltem azt a 3-at. Bekapcsolom és a középső működött csak. a 2. 4. sor megint nem. kicseréltem a 2.-at, az jó lett de erre már a 3. sem volt jó, pedig ahhoz hozzá sem nyúltam.
Mindig ugyanaz a hiba, a Q0 bezavarja az egészet.

Nem találok összefüggést, műszerrel minden jó nem ér össze semmi aminek nem kéne, minden eljut oda ahova kell.

Ennyire érzékeny lenne? Hőre 220 fokon forrasztottam. Direkt figyeltem hogy ne kapjon nagy meleget.

Egyedüli különbség hogy külön "egy" 150-es ellenálás van a led előtt, a többinél megy egy hálóellenálás.

Adatlap: http://pdf1.alldatasheet.com/datasheet-pdf/view/15647/PHILIPS/74HC595D.html

Köszönöm ha tud valaki segíteni.
Dávid

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2011. február 13. vasárnap, 9:11

Ha be van tartva a max 25mA-es áram, akkor bírnia kell.
Ilyen furcsa hibák főleg tápegység hibából szoktak lenni.
- Hamarabb kap bemenő jelet, mint tápfeszt
- a tápon gerjedés vagy nagy tüskék vannak (normál műszerrel jónak tűnik)
- nincsenek hidegítő kondenzátorok az IC-k tápjain

mindenesetre elég misztikusnak tűnik a hiba...
használtam relémeghajtásra ilyeneket, semmi bajom nem volt velük.

JAni

Avatar
Allspark
Bitmanipulátor
Hozzászólások: 106
Csatlakozott: 2009. július 9. csütörtök, 6:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Allspark » 2011. február 13. vasárnap, 11:10

25mA be van tartva. Hidegítő kondik nincsenek a lábakon azt fogok tenni. Lehet az a baja.

Viszont megtaláltam a megoldást. Az volt a gond hogy magas állapotba volt a data szál miközben magasra húztam a latch szálat és kiírásra került az adat.

Nem szerette ha magasan van a data miközben a Q0 is.

De még mindig érdekelne hogy miért csak pár IC-nél fordul ez elő. A többi stabilan működött míg ezek összevissza. Gyanítom a panellal van valami mert csere után ugyanezt művelték.
Beteszem a hidegítőkondikat és meglássuk.

Köszönöm.

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2011. február 13. vasárnap, 11:35

Ez elég érdekes hiba, elméletileg nem okozhat ilyet.
Lehet, beleszaladtál valami FPGA alapú gyártószériába.
Cimbora hatalmasakat szívott ilyenekkel, képesek voltak
úgy bezáródni, hogy tönkre is tette magát.
Mondjuk Ő kritikus időzítésen használta a nagysebességű regisztereket...
JAni

Avatar
SirLeslie
Pákabűvész
Hozzászólások: 247
Csatlakozott: 2005. április 14. csütörtök, 6:00
Tartózkodási hely: Zalaegerszeg
Kapcsolat:

HozzászólásSzerző: SirLeslie » 2011. augusztus 1. hétfő, 16:29

Kérdeznék én is a táprésszel kapcsolatban:

írta:...25mA be van tartva...


Ez az adat lábaként értendő vagy a chip össz.áram? A nálam lévő 595-ök adatlapjában ez nem szerepel - nézegettem másik adatlapokban is, de elég széles határértékek vannak a gyártóktól függően.

Végül is csak 1 led lenne lábanként... de üzemszerűen lehet olyan is, hogy az összesnek kell világítania - mert az a 3,125mA nem biztos, hogy elég fényerőt nyújt. Kinek van ebben gyakorlati tapasztalata? Van-e látható fényerő különbség 1-3 illetve 6-8 együttesen világító led esetén? (74HC595)



Találtam drain kimenetű 595-ös is, de kb árban 2-4x annyi - ráadásul teljesen más lábkiosztással.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2011. augusztus 1. hétfő, 17:14

NXP74HC595:
25mA/láb, 70mA/táphozzávezetés.

Ha nagyobb kell: A texasnak van 200mA terhelhetőségűje.....

Nálam a CMOS vált be, ott kb. 20mA/lábbal hajtom.... Még él :)


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég