Hallo,

Ik heb een probleempje met de 74hc595 schuifregisters welke aangestuurd worden door een arduino.

Wanneer er spanning op het geheel gezet word komen de poorten van de 595 in een willekeurige staat voordat ze correct aangestuurd worden door de arduino. Het is maar even (0.5-2 sec) maar aangezien er het een en ander aangestuurd word niet wenselijk.

Nu heb ik hier iets gevonden wat een mooi schema oplevert zoals dit:
http://pinball.pixelmagic.nl/595.png

Met het grootste verschil is dat men op de website een voeding van 3.3v gebruiken en ik 5v.

Graag had ik van de experts hier wat advies gehad of dit zo gaat werken.

Alvast hartelijk dank.

Probeer het uit zou ik zeggen. Even de paar componenten op een breadboard en testen maar.

Frysk

Pin 10 is de Master reset. Als je die laag maakt, dan worden alle uitgangen laag. En dat gebeurt hier bij power-up, tgv de RC1.

En pin 13 is de output enable. Die wordt met RC2 een tijdje hoog gemaakt bij power-up. Daardoor gaan alle uitgangen even in tri-state (zwevend).

Dat betekent wel dat je het ic na inschakelen eventjes niet kunt aansturen vanuit de arduino. Dus persoonlijk zou ik toch een extra arduino pin gebruiken om daarmee de reset aan te sturen. Dan heb je geen last van een inschakelvertraging.

Als je de reset van een 74HC595 activeert, worden enkel de bits in het schuifregister op 0 gezet - de uitgangen blijven ongewijzigd.
Die truuk werkt wèl bij een 74HC594 - daar maakt een reset de uitgangen laag.

Kijk even in de datasheet, en zoek naar de zgn functietabel.
Dan zie je precies welke pennetjes je moet wiebelen om een bepaalde output te krijgen.

Als je het simpel wilt oplossen: schuif 8 nullen naar binnen, 1 latchsignaaltje, en je uitgangen zijn gegarandeerd laag.

Zonder verder ook maar naar enige datasheet gekeken te hebben:
Definieer met pull-up / pull-down de staat die je bij 'power on' hebben wilt en hang de output enable aan je Arduino (en aan een pull-up natuurlijk, die Arduino is ook floating bij init).
Kun je op je gemak naar binnen clocken wat je wilt en je enabled het wel een keer als het je uit komt.

De enige andere manier om het spul in een defined state te krijgen is een keer clocken na een reset. Daar ben je afhankelijk van danwel wat gepiel met RC om een clock te veroorzaken wat weer vervelend uit kan pakken als je 'snel' vanuit de Arduino wilt clocken.

Ik denk dat Guido niet helemaal goed zit met z'n oplossing. Het zou kunnen dat z'n code snel genoeg is om 'wakker' te zijn voordat nOE bij komt en dat het daarom goed gaat. Netjes vind ik het niet.

Die 595 is wat eh... lomp in deze. Het feitelijke probleem is natuurlijk dat je in een situatie waar de uitgangen 'kritisch' zijn, die 595 niet had moeten gebruiken...

Lees wat Pros schrijft,Als er geen data op de uitgangen mag verschijnen bij powerup, dan is een xx595 geen goede keuze,er moet enasynchrone clear zijn van zowel schuifregister als latch.

Als je nu gewoon de output enable zo maakt dat de arduino die "bewust" moet aansturen, dan weet je dat pas als de arduino de kans heeft gehad om de juiste waardes in het register te zetten er dingen op de output kunnen verschijnen?

Op de uitgang van het schuifregister doe je dan pullups of pulldowns dat er niet verkeerde dingen gebeuren als je schuifregister geen waarde aanstuurt.

Op 29 januari 2012 23:04:55 schreef deKees:
Pin 10 is de Master reset. Als je die laag maakt, dan worden alle uitgangen laag. En dat gebeurt hier bij power-up, tgv de RC1.

En pin 13 is de output enable. Die wordt met RC2 een tijdje hoog gemaakt bij power-up. Daardoor gaan alle uitgangen even in tri-state (zwevend).

Dat betekent wel dat je het ic na inschakelen eventjes niet kunt aansturen vanuit de arduino. Dus persoonlijk zou ik toch een extra arduino pin gebruiken om daarmee de reset aan te sturen. Dan heb je geen last van een inschakelvertraging.

Het probleem is eigenlijk precies tussen het aanzetten van de voeding en het daadwerkelijk opgestart zijn van de arduino. Het liefst zou ik inderdaad de arduino het laten sturen maar dat lukt dus niet.

