Porterweiterung durch kaskadierte Schieberegister

Gast #3665619
Lesenswert?

Hallo zusammen!

Ich muss mit 3 Ausgängen 16 Relais ansteuern. Dafür möchte ich 2 
Schieberegister kaskadieren. Die Relais sollen vom durchschieben der 
Ausgänge nichts mitbekommen.

Ich habe mir die Schaltung im Anhang ausgedacht.

Über DS (DataSerial) und SHCP (shift register clock) wird das Register 
gefüllt. Nach Abschluss des Füllens wird über OE auf low der Inhalt des 
Schieberegisters in das Speicherregister geschrieben. Nach Abschluss des 
Schaltvorgangs wird mit OE auf high die Ausgänge wieder abgeschaltet und 
das nächste Wort eingetellt.

Ich nutze folgendes Schieberegister:
http://de.farnell.com/nxp/74hc595n/74hc-cmos-74hc595-dip16-5v/dp/3166028

Klappt das so?

Grüße, Steffi
Angehängte Dateien:
Gast #3665633
Lesenswert?

Stephanie schrieb:
> Füllens wird über OE auf low der Inhalt des
> Schieberegisters in das Speicherregister geschrieben.

Hallo Stefanie,

Du hats dei Funktion des OE nicht richtig verstanden.
OE ist nur zum EINSCHALTEN der Ausgänge.
Um die internen Schieberegister auf dei Ausgangsregister zu schreiben 
brauchst Du STCP.

Viertiefe Dich nochmals in das Datenblatt.
UND: Bitte auch Ansteuerpegel beachten!

rgds
#3665642
Lesenswert?

Siehe Porterweiterung mit SPI, da werden die gleichen SR genutzt.
Ich würde /OE konstant auf Low lassen und so vorgehen:
1) Daten die die SR schieben
2) STCP auf High um die Daten des SR in die Ausgangslatches zu kopieren
3) STCP auf Low

BTW: Bei CMOS ICs nie Eingänge offen/floatin lassen.

Uwe Bonnes schrieb:
> Und warum keine I2C Portextender?
Komplizierter und langsamer als die SR?
Gast #3665712
Lesenswert?

Felix Pflaum schrieb:
> Dummerweise sind die Anfangszustände bei den mir bekannten Versionen des
> 74HC595 nämlich nicht festgelegt.

Dafür kann man /OE verwenden: man verbindet es mit dem invertierten 
/Reset oder mit einem freien Pin und einem Pullup - dann ist beim 
Einschalten /OE hi und alle Relais aus.

Wurde aber wirklich schon unzählige Male durchdiskutiert. Es ist eine 
Fehlkonstruktion des 595, dass /MR nicht auf die Ausgänge wirkt, obwohl 
das jeder vernünftige Mensch annehmen würde.

Georg
#3665745
Lesenswert?

Georg schrieb:
> Felix Pflaum schrieb:
>> Dummerweise sind die Anfangszustände bei den mir bekannten Versionen des
>> 74HC595 nämlich nicht festgelegt.
>
> Dafür kann man /OE verwenden: man verbindet es mit dem invertierten
> /Reset oder mit einem freien Pin und einem Pullup - dann ist beim
> Einschalten /OE hi und alle Relais aus.
>
> Wurde aber wirklich schon unzählige Male durchdiskutiert. Es ist eine
> Fehlkonstruktion des 595, dass /MR nicht auf die Ausgänge wirkt, obwohl
> das jeder vernünftige Mensch annehmen würde.
Ja, diese Lösung ist mir bekannt. Wollte nur drauf hinweisen, dass es 
diesen Fallstrick gibt, um die Threaderstellerin davor zu bewahren, den 
gleichen Fehler zu machen wie ich damals. Hatte im Vertrauen darauf, 
dass die Ausgänge mit 0 initialisiert werden, OE auf GND gelegt und 
damit das Problem, dass einige meiner MOSFETs nach Anlegen der 
Betriebsspannung voll durchgeschaltet haben, was in der damaligen 
Anwendung nicht hätte passieren dürfen.

Im Redesign wurde dann die Lösung mit OE über externen Pullup (4,7k) an 
Betriebsspannung und einen Portpin sowie der entsprechenden 
Schaltsequenz (internen Pullup aktivieren, OE-Pin auf Ausgang schalten, 
Nullen ins Schieberegister schreiben, ins Ausgaberegister übernehmen, OE 
low) und Pulldown-Array an den Ausgängen umgesetzt - funktioniert 
einwandfrei.
Gast #3665752
Lesenswert?

