Forum: Mikrocontroller und Digitale Elektronik Problem mit Arduino-Nano und HCT595


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Vancouver (Gast)


Lesenswert?

Hallo,

ich habe ein seltsames Problem mit einem 74HCT595 (8-bit Schieberegister 
mit parallelem Ausgang), der von einem Arduino Nano angesteuert wird. 
Die Pins clk, strb, data und ~clr sind mit dem Arduino verbunden, ~oe 
liegt fest auf GND.
Der Arduino braucht nach dem Starten 1-2 Sekunden, bis die Pins als 
Ausgänge konfiguriert sind. In dieser Zeit macht der HCT595 seltsame 
Dinge: Er schaltet (fast immer) alle Ausgänge auf 1, was für die 
nachfolgende Schaltung ziemlich fatal ist.
Im Moment wird der Arduino noch von USB und die 595-Schaltung von einem 
Labornetzteil versorgt. Wird der Arduino zuerst eingeschaltet und die 
595-Schaltung einige Sekunden später, dann tritt das Problem mit dem 
High-Level an den Ausgängen nicht auf.
Folglich war meine Idee, dass der 595 diesen Unsinn macht, weil die 
Eingänge am Anfang noch floaten, bis sich  der Ardunio konfiguriert hat. 
Also habe ich alle Eingänge gepullt (~clr mit 10k gegen 5V, die anderen 
mit 10k gegen GND). Das hatte jedoch keinerlei Effekt.
Dieser Unsinn, dass der 595 alle Ausgänge auf 1 legt, ist mir vorher 
noch nicht begegnet. Und selbst wenn es so wäre: Warum tut er das nicht, 
wenn er nach Prozessor eingeschaltet wird, aber Pull-Widerstände 
keinen Effekt haben?

von Falk B. (falk)


Lesenswert?

Vancouver schrieb:
> Und selbst wenn es so wäre: Warum tut er das nicht,
> wenn er nach Prozessor eingeschaltet wird, aber Pull-Widerstände
> keinen Effekt haben?

Vermutlich werden durch Einkopplungen viele virtelle Taktpulse erzeugt. 
Wenn dann zufällig oder systematisch der Dateneingang auf HIGH liegt, 
wandern die alle ins Schieberegister.

Leg OE an den Arduino und pack einen externen Pull-Up dran. Dann beim 
Reset erst das Schieberegister mit 0 laden, speichern und dann erst OE 
auf Ausgang schalten und LOW ziehen.

von Vancouver (Gast)


Lesenswert?

Falk B. schrieb:
> Vermutlich werden durch Einkopplungen viele virtelle Taktpulse erzeugt.
> Wenn dann zufällig oder systematisch der Dateneingang auf HIGH liegt,
> wandern die alle ins Schieberegister.

Aber doch nicht, wenn die Eingänge gepullt sind, oder?

von Falk B. (falk)


Lesenswert?

Vancouver schrieb:
> Aber doch nicht, wenn die Eingänge gepullt sind,

Eigentlich nicht. Aber es kann sein, daß beim Einschalten der 
Versorgungsspannung komische Dinge passieren. Egal, leg OE an den 
Arduino und teste.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Vancouver schrieb:
> Folglich war meine Idee, dass der 595 diesen Unsinn macht, weil die
> Eingänge am Anfang noch floaten
Tun sie das wirklich? Was sagt das Oszilloskop?

> Im Moment wird der Arduino noch von USB und die 595-Schaltung von einem
> Labornetzteil versorgt.
Die Masse der beiden ist aber schon verbunden?
Ich frage nur, weil diese ungemein wichtige Verbindung in deinem 
verbalen Schaltplan "Pins clk, strb, data und ~clr sind mit dem Arduino 
verbunden, ~oe liegt fest auf GND" nicht auftaucht...

: Bearbeitet durch Moderator
von Vancouver (Gast)


Lesenswert?

Lothar M. schrieb:
> Tun sie das wirklich? Was sagt das Oszilloskop?

Das Oszi sagt nichts and dieser Stelle, insbesondere dann nicht, wenn 
die Pull-Widerstände drin sind. Aber ich muss das nochmal genauer 
anschauen. Vllt gibt es irgendwelche Spikes beim Einschalten, die ich 
noch nicht gesehen habe.
Und ja, die GND-Verbindung existiert natürlich, das hätte ich erwähnen 
sollen, sorry. Nachdem der HCT595 korrekt initialisiert ist, 
funktioniert die ganze Schaltung problemlos.

Vor einigen Jahren hatte ich mal ein ähnliches Design mit einem PIC 
statt Arduino. Da ist das Problem nicht aufgetreten, oder ich habe es 
nicht bemerkt, weil der PIC seine Ports schneller konfiguriert, da er 
sich nicht erst durch den Bootloader durcharbeiten muss.

Ich werde heute mal die Signale vom Arduino abklemmen und auf harte 
Logiklevel legen und schauen was beim Einschalten passiert, dann 
schrittweise immer größere Pull-Widerstände einbauen.

Die Lösung mit dem ~oe wäre ziemlich aufwändig, weil ich dann an den 
595-Ausgängen überall Pulldowns bräuchte und eine zusätzliche Leitung 
zum Controller, der aber keinen Pin mehr frei hat. Das wäre in 
komplettes Redesign.

von Vancouver (Gast)


Lesenswert?

Was ich mal noch fragen wollte: hat schon mal jemand beobachtet, dass 
der 595 alle Ausgänge auf high legt, bevor man ihn initialisiert? Ist 
dieses Verhalten normal? Im Datenblatt steht dazu nichts.

von Uwe (Gast)


Lesenswert?

Hi,
>Die Lösung mit dem ~oe wäre ziemlich aufwändig, weil ich dann an den
>595-Ausgängen überall Pulldowns bräuchte und eine zusätzliche Leitung
>zum Controller, der aber keinen Pin mehr frei hat. Das wäre in
>komplettes Redesign.

und wie wäre es ~MR auf low zu halten?
Viel Erfolg, Uwe

von Stefan ⛄ F. (stefanus)


Lesenswert?

Vancouver schrieb:
> Was ich mal noch fragen wollte: hat schon mal jemand beobachtet, dass
> der 595 alle Ausgänge auf high legt, bevor man ihn initialisiert? Ist
> dieses Verhalten normal? Im Datenblatt steht dazu nichts.

Der Punkt ist, dass der initiale Zustand nach dem Anlegen der 
Versorgungsspannung undefiniert ist. Also ja, deine Beobachtung fällt in 
den Bereich des normalen. Jeder beliebige Zustand ist normal.

Wenn dich das stört, musst du wie gesagt mit /OE und Widerständen an den 
Ausgängen arbeiten.

> und wie wäre es ~MR auf low zu halten?

oder das

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Vancouver schrieb:
> as ich mal noch fragen wollte: hat schon mal jemand beobachtet, dass
> der 595 alle Ausgänge auf high legt, bevor man ihn initialisiert? Ist
> dieses Verhalten normal?

Mehr oder weniger. Der Zustand der Ausgänge beim Einschalten ist 
ZUFÄLLIG! Das Ding hat keinerlei Power Up Reset oder so eingebaut. Der 
Reseteingang hilft hier auch nicht, denn der wirkt nur auf des 
Schieberegister, nicht auf das Ausgangsregister.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> und wie wäre es ~MR auf low zu halten?
>
> oder das

Nö. Mal wieder so ein aus der Hüfte geschossener "Expertentip" . . .

von Stefan ⛄ F. (stefanus)


Lesenswert?

Falk B. schrieb:
> Nö. Mal wieder so ein aus der Hüfte geschossener "Expertentip" . . .

Ohne Begründung hilft das keinem. Außerdem kam der Vorschlag nicht von 
mir.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Vancouver schrieb:
> Warum tut er das nicht, wenn er nach Prozessor eingeschaltet wird
Läuft zu diesem Zeitpunkt evtl. schon das Programm, das laufend gültige 
Daten rausschreibt.

von Stefan ⛄ F. (stefanus)


Lesenswert?

Falk B. schrieb:
> Der Reseteingang hilft hier auch nicht, denn der wirkt nur auf des
> Schieberegister, nicht auf das Ausgangsregister.

Ich würde mal sagen, das hängt vom Zustand der STCP Leitung ab, die er 
ebenfalls unter seiner Kontrolle hat.

: Bearbeitet durch User
von Der müde Joe (Gast)


Lesenswert?

Im Datenblatt steht: "A HIGH on OE causes the outputs to assume a 
high-impedance OFF-state."

Ein Pull-Up Widerstand an diesem Signal würde während der Zeit der 
undefinierten Zustände, also kurz nach dem einschalten, die Ausgänge im 
Tri-State halten.

An den Ausgängen dieses ICs bzw. an den Eingängen Deiner Schaltung, 
benötigst Du je nach Fall Pull-Up- oder Pull-Down-Widerstände; das kommt 
auf deine Schaltung an, was Du an die Ausgänge dieses ICs angeschlossen 
hast.

Die PUs und/oder PDs halten die Leitungen auf definierten Pegeln, bis 
die Initialisierung des '595 abgeschlossen ist. Nach der 
Initialisierung, also wenn die Schaltung ganz normal läuft, 
überschreiben sozusagen die Push-Pull-Ausgänge des '595 dann die 
vordefinierten Pegel der PUs/PDs.