Dat ik de 595 niet aankan sturen voor een korte tijd bij het inschakelen is geen enkel probleem.

Op 30 januari 2012 08:23:26 schreef M-i-c-h-e-l:Als je het simpel wilt oplossen: schuif 8 nullen naar binnen, 1 latchsignaaltje, en je uitgangen zijn gegarandeerd laag.

Het daadwerkelijk aansturen is het probleem niet ;)

Op 30 januari 2012 09:05:52 schreef MC6800:
Lees wat Pros schrijft,Als er geen data op de uitgangen mag verschijnen bij powerup, dan is een xx595 geen goede keuze,er moet enasynchrone clear zijn van zowel schuifregister als latch.

Als ik beter een 594 kan gebruiken dan heb ik waarschijnlijk een probleem, tenzij de 594 exact dezelfde aansturing heeft als de 595. De code word namelijk door iemand anders gemaakt en deze is gebaseerd op 595.

Maar dan tot slot even de hamvraag: als ik het goed begrijp zou het bovenstaande schema dus wel/niet kunnen werken emt een 595 ?

Wat aansturen betreft (Data, Clock, Latch, uitgangen) is er geen enkel verschil tussen de '595 en de '594.
De Output Enable van de '595 is bij de '594 vervangen door een tweede Reset die het uitgangsregister stuurt.

Voor de '594 betaal je over 't algemeen wel meer dan voor de '595 - soms meer dan het dubbele. De oplossing van rew is dus zeker het overwegen waard.

Zoals zowel rew als ik reeds opmerken: de enige manier om de uitgangen in een defined state te krijgen is ze te laten floaten en met pull-up / down ergens heen te trekken - zie datasheet!. Dat is toch antwoord op je vraag??

Voor die 594: als een ander die code maakt, dan is er dus source van. Dan kan het toch ook niet zo moeilijk zijn om die aan te passen?? (wat stelt die hele aansturing nou eigenlijk voor?) Bedoel... Heb al vaak zat kromme oplossingen gezien wegens 'ja maar die source is van iemand anders' en ander politiek geneuzel...

Het gebruiken van een 595 blijft een verkeerde beslissing als je outputs gedefinieerd moeten zijn.

Je zou (als je toch naar een ander chippie gaat) ook eens kunnen kijken naar een I/O expander. Iets minder low-level en wellicht goedkoper dan een 594.

Het kwartje viel nog niet helemaal, ben verre van een expert op dit gebied.

Als ik het goed begrijp haal ik de OE pen van de massa af en trek die naar een pen van de arduino welke ik dmv een weerstand hoog hou.

Zodra de arduino klaar is maak ik die bewuste ben laag en vanaf dat moment accepteerd de 595 data.

Zou dit het dan kunnen zijn ?
http://pinball.pixelmagic.nl/595-2.png
En welke waarde zou de weerstand dan kunnen zijn ?

Ik realiseer me dat ik achteraf waarschijnlijk beter de 594 had kunnen nemen, maar als dit ook werkt ben ik al blij ;) Ik ga ook zeker nog even kijken naar een schematje voor die 594.

[Bericht gewijzigd door Henry S. op (41%)]

De waarde van die weerstand steekt niet zo nauw - iets tussen 1k en 10k is OK.

De uitgangen v/d '595 kan je nu van pull-down weerstanden voorzien (of pull-up, als je wil dat een pin bij het opstarten hoog is).

Zodra de arduino klaar is maak ik die bewuste ben laag en vanaf dat moment accepteerd de 595 data.

De '595 accepteert ook data, als zijn OE-pin hoog is. Het is de bedoeling, dat de arduino eerst de gewenste data naar de '595 schrijft, en dan pas de OE-pin laag maakt.

Even geprobeerd met 15k en 7.5k wat ik had liggen, werkt op zich goed maar zodra de pin in arduino als output word gezet zie ik een hele korte flash op alle poorten. Een stuk beter wat het wat, namelijk 1-2 seconde, maar voor het mooie zou het helemaal niet moeten 'flashen'.

Misschien toch maar die 594's eens proberen, heeft iemand misschien een linkje naar een goed schema voor wat er aan onderdelen omheen moet ?

[Bericht gewijzigd door Henry S. op (37%)]

Nee, je moet lezen wat Pros zegt:

EERST de data in het register schuiven en DAN PAS de OE laag maken.