Das ist eine Fehlkonstruktion des 595, dass /MR nicht auf die Ausgänge 
wirkt, das ist absichtlich so gemacht. Obwohl ich mich auch nich so gut 
damit auskenne.Aber wie man den ansteuert habe ich schon beschrieben 
hier im Forum.

Beispiel:
1
-- 74HC595 output port expander
2
-- Hoow to use:
3
-- hc595_send(value)
4

5

6
-- pin defines
7
-- any other pin can be used
8
var volatile bit clock_595 is pin_b5      --  SH pin11
9
var volatile bit latch_595 is pin_b6      --  ST pin12
10
var volatile bit data_595 is pin_b7     --  DS pin14
11

12
var volatile bit clock_595_dir is pin_b5_direction
13
var volatile bit latch_595_dir is pin_b6_direction
14
var volatile bit data_595_dir is pin_b7_direction
15

16

17
  latch_595_dir = output
18
  clock_595_dir = output
19
  data_595_dir = output
20

21

22
-- load a byte into the '595
23
procedure hc595_send(byte in val) is
24
  var byte stemp
25
  stemp = val
26
  for 8 loop
27
    data_595 = low
28
    if ((stemp & 128) != 0) then
29
    data_595 = high
30
    end if
31
    clock_595 = high
32
    asm nop
33
    clock_595 = low
34
    stemp = stemp << 1
35
  end loop
36
   latch_595 = high
37
   asm nop
38
   latch_595 = low
39

40
end procedure
Gast #3665770
Lesenswert?

Deinem Schaltbild nach wirkt -OE

lt. "Fig 1. Functional diagram"

auf die Steuerung der "3-STATE OUTPUTS".

OE = 1 bewirkt, dass alle 8 Ausgänge in den hochohmigen Zustand gehen.
Egal ob der "geschobene" Zustand 1 oder 0 war.
OE = 0 sorgt dafür, dass die aktuellen Zustände wieder ausgegeben 
werden.
Eine Änderung von OE verändert, im klassischen Sinne nichts. Also Vorher 
= Nachher.
Was aber eine eventuelle Endstufe, mit den drei Zuständen macht, ist 
eine andere Sache.
#3665776
Lesenswert?

Wie wär's damit bei der Initialisierung einfach 0x00 in die SR zu 
schieben, diese paar µs die die Relais eventuell an sind werde schon 
kein Weltuntergang sein, und wenn doch könnte man ein RC-Glied an /OE 
hängen und damit die Ausgänge ein paar Millisekunden lang nach dem 
Anlegen der Spannung auf hochohmig schalten.
Gast #3665790
Lesenswert?

Der Baustein hat ein MR. Warum diesen nicht mit den µP-Reset koppeln. Ob 
diese "0" dann der richtige Ausgangszustand ist, ist eine andere Sache.

Wenn mich nicht alles täuscht, wäre die richtige Wahl:
MR:          Mit Reset vom Rechner oder konstant 1.
DS und SHCP: Zum Datenschubsen.
STCP:        Nach vollständiger Ausgabe aller 16/?? Bit einmal kurz auf
             1 und dann wieder 0.
OE:          Finger weg und Konstant 0

... oder so.
Gast #3665814
Lesenswert?

Das Schaltbild von Stephanie ist nicht richtig, weil der pin 12 STCP 
nirgendwo angeschlossen ist. Und dieser Pin ist sehr wichtig weil er die 
Latch steuert. Und die ist dafür da um die empfangenen Daten auf den 
Ausgang von hc595 zu leiten.Zuerst schiebt man sie rein aber sie werden 
im internen Register gespeichert, und die Ausgangspins des hc595 werden 
dabei noch nicht betrofen.Erst wenn mann die Latch schaltet werden die 
Daten auf die Ausgangspins geleitet.
#3665861
Lesenswert?

Amateur schrieb:
> Der Baustein hat ein MR. Warum diesen nicht mit den µP-Reset koppeln. Ob
> diese "0" dann der richtige Ausgangszustand ist, ist eine andere Sache.
Der MR hat nur Einfluss auf das interne Schieberegister, nicht auf das 
Ausgangsregister. Wenn man den MR auf 0 zieht, muss trotzdem noch eine 
steigende Flanke an STCP ausgelöst werden, um die 
Schieberegistereinstellung auf die Ausgänge durchzuschalten.

Das "Problem" mit den zufälligen Ausgangswerten ist in manchen Fällen - 
z.B. LED-Lauflicht - kein wirkliches. In anderen Fällen kann es fatal 
sein, wenn ein Schaltungsteil beim Einschalten anspringt, obwohl er das 
nicht soll. Da gibt es dann eben die hier beschriebenen Gegenmittel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren