Forum: Mikrocontroller und Digitale Elektronik Porterweiterung durch kaskadierte Schieberegister


von Stephanie (Gast)


Angehängte Dateien:

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

von 6A66 (Gast)


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

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Und warum keine I2C Portextender?

von Max H. (hartl192)


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?

: Bearbeitet durch User
von Dummschwaetzer (Gast)


Lesenswert?

VCC und GND brauchen die aber auch

von Felix P. (fixxl)


Lesenswert?

Wenn der Einschaltzustand deiner Relais keine Rolle spielt, kannst du OE 
fest auf GND legen und die dritte Leitung für STCP statt OE verwenden. 
Dummerweise sind die Anfangszustände bei den mir bekannten Versionen des 
74HC595 nämlich nicht festgelegt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stephanie schrieb:

> Ich muss mit 3 Ausgängen 16 Relais ansteuern. Dafür möchte ich 2
> Schieberegister kaskadieren.

Gute Entscheidung.

> Die Relais sollen vom durchschieben der
> Ausgänge nichts mitbekommen.

Ist gewährleistet.

Wie man es richtig macht, steht hier:

  http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

von Fachmann (Gast)


Lesenswert?

Es gibt schon sehr viele Beiträfe zu diesem Thema in dem Forum.
Muss man nur finden.

von Georg (Gast)


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

von Felix P. (fixxl)


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.

: Bearbeitet durch User
von Fachmann (Gast)


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

von Amateur (Gast)


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.

von Max H. (hartl192)


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.

: Bearbeitet durch User
von Amateur (Gast)


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.

von Fachmann (Gast)


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.

von Fachmann (Gast)


Lesenswert?


von Felix P. (fixxl)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.