Anders gezegd: het DDR-bit v/d OE-pin pas hoog maken nadat je de initiële data naar de '595 hebt gestuurd.
Zodra je een DDR-bit hoog maakt, wordt de bijbehorende I/O-pin onverbiddelijk laag - daar is geen weg omheen.

Heren, geweldig !

Ik maakte de fout door eerst alle poorten op output te zetten, dan de data er heen pompen en tot slot low zetten.

Na eerste de output poorten alleen voor de communicatie te zetten, data pompen en dan pas de OE op output te configureren en vervolgens low te maken werkt het perfect.

Mijn dank is groot !

[Bericht gewijzigd door Henry S. op (32%)]

Nog even een kleine vraag, ik moet diverse van deze schakelingen gaan aansturen, maar wil uiteraard wel graag maar één pin gebruiken om de OE te gaan sturen.

Met mijn beperkte kennis weet ik nog wel dat zodra ik weerstanden parallel ga zetten dat de waarde steeds kleiner word en volgens mij ga ik dan uiteindelijk kortsluiting maken of erg veel vermogen gebruiken.

Nu heb ik de hoop dat ik dat 'simpel' met een diode kan tegengaan op met een 1N4148 ofzo er voor. Maar even wat getekend om het duidelijk te maken:

http://pinball.pixelmagic.nl/595-3.png

Ik heb het al even getest en lijkt te werken, maar is het ook 'netjes' ?

Je kan gewoon met 1 weerstand werken en alle OE's aan elkaar knopen. Geen diode nodig! Als je een hele lange rij maakt eventueel nog zo'n zelfde weerstand aan de andere kant van de rij naar de VCC leggen.

Op aparte printen gewoon elk IC een eigen weerstand geven, onder de 33k zal meestal wel werken. Bij storingen verlagen of een hele kleine condensator (22p ofzo), parallel aan die weerstandjes. Niet doen als die OE veel en snel moet schakelen.

[Bericht gewijzigd door Benadski op (38%)]

Ik snap niet wat je wil bereiken. Volgens mij is het met jou schema zo dat de pin die je aanstuurt hoog wordt als je hem vanuit de arduino hoog stuurt, en dat ie laag wordt als je hem vanuit de arduino laag stuurt. Dat kan met vier componenten minder.

Die output enable in je arduino kan je ook VOOR het inclocken van de data actief maken. Maar dan moet je wel zorgen dat de data van het pinnetje eerst hoog is.

Dus


digitalwrite (8, 1); // omdat het nog een input is , activeert dit de pullup. 
pinmode (8, MODE_OUTPUT); // nu wordt ie echt actief "hoog" gestuurd. 

(er zitten een paar hoofdletters in de functienamen. ik weet het niet meer precies uit m'n hoofd)

Als je eerst alle schuifregisters van de nodige data voorziet, kan je ze vervolgens allemaal gelijktijdig enablen. Je hebt hiervoor genoeg aan één pull-up weerstand, waarmee je alle G-pinnen (ook OE genaamd) simpelweg aan mekaar knoopt. De ingangsimpedantie van die pinnen (en van alle 74HCxx-IC's) is verschrikkelijk hoog, dat is bijgevolg geen bezwaar.

Wat de sturing van de schuifregisters betreft: je moet niet voor elk schuifregister SER, SCK en RCK afzonderlijk aansluiten. Je kan zowel SER als SCK van alle schuifregisters samenknopen, en van elk schuifregister RCK afzonderlijk sturen.
Of je kan meerdere schuifregisters in serie zetten:

http://prosje.be/CO/Schemas/SchuifregistersBedienen.png
De QH' pin van het eerste schuifregister gaat naar de SER van het tweede, enz... Voor twee schuifregisters klok je dan eerst 16 bits in (SER en SCK), alvorens je RCK een opgaande flank geeft.
In dit filmpje zie je twee maal 5 stuks 74HC595 aan het werk, waarbij er ook nog met PWM gespeeld wordt (merkbaar aan het begin). Een 74HC595 kan sneller data verwerken, dan jouw AVR ze kan aanleveren. Enkel in extreme gevallen zou ik ze parallel schakelen.

@rew & Benadski: ik heb dat uitgeprobeerd, werkt inderdaad perfect !

@pros: ik heb de 595's al samengeknoopt, per 4 om precies te zijn. meer zou ook wel kunnen maar voor ons project is dit voldoende en gewenst vanwege de aansturing van andere elementen en de doorlooptijd daarvan.

Allen nogmaals bedankt.