von Der müde Joe (Gast)


Lesenswert?

Du schriebst: "Die Lösung mit dem ~oe wäre ziemlich aufwändig, weil ich 
dann an den 595-Ausgängen überall Pulldowns bräuchte und eine 
zusätzliche Leitung
zum Controller, der aber keinen Pin mehr frei hat."

Dann benötigt die Schaltung ein Monoflop, das den OE-Eingang für die 
kurze Zeit der Initialisierung auf HIGH legt.

Evtl. ergeben sich auch noch weitere Möglichkeiten, wenn du uns zeigst, 
was du an den Ausgängen des '595 angeschlossen hast.

von Marko (Gast)


Lesenswert?

Mich würde es ja stören, wenn mein Mikrocontroller 1-2 Sekunden braucht, 
bis er mal dazu kommt, seine Peripherie zu initialisieren.

Die Pinfunktionen sind normalerweise das erste, was definiert wird.

Und wenn Du schreibst, dass es fatale Folgen für Deine Schaltung hat, 
wenn die Ausgänge des Schieberegisters zufällige Pegel haben, dann ist 
die zwingende Konsequenz, dass Du !OE ebenfalls mit Deinem 
Mikrocontroller verbindest und erst auf LOW ziehst, wenn Du ein 
Initial-Byte (z.b. 00000000) zu dem 74*595 übertragen hast. Bis dahin 
wird !OE über ein Pullup Widerstand auf HIGH gehalten, so dass keine 
zufälligen Ausgangspegel zustande kommen.

Erst dann bist Du im definierten Bereich.

von Peter D. (peda)


Lesenswert?

Falk B. schrieb:
> Der Zustand der Ausgänge beim Einschalten ist
> ZUFÄLLIG! Das Ding hat keinerlei Power Up Reset oder so eingebaut.

Exakt so ist es. Logik-ICs haben typisch kein POR und stehen deshalb 
beim Einschalten rein zufällig.
Deshalb zieht man beim 595 den /OE mittels Pullup auf tristate und setzt 
ihn erst auf low, nachdem man gültige Daten eingeschoben hat.
In tristate kann man dann die Ausgänge des 595 mittels Pulldowns auf low 
ziehen.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ohne Begründung hilft das keinem. Außerdem kam der Vorschlag nicht von
> mir.

Dann lies mal meinen Beitrag

Beitrag "Re: Problem mit Arduino-Nano und HCT595"

von Vancouver (Gast)


Lesenswert?

Lothar M. schrieb:
> Läuft zu diesem Zeitpunkt evtl. schon das Programm, das laufend gültige
> Daten rausschreibt.

Das ist normalerweise der Fall, aber ich habe die SW testweise so 
geändert, dass sie nur die Pins konfiguriert und auf einem definierten 
Level hält, sonst nichts. Also genau das gleiche, was PU/PD-Widerstände 
tun würden.

von Jens M. (schuchkleisser)


Lesenswert?

Vancouver schrieb:
> Die Lösung mit dem ~oe wäre ziemlich aufwändig, weil ich dann an den
> 595-Ausgängen überall Pulldowns bräuchte und eine zusätzliche Leitung
> zum Controller, der aber keinen Pin mehr frei hat. Das wäre in
> komplettes Redesign.

Tja...

Vancouver schrieb:
> Was ich mal noch fragen wollte: hat schon mal jemand beobachtet, dass
> der 595 alle Ausgänge auf high legt, bevor man ihn initialisiert?

Der Zustand ist nicht definiert, daher gibt es MR und OE.
Einzig richtig ist es die Schaltung so auszulegen, das die Ausgänge in 
Ruhe via Pullup/-down im sicheren Zustand verleiben bis ein gültiges 
Datenwort geschrieben und via OE angelegt wird.

Vancouver schrieb:
> Da ist das Problem nicht aufgetreten, oder ich habe es
> nicht bemerkt, weil der PIC seine Ports schneller konfiguriert, da er
> sich nicht erst durch den Bootloader durcharbeiten muss.

Du hast im PIC keinen Bootlader benutzt und jetzt im AVR auch noch einen 
der sich lange Zeit lässt.
Programmiere den Chip mittels ISP und setze das SR direkt in den ersten 
Zeilen, dann geht es deutlich schneller.
Und/oder versuch Optiboot, der ist ein wenig schneller.

: Bearbeitet durch User
von Marko (Gast)


Lesenswert?

Vancouver schrieb:
> Das wäre in
> komplettes Redesign.

Andere würden sowas "Korrektur eines Designfehlers" nennen. ;)

von Vancouver (Gast)


Lesenswert?

Marko schrieb:
> "Korrektur eines Designfehlers"

Wenn es nicht anders geht, wird es wohl so sein müssen...

von Peter D. (peda)


Lesenswert?

Wenn kurze Spikes (100ms) nicht stören, kann man die 595-Löschroutine ja 
mit in den Bootloader packen.

von Der müde Joe (Gast)


Lesenswert?

Du schriebst: "Das ist normalerweise der Fall, aber ich habe die SW 
testweise so geändert, dass sie nur die Pins konfiguriert und auf einem 
definierten
Level hält, sonst nichts. Also genau das gleiche, was PU/PD-Widerstände
tun würden."

Das ist leider nicht so. Während die PU/PD-Widerstände SOFORT 
funktionieren, ohne zeitliche Verzögerung, legt dein Arduino die Pegel 
erst nach ein, zwei Sekunden an. Nachdem der Bootloader durchlaufen 
wurde.

Genau dafür sind PU/PD-Widerstände zu berücksichtigen: Definierte 
Zustände dort zu haben, wo erst etwas später ICs ihre Arbeit aufnehmen.

von Vancouver (Gast)


Lesenswert?

Der müde Joe schrieb:
> Genau dafür sind PU/PD-Widerstände zu berücksichtigen: Definierte
> Zustände dort zu haben, wo erst etwas später ICs ihre Arbeit aufnehmen.

Genau richtig. Aber warum haben PU/PDs dann keinen Effekt, ein zuvor 
hochgefahrener Arduino hingegen schon?
Das ist ja genau das Rätsel. Wenn ich den 595 mit PU/PDs starte, sieht 
er definierte Pegel auf den Steuerleitungen und legt trotzdem alle 
Ausgänge auf High. Starte ich ihn mit einem bereits einige Sekunden 
zuvor gebooteten Arduino, so sieht er die gleichen definierten Pegel, 
aber alle Ausgänge sind auf 0.

von Falk B. (falk)


Lesenswert?

Vancouver schrieb:
> Genau richtig. Aber warum haben PU/PDs dann keinen Effekt,

Vermutlich weil sie falsch angeschlossen sind.

> ein zuvor
> hochgefahrener Arduino hingegen schon?

Was macht der? Hält der nur die Pegel konstant oder schreibt der 
periodisch 0x00 ins Register?

> Das ist ja genau das Rätsel. Wenn ich den 595 mit PU/PDs starte, sieht
> er definierte Pegel auf den Steuerleitungen und legt trotzdem alle
> Ausgänge auf High. Starte ich ihn mit einem bereits einige Sekunden
> zuvor gebooteten Arduino, so sieht er die gleichen definierten Pegel,
> aber alle Ausgänge sind auf 0.

Wie willst du denn dein 595 einzeln "starten"? Das braucht eine 
Versorgungsspannung. Die kann man nicht einfach abschalten, denn dann 
wird dein IC parasitär über die Eingangsschutzdioden versorgt.

von Uwe (Gast)


Lesenswert?

Hi,
>von  Falk B. (falk)
>Stefan ⛄ F. schrieb:
>> und wie wäre es ~MR auf low zu halten?
>>
>> oder das

>Nö. Mal wieder so ein aus der Hüfte geschossener "Expertentip" . . .
Dein Tipp ist aber auch nicht so viel wert.
Ja, du hast recht.
Aber etwas weiter im DB zum 74HCT595 geschaut findet sich die Tabelle3
Schau doch mal nach Zeile 2.
Ich würde damit eine ganz einfache Lösung bauen( so mit C und R)
Viel Erfolg, Uwe

von Falk B. (falk)


Lesenswert?

Uwe schrieb:
>>Nö. Mal wieder so ein aus der Hüfte geschossener "Expertentip" . . .
> Dein Tipp ist aber auch nicht so viel wert.
> Ja, du hast recht.

Das reicht.

> Aber etwas weiter im DB zum 74HCT595 geschaut findet sich die Tabelle3
> Schau doch mal nach Zeile 2.

Es gibt nicht nur ein Datenblatt von dem IC, sondern viele verschiedene.
Was steht in DEINEM Datenblatt dort?

von Peter D. (peda)


Lesenswert?

Beim TPIC6C595 wirkt /CLR auf beide Register.

von Vancouver (Gast)


Lesenswert?

Falk B. schrieb:
> Vermutlich weil sie falsch angeschlossen sind.

Ich bin ziemlich sicher, dass sie richtig angeschlossen sind.

Falk B. schrieb:
> Was macht der? Hält der nur die Pegel konstant oder schreibt der
> periodisch 0x00 ins Register?

Er konfiguriert die Pins als outputs, schreibt eine 1 auf ~clr und 0 auf 
die anderen und tut dann nichts mehr, bis etwas über den CAN-Bus kommt 
(und da kommt aktuell nichts).

Falk B. schrieb:
> Wie willst du denn dein 595 einzeln "starten"? Das braucht eine
> Versorgungsspannung. Die kann man nicht einfach abschalten, denn dann
> wird dein IC parasitär über die Eingangsschutzdioden versorgt.

Wie oben beschrieben, hängt der 595 an einem Labornetzteil, das getrennt 
vom Arduino eingeschaltet werden kann. Wenn der 595 später als der 
Arduino eingeschaltet wird, verhält er sich so, wie ich es gerne hätte. 
Das mit der parasitären Versorgung muss ich mal genau untersuchen, das 
könnte gut sein.

Uwe schrieb:
> Ich würde damit eine ganz einfache Lösung bauen( so mit C und R)

Ja, das macht Sinn. Das RC-Glied wird die Signale etwas verschleifen, 
dass ich die Impulsebreite im normalen Betrieb vermutlich größer machen 
muss. Aber das ist kein Problem in diesem Fall.

von Stefan ⛄ F. (stefanus)


Lesenswert?

Vancouver schrieb:
> Wenn ich den 595 mit PU/PDs starte, sieht
> er definierte Pegel auf den Steuerleitungen und legt trotzdem alle
> Ausgänge auf High.

Vermutlich weil zwischen dem Einschalten der Stromversorgung und dem 
ersten Taktimpuls Zeit vergeht.

Für genaueres brauchen wir mal deinen Schaltplan. Es ist nämlich nicht 
klar, welche Pegel die zahlreichen Eingänge nun initial haben.

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Lesenswert?

Vancouver schrieb:
> Wie oben beschrieben, hängt der 595 an einem Labornetzteil, das getrennt
> vom Arduino eingeschaltet werden kann. Wenn der 595 später als der
> Arduino eingeschaltet wird, verhält er sich so, wie ich es gerne hätte.

Da hast du aber großes Glück. Denn eigentlich darf die Spannung an 
keinem seiner Eingänge höher sein, als die Versorgungsspannung. Wenn 
dein Netzteil ausgeschaltet ist, hast du aber diese Situation.

von Summi (Gast)


Lesenswert?

Vancouver schrieb:
> Wenn ich den 595 mit PU/PDs starte, sieht
> er definierte Pegel auf den Steuerleitungen und legt trotzdem alle
> Ausgänge auf High.

Ich glaube, Du hast das Problem mit der Initialisierung noch nicht ganz 
überblickt.

Die Steuerleitungen und Eingänge sind in erster Instanz gar nicht sooo 
wichtig. Es geht hier vielmehr um den Zustand der internen Latches. Und 
der ist undefiniert - ganz egal, was Du gerade an den Eingängen machst.
Um zu verhindern, dass diese undefinierten Zustände des Latches auf die 
Ausgänge des Schieberegisters gelangen, musst Du !OE auf HIGH halten.

Das ändert natürlich nichts an der Tatsache, dass auch die anderen 
Eingänge des Schieberegisters definierte Pegel haben sollten, aber das 
hat nicht zwangsläufig eine Auswirkung auf den Zustand der Ausgänge beim 
Einschalten.

Also:

1) Power On + !OE HIGH
2) Initiale Serielle Daten auf das SR schicken
3) Latch + !OE auf LOW

So "initialisiert" man ein Schieberegister.

von Vancouver (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Da hast du aber großes Glück. Denn eigentlich darf die Spannung an
> keinem seiner Eingänge höher sein, als die Versorgungsspannung. Wenn
> dein Netzteil ausgeschaltet ist, hast du aber diese Situation.

Ja, das ist nicht optimal, ist mir schon klar. War ja auch nur zum 
Experimentieren. Dummerweise macht die Schaltung damit, was sie machen 
soll.

von Johannes (Gast)


Lesenswert?

Noch als Erweiterung zu der schon sehr guten Klarstellung von Summi:

Es ist deine Aufgabe den IC so zu betreiben, dass er im spezifizierten 
Bereich läuft. (Bezogen auf die Pegel vom Arduino obwohl der HCT595 vom 
Labornetzteil noch nicht gespeißt wird.)

Natürlich zeigt der IC auch ein Verhalten außerhalb seiner 
Spezifikationen, jeder IC verhält sich da irgendwie und oft genug kommt 
auch kein Rauch raus. Aber das Verhalten kann sich von IC zu IC 
verändern und auch der gleiche IC kann sich je nach Temperatur, Lust und 
Laune unterschiedlich verhalten.

In diesem Fall ist zusätzlich noch der Zustand der internen Latches 
spezifiziert undefiniert. Es gibt sicher Wege da irgendwie, im Rahmen 
der Statistik, Einfluss zu nehmen - scheinbar hast du so einen Weg 
gefunden. Um herauszufinden, wieso das so einen Einfluss hat, bräuchte 
man die exakte Schaltung von dem Ding.

Drauf verlassen kannst du dich natürlich trotzdem nicht.

Also mach es richtig.

von Uwe (Gast)


Lesenswert?

Hi,
>Falk B. (falk)

>Es gibt nicht nur ein Datenblatt von dem IC, sondern viele verschiedene.
Wie wäre es mal mit anklicken? HCT595

von Uwe (Gast)


Lesenswert?

Oh, meinte 74HCT595

von MCUA (Gast)


Lesenswert?

>> Da hast du aber großes Glück. Denn eigentlich darf die Spannung an
>> keinem seiner Eingänge höher sein, als die Versorgungsspannung. Wenn
>> dein Netzteil ausgeschaltet ist, hast du aber diese Situation.
> Ja, das ist nicht optimal, ist mir schon klar.
Würde ich mal als Design-Fehler bezeichnen (auch wenn's nur eine 
Experimentierschaltung ist)

von Vancouver (Gast)


Lesenswert?

Johannes schrieb:
> Es gibt sicher Wege da irgendwie, im Rahmen
> der Statistik, Einfluss zu nehmen

Ja, da hast du vermutlich recht. Durch irgendwas werden alle Bits 
manchmal zu Null, so wie ich es gerne hätte, aber man kann sich 
natürlich nicht darauf verlassen.

Ich denke es wird darauf hinauslaufen, entweder den Bootloader so 
umzubauen, dass er den 595 sofort resettet, oder ich versuche das mit 
RC-Gliedern zu erreichen. Die sauberste Lösung mit gesteuertem ~oe wird 
aufwändig wegen der zusätzlichen Pull-Widerstände.

Nun, mal sehen was daraus wird. Danke jedenfalls für eure Hinweise, das 
hat mir sehr geholfen!

von Falk B. (falk)


Lesenswert?

Vancouver schrieb:
> Das mit der parasitären Versorgung muss ich mal genau untersuchen, das
> könnte gut sein.

Siehe Pegelwandler. Miss einfach mal die Versorgungsspannung am 595 
wenn dessen Versorgung ausgeschaltet ist.

von Vancouver (Gast)


Lesenswert?

Falk B. schrieb:
> Siehe Pegelwandler. Miss einfach mal die Versorgungsspannung am 595
> wenn dessen Versorgung ausgeschaltet ist.

Das habe ich vor, allerdings hängen da noch andere Lasten an der 
5V-Domain. Ich schätze da wird nicht viel Spannung übrig bleiben. Aber 
das getrennte Einschalten von Arduino und HCT595 ist wohl so oder so 
keine gute Idee.

von Stefan ⛄ F. (stefanus)


Angehängte Dateien:

Lesenswert?

Ich möchte nochmal auf diesen Vorschlag zurück kommen, den Falk leider 
ohne Begründung abgelehnt hat:

Uwe schrieb:
> und wie wäre es ~MR auf low zu halten?

Wenn ich initial mittels Pull-Widerstände folgenden Zustand herstelle, 
müssten die Ausgänge initial alle auf Low sein, denke ich:

/MR = LOW
STCP = HIGH
/OE = LOW

Damit kann man sich die vielen Widerstände an den Ausgängen sparen.

Falls da jetzt wieder ein "nein" kommt, dann bitte mit Begründung und 
ohne persönliche Angriffe.

https://assets.nexperia.com/documents/data-sheet/74HC_HCT595.pdf

: Bearbeitet durch User
von Vancouver (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn ich initial mittels Pull-Widerstände folgenden Zustand herstelle,
> müssten die Ausgänge initial alle auf Low sein, denke ich:

Laut Datenblatt ist STCP ein echtes Clock-Signal, d.h. die Daten aus dem 
Schieberegister werden mit einer aktiven Flanke in das Ausgangsregister 
übernommen. Wenn nun alle Signale gleichzeitig die von dir beschriebenen 
Werte annehmen (beim Einschalten), dann wird das Schieberegister 
gleichzeitig gelöscht und ins Ausgangsregister übertragen. Die Frage 
ist, ob das zuverlässig für alle Bits funktioniert. Wäre STCP ein 
Latch-Enable, dann wäre es kein Problem, aber wie gesagt, des Datenblatt 
verlangt hier eine steigende Flanke. Diese könnte man etwas verzögert 
mit einem RC-Glied erzeugen, wie schon vorgeschlagen wurde.

von Jens M. (schuchkleisser)


Lesenswert?

Hängt von den Laufzeiten ab.
Mit Pech latchen die Latches erst und nanosekunden später resettet das 
Schieberegister.
Ich glaub nicht das da ein offiziell sicherer Zustand erreichbar ist, 
der "immer" funktioniert.

von Stefan ⛄ F. (stefanus)


Lesenswert?

Vancouver schrieb:
> die Daten aus dem Schieberegister werden mit einer
> aktiven Flanke in das Ausgangsregister übernommen

Schade, es wäre so einfach gewesen.

von Kuno (Gast)


Lesenswert?

Vancouver schrieb:
> Ich denke es wird darauf hinauslaufen, entweder den Bootloader so
> umzubauen, dass er den 595 sofort resettet, oder ich versuche das mit
> RC-Gliedern zu erreichen. Die sauberste Lösung mit gesteuertem ~oe wird
> aufwändig wegen der zusätzlichen Pull-Widerstände.

Es gibt beim uC kein 'sofort'. Die GPIO Pins verbleiben im 
High-Impedance Zustand solange die Resetsequenz noch nicht abgeschlossen 
ist. Das bedeutet die Spannung muss einen gewissen Level erreicht haben, 
und der Taktgenerator muss angeschwungen sein. Das kann je nachdem wie 
das Powersupply hochkommt und wie die Taktfrequenz gewählt ist, von ein 
paar Mikrosekunden bis Millisekunden dauern. In dieser Zeit, noch bevor 
der Bootloader läuft, macht der 595 was er will. Ob das für deine 
angeschlossene Hardware kritisch ist, musst du beurteilen.

Vancouver schrieb:
> ich habe ein seltsames Problem mit einem 74HCT595 (8-bit Schieberegister
> mit parallelem Ausgang), der von einem Arduino Nano angesteuert wird.
> Die Pins clk, strb, data und ~clr sind mit dem Arduino verbunden, ~oe
> liegt fest auf GND.

Wenn ~OE immer auf GND liegt, benötigst du die Tri-State Fähigkeit ja 
nicht. Weshalb nimmst du dann nicht ein 74HCT594, das hat keine 
Tri-State Ausgänge, dafür aber zwei Reset-Eingänge, die Shift und 
Storage Register definiert zurücksetzen. Wenn du diese beiden Eingänge 
(~SHR und ~STR) zusammenhängst, über einen Pull-Down auf GND legst und 
mit deinem '~clr' des Arduino verbindest, dann bleiben die Ausgänge 
solange auf Low bis der Arduino den '~clr' auf High setzt.

von Stefan ⛄ F. (stefanus)


Lesenswert?

Ich sehe gerade, dass die Innenschaltung im Datenblatt von Texas 
wesentlich klarer dargestellt ist: 
https://www.ti.com/lit/ds/symlink/sn74hc595.pdf

von Vancouver (Gast)


Lesenswert?

Kuno schrieb:
> Weshalb nimmst du dann nicht ein 74HCT594

Verflucht... der wäre wesentlich besser gewesen. Vor allem, weil beide 
Reset-Inputs Level-getriggert sind und keine Flanke benötigen.
Bis auf den zusätzlichen Reset ist der sogar pinkompatibel. Mit einer 
durchtrennten Leiterbahn und einer Brücke zwischen den beiden Resets 
wäre mein Problem gelöst.

Ein großes Danke für diesen Tip.

Notiz an mich selbst (frei nach Schiller): Drum prüfe, wer den Stein 
verlöte, ob sich nicht was bessres böte.

von Uwe (Gast)


Lesenswert?

Hi,
Ok, 594 wäre die eindeutig bessere Variante, aber
MR mit 10K gegen GND
und STCP mit 470p gegen GND und 47K nach 5P wäre doch einfach mal einen 
Versuch wert.
Könnte mir gut vorstellen das damit ein vernünftiges Reset erzeugt wird.
Das sind 5 Lötpunkte. Ist denn das so schwer?

Viel Erfolg, Uwe

von Stefan ⛄ F. (stefanus)


Lesenswert?

Komisch, der 74HC594 kann man bei Reichelt und Conrad nicht kaufen. TME 
hat ihn aber. Die deutschen Händler kann man immer mehr in die Pfeife 
rauchen.

Bei Amazon bekommt man auch nur den 595er.

von Falk B. (falk)


Lesenswert?

Uwe schrieb:
> Hi,
> Ok, 594 wäre die eindeutig bessere Variante, aber
> MR mit 10K gegen GND
> und STCP mit 470p gegen GND und 47K nach 5P wäre doch einfach mal einen
> Versuch wert.

Murks. Der Austausch gegen 594 mit bissel Fädeldraht ist solide.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Komisch, der 74HC594 kann man bei Reichelt und Conrad nicht kaufen. TME
> hat ihn aber. Die deutschen Händler kann man immer mehr in die Pfeife
> rauchen.
>
> Bei Amazon bekommt man auch nur den 595er.

Vermutlich einer der Gründe, warum sich der für die meisten Anwendungen 
besser geeignete 594 NICHT etabliert hat und sie alle Welt mit dem 
Resetproblem rumplagt. 8-0

Digikey hat das Zeug tonnenweise in allen Gehäusetypen.

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Hi
>  Falk B. (falk)
>Murks. Der Austausch gegen 594 mit bissel Fädeldraht ist solide.
Bist du überhaupt in der Lage mal was vernünftiges zu schreiben?

Uwe

von Vancouver (Gast)


Lesenswert?

Uwe schrieb:
> Könnte mir gut vorstellen das damit ein vernünftiges Reset erzeugt wird.
> Das sind 5 Lötpunkte. Ist denn das so schwer?

Nichts ist daran schwer. Das werde ich auch testweise machen. Wenn es 
klappt, bleibt es so. Der 594 wäre die Alternative. Aber bei einem neuen 
Design würde ich gleich den 594 nehmen. In der Bucht findet man den 
übrigens recht häufig.

von Kuno (Gast)


Lesenswert?

Vancouver schrieb:
> Uwe schrieb:
>> Könnte mir gut vorstellen das damit ein vernünftiges Reset erzeugt wird.
>> Das sind 5 Lötpunkte. Ist denn das so schwer?
>
> Nichts ist daran schwer. Das werde ich auch testweise machen. Wenn es
> klappt, bleibt es so. Der 594 wäre die Alternative. Aber bei einem neuen
> Design würde ich gleich den 594 nehmen. In der Bucht findet man den
> übrigens recht häufig.

Euch beiden ist aber hoffentlich klar, daß die schnellen Bausteine der 
74HCT Serie gewissen Ansprüche an die Flankensteilheit der 
Eingangssignale stellen. TI gibt 500 nsec als Maximum an, und der 
Vorschlag von Uwe liegt da weit darüber. Ob das dann bei 
unterschiedlichen Randbedingungen noch zuverlässig funktioniert ist mehr 
als fraglich. Der C verlangsamt das Signal übrigens immer, auch wenn es 
dann später vom uC geschaltet wird.

Ich schließe mich der Meinung von Falk an, das ist ein schlechter 
Workaround der vielleicht funktioniert, aber eigentlich ist es Murks.

von Johannes (Gast)


Lesenswert?

Uwe schrieb:
> Hi,
> Ok, 594 wäre die eindeutig bessere Variante, aber
> MR mit 10K gegen GND
> und STCP mit 470p gegen GND und 47K nach 5P wäre doch einfach mal einen
> Versuch wert.
> Könnte mir gut vorstellen das damit ein vernünftiges Reset erzeugt wird.
> Das sind 5 Lötpunkte. Ist denn das so schwer?
>
> Viel Erfolg, Uwe

Ohne jetzt nachgerechnet zu haben, aber im TI Dabla 
(https://www.ti.com/lit/ds/symlink/sn74hc595.pdf) steht z.B. drinnen, 
dass die Input Transition Time für 4.5V unter 500ns liegen muss/sollte.

Es sind ein paar Seiteneffekte aufgelistet die auftreten, wenn man es 
nicht einhält, z.B. der hier:

> If this device is used in the threshold region(from VILmax = 0.5 V to VIHmin = 
1.5 V), there is a potential to go into the
> wrong state from induced grounding, causing double clocking.

Bleibt aber alles recht vage.

Vermutlich hat kein Hersteller die Seiteneffekte vollständig 
dokumentiert weil sie normalerweise auch niemanden interessieren. 
Sicherheitshalber sollte man die RC Mimik aber mit einem Schmitt-Trigger 
Buffer ala 7014 entkoppeln, sonst ist man halt wieder außerhalb der 
Spezifikationen.

von Uwe (Gast)


Lesenswert?

Hi,
>unter 500ns liegen muss/sollte
ok, die 470p waren auch nur aus dem Bauch raus, 160 oder 220p kann man 
ja auch testen.
Übrigens so ungewöhnlich ist das mit der RC Kombi garnicht. Geht mal 10 
bis 15 Jahre zurück, da war sowas recht oft zu finden, auch in der 
Industrie.

Viel Erfolg, uwe

von Stefan ⛄ F. (stefanus)


Lesenswert?

Uwe schrieb:
> ok, die 470p waren auch nur aus dem Bauch raus, 160 oder 220p kann man
> ja auch testen.

Gehst du dabei davon aus, dass die Versorgungsspannung schlagartig von 
Null auf 5V springt? Falls nicht, fehlt mir gerade die Vorstellungskraft 
wie das funktionieren könnte.

: Bearbeitet durch User
von MCUA (Gast)


Lesenswert?

Der '594 ist wohl viel weniger gefragt.
Den '595 gibt es auch als Fast, den '594 nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.