Forum: Mikrocontroller und Digitale Elektronik Mit Arduino und Schieberegister 74HCT595


von Eugen F. (jenka18)


Lesenswert?

Guten Abend,

ich bin ein blütiger Anfänger. Sitze schon seit langen an einer Idee, 
die ich leider nicht umsetzen kann, da anscheinend mein Wissen hier 
nicht ausreicht. Und zwar: Seit kurzem verfüge ich über ein Arduiono 
board 328. Damit komm ich so ziemlich gut klar. Mit den Ausgängen auch. 
Programmieren kann ich auch und klappt so, zumindestens das einfachste 
ganz gut...

Jetzt zum eigentlichen Problem. Ich habe eine Reihe an LED's, etwa 50 
Stück in Form eines Herzes gelötet. Ich will Zwei LED'S an jeweils ein 
Port anschließen (50/2=25 Ports sind nötig). Arduiono verfügt über 13 
Ausgänge. Also fehlen mir noch 13.

Nun habe ich gelesen. Mit Hilfe eines Schieberegisters, wie z.B. 
74HCT595, ist es möglich sowas umzusetzten. Und genau an dieser Stelle, 
stoße ich an meine Verständnisgrenzen.

1) Da ich nicht verstehe, wie es dann gehen soll? Also ich Programmiere 
die 13 Ausgänge meines Arduino Mikrokontrollers (soweit klar).
2)Doch wie programmiere ich jetzt den 74HTC595? Brauche ich da eine 
andere Software?
Oder soll ich ihn einfach an die Stelle des Arduino Mikrokontrollers 
setzen und dann so programmieren?
4)
Und die letzte Frage wäre, wie ist es machbar, dass der Microkontroller 
und Schieberegister "zusammenarbeiten" benötigen ich da noch 
irgendwelche Bauteile?

Diese Fragen quälen mich. Ich blicke hier einfach nicht durch.

Vielen Dank für Euer Verständnis....

von Thomas E. (thomase)


Lesenswert?


von Otto (Gast)


Lesenswert?

Was im Datenblatt des 74 hct595 verstehst du denn nicht?

von Eugen F. (jenka18)


Lesenswert?

danke. ich verstehe nicht, wie das mit dem programmieren genau geht...in 
dem oberen link gibt's ja schon paar Testprogramme/Ansteuerung durch 
software.... da komm ich nicht mehr mit...soll ich diese "Programme" in 
meinen MIkrokontroller "jagen"?

von Karl H. (kbuchegg)


Lesenswert?

Eugen F. schrieb:
> danke. ich verstehe nicht, wie das mit dem programmieren genau geht...in
> dem oberen link gibt's ja schon paar Testprogramme/Ansteuerung durch
> software.... da komm ich nicht mehr mit...soll ich diese "Programme" in
> meinen MIkrokontroller "jagen"?

Ähm.
Du kannst ein C-Programm schreiben?

Ein 595 von einem µC aus ansteuern ist doch nur
* die 3 Pins des 595 mit 3 Pins vom µC verbinden
* in der richtigen Reihenfolge mit den richtigen Pins des µC wackeln.

Wie die Reihenfolge sein muss, steht im Link beschrieben.


Dein Denkfehler dürfte sein, dass du dem 595 irgendeine Form von 
Intelligenz zubillgst. Die hat er nicht. Das Programm läuft auf dem 
Arduino. Und anstelle von 3 Led, die der Arduino ansteuert, steuert er 
eben mit 3 Leitungen den 595 an. Wenn die 3 Led, pardon, die 3 Leitungen 
in der richtigen Reihenfolge von 0 auf 1 und wieder zurück wackeln, 
macht der 595 etwas definiertes. Und wenn man diese Einzelteile 
zusammensetzt, dann kann man mit 3 Leitungen vom Arduino ausgehend den 
595 so ansteuern, dass man jede einzelne der 8 Ausgangsleitungen des 595 
auf genau den Pegel setzen kann, den man haben möchte. Und wenn 8 nicht 
reichen, dann hängt man einen weiteren 595 an den vorhandenen an und hat 
so 16 Ausgangsleitungen, die man mit nur 3 Leitungen vom 595 
beeinflussen kann.

Aber das Programm läuft auf dem Arudino. Der wackelt in der richtigen 
Reihenfolge mit 3 Leitungen.

von Oliver R. (sourcebox)


Lesenswert?

Speziell für den Arduino kannst du dir auch dieses hier mal anschauen:

http://arduino.cc/en/Tutorial/ShiftOut
http://arduino.cc/en/Reference/ShiftOut

Dort ist es so beschrieben, dass du es leicht übernehmen kannst.

von Eugen F. (jenka18)


Lesenswert?

ja wie ich ihn  jetzt ansteure weiß ich, habe aus dem link das rauslesen 
können.....es geht jetzt mehr um das C-Programm... weil im andruino 
testprogrammen mehr solche funktionen vorkommen, wie delay(xx); If, esle 
unsw.... hier steht aber sowas wie


.include "m8def.inc"

.def temp1 = r16

; Die Definitionen müssen an den jeweiligen AVR angepasst werden

.equ SCHIEBE_DDR  = DDRB
.equ SCHIEBE_PORT = PORTB
.equ RCK          = PB2     ; SS
.equ SCK          = PB5     ; SCK
.equ SIN          = PB3     ; MOSI

    ldi   temp1, LOW(RAMEND)     ; Stackpointer initialisieren
    out   SPL, temp1
    ldi   temp1, HIGH(RAMEND)
    out   SPH, temp1
;

... das ist es, wo ich nicht wirklich weiß.... was ich damit anfangen 
soll.....gibt es eventuell ein Tutorium für diese Begrifflichkeiten?

von Karl H. (kbuchegg)


Lesenswert?

Eugen F. schrieb:
> ja wie ich ihn  jetzt ansteure weiß ich, habe aus dem link das rauslesen
> können.....es geht jetzt mehr um das C-Programm... weil im andruino
> testprogrammen mehr solche funktionen vorkommen, wie delay(xx); If, esle
> unsw.... hier steht aber sowas wie

Vergiss das im Link angegebene Programm.

Du kannst C-Programmieren?

Gut. Dann lies dir aus dem Link heraus in welcher Reihenfolge welcher 
von 3 Ausgangspins auf 1 und wieder zurück auf 0 gehen muss.
Und dann schreibst du ein C Programm welxches genau das macht. Es ist 
wirklich sehr einfach.
Nicht immer davon ausgehen, dass dir alles mundgerecht vorgekaut wird. 
Da musst du schon selber rann.
Das bischen Portpin auf Ausgang stellen und Pin von 0 auf 1 und wieder 
zurück auf 0 wirst du ja wohl hinkriegen.

: Wiederhergestellt durch User
von Eugen F. (jenka18)


Lesenswert?

aaaah jetzt blicke ich durch))) danke... ich mache es dann, wenn es 
soweit klappt, dann kann ich ja meine "idee" hier zeigen=)

von Karl (Gast)


Lesenswert?

Hm. Google gibt eine Treffer zu 74HTC595 und Arduino aus

z.B diesen hier:

http://hackaday.com/2009/12/31/twitter-based-christmas-ornaments-update/#more-2008

von Eugen F. (jenka18)


Lesenswert?

das ist Ideal! danke... noch ne Frage nebenbei..mit welchem Programm 
fertigt man diese Schaltungen?

von Karl (Gast)


Lesenswert?

Den Schaltplan? Also der wurde sicherlich mit Eagle angefertigt.

PS. in meinem ersten Beitrag oben "eine" durch "einige" ersetzen.

von Eugen F. (jenka18)


Lesenswert?

habe ich mir schon gedacht) danke

von Peter B. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute.
Ich hätte auch noch eine Frage zum 74HCT595.

Der Anhang ist nur eine Skizze.
Natürlich fehlt da noch einiges.

Ich will nur wissen, ob ich das Schaltprinzip des 74HTC595 verstanden 
habe.
74HTC595: http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf

Ich gehe am Anfang wie auf Seite 5  Tabelle 3 vor.

1. Alles LOW bzw. unverändert.
2. STCP kurzer Impuls.
3. OE auf HIGH (Alle Ausgänge sind "gesperrt", "offen", Öffnerprinzip)
4. SHCP kurzer Impuls (dauerhaft, Taktfrequenz des µC) und OE wieder 
freigeben (LOW) und mit SDI(DS) (HIGH) einen Bit in das erste Register 
des IC1 "schieben"
5. Der nächste STCP Impuls schaltet und SDI(DS) LOW (damit wird mein 
erster Ausgang Q0 geschalten und die LED leuchtet)
6. OE wieder auf High (gesperrt)
7. SDI(DS) High
8. SDI(DS) auf LOW und STCP auf HIGH
9. Leuchten jetzt LED1 und LED2???
10. OE auf HIGH
11. 2x STCP Impuls
12. OE auf LOW
13. Leuchten jetzt LED3 und LED4???


Ich hoffe es ist einigermaßen verständlich was ich damit meine.

Danke im Vorraus
Peter B.

von Thomas E. (thomase)


Lesenswert?

Peter B. schrieb:
> Ich will nur wissen, ob ich das Schaltprinzip des 74HTC595 verstanden
> habe.
Irgendwie überhaupt nicht.

595er sind Schieberegister. Wenn man da mehr als acht Bits reinschiebt, 
fällt das erste am anderen Ende wieder raus. D.h. das geht dann an den 
Eingang vom nächsten. Die Shift- und Latch- Leitungen gehen an alle 
595er parallel. Nennt sich Kaskadieren.

Der große Vorteil von Schieberegistern als Porterweiterung ist, daß man 
immer nur drei Portpins braucht, egal wieviele 595er da dranhängen.

MSB wird zuerst ausgegeben.
Am Port anlegen
Einmal am Takt wackeln
Nächstes Bit anlegen
Einmal am Takt wackeln
...

Wenn alle 16 Bit raus sind
Einmal am Latch wackeln.

Und jetzt erst wird das neue Bitmuster für alle Ausgänge gleichzeitig 
übernommen. Das MSB steht jetzt an Q7 vom zweiten, das LSB an Q0 vom 
ersten Register.

Und so richtig flott geht das, wenn man den SPI dafür nimmt.


mfg.

von Peter B. (Gast)


Lesenswert?

Also muss ich den Serial data out von IC1 mit dem SDI von IC2 verbinden?
Vergibt der IC dann so eine Art Busaddresse

Versteh ich das richtig?
Ich setz den DataPin HIGH.
Clock- Takt "wackeln.
Jedesmal wenn ich am Clock Takt wackle wird ein BIT mit "1" wenn der 
DataPin HIGH ist bzw. ein BIT mit "0" hineingeschoben?

Beispiel mit einem 8-Bit Schieberegister:

Ich setze
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt

-LATCH auf HIGH

Dann würden LED2,4,6,8 leuchten?

Der SHCP läuft in der eingestellten Taktfrequenz im Dauerbetrieb, STCP 
ist mein CLOCK Pin und OE mein LATCH?


Danke in Vorraus
Peter B.

von Thomas E. (thomase)


Lesenswert?

Peter B. schrieb:
> Dann würden LED2,4,6,8 leuchten?
Grrr.
Gezählt wird von 0 bis 7. Niemals von 1 bis 8.
Informatiker am Flughafen: "0, 1, 2. Wo ist mein vierter Koffer?"
Das ist fundamental! Wer das nicht draufhat, kriegt einen Knoten im 
Kopf.
Ausserdem redet man ständig aneinander vorbei.

-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt

Das erste Bit, das reingeschoben wird, landet nach 8 Mal schieben auf 
Ausgang Q7, das zweite auf Q6..., das letzte auf Q0.
Deswegen schiebt man das MSB, Bit7, zuerst raus. Dann landet es auf Q7 
und man muß beim Zählen nicht noch umrechnen. Bei 8 Bit kann man ja noch 
die Finger nehmen. Aber bei 32 oder 96 Bit...

-LATCH auf HIGH

einaml toggeln:
-LATCH auf HIGH
-LATCH auf LOW

Peter B. schrieb:
> Der SHCP läuft in der eingestellten Taktfrequenz im Dauerbetrieb, STCP
> ist mein CLOCK Pin und OE mein LATCH?
Nee.

SH_CP = Takt (Shift)
ST_CP = Latch
DS = Daten
Q7' >> DS vom nächsten
OE/ fest an GND
MR/ fest an Vcc

Am Takt wird bei jedem Bit gewackelt, am Latch einmal, wenn alle Bits 
raus sind.
8 Bit = 8 Takte + 1 Latch
16 Bit = 16 Takte + 1 Latch.
usw.

mfg.

von Peter B. (Gast)


Lesenswert?

LED 2,4,6,8 ist schon richtig. Die LED's sind so beschriftet im Plan und 
sie sind an Q1, Q3, Q5, Q7 angeschlossen. Hätte besser mit LED0 anfangen 
sollen bei der Beschriftung, das stimmt schon.




-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-DataPin HIGH.
-Clock Takt
-DataPIN LOW
-Clock Takt
-Latch

Jetzt wären Q1,Q3,Q5 und Q7 auf HIGH?


Wenn ich dann z.B. 4solche IC's hab und ich will LED31 (Q7 am letzten 
IC) HIGH und alle anderen LOW muss ich das eine Bit mit Clock 32mal 
schieben?
Wenn ja, erspart man sich da nicht Takte wenn man die IC's bei Q7' und 
DS nicht verbindet und stattessen CLOCK verbindet und für jeden IC eine 
eigene DS Leitung zum µC habe?

Ist der OE Pin nicht dazu gedacht, die Ausgänge auszuschalten um beim 
weitertakten kein Flackern zu haben???

mfg

von Moritz M. (moritzm)


Lesenswert?

Hallo,

vielleicht hilft das hier deinem Verständnis:

http://conductiveresistance.com/interactive-595-shift-register-simulator/

mfg

von Thomas E. (thomase)


Lesenswert?

Peter B. schrieb:
> Wenn ich dann z.B. 4solche IC's hab und ich will LED31 (Q7 am letzten
> IC) HIGH und alle anderen LOW muss ich das eine Bit mit Clock 32mal
> schieben?
Für 32 Bit, musst du 32 mal schieben. Das musst du aber losgelöst von 
dem einen einzigen in diesem Fall betrachten. Denn die anderen 31 Pins 
müssen ja auch zu ihrem Recht kommen. Bit31 soll 1 sein, also schiebt 
man da eine 1 rein. Die anderen 31 Bit sollen 0 sein, also schiebt man 
da eine 0 rein. Man kann ja nicht davon ausgehen, daß sie vorher schon 0 
waren.

Peter B. schrieb:
> Ist der OE Pin nicht dazu gedacht, die Ausgänge auszuschalten um beim
> weitertakten kein Flackern zu haben???
Beim 595er werden die Bits intern geschoben. An den Ausgängen tut sich 
derweil gar nichts. Erst mit dem Latch wird das neue Bitmuster nach 
"aussen geklappt".

mfg.

von Peter B. (Gast)


Lesenswert?

Ok jetzt hab ich es verstanden.
Danke für den Link, war sehr hilfreich.


Dann haben ja Codes die 8IC's (64bit) ansteuern enorme längen.
Oder gibts da Tricks?

Ich würde das alles gerne mit einem Arduino realisieren.

mfg

von Cyblord -. (cyblord)


Lesenswert?

Peter B. schrieb:
> Dann haben ja Codes die 8IC's (64bit) ansteuern enorme längen.
Nein

> Oder gibts da Tricks?
Ja programmieren lernen. Die Portstates werden dann durch eine 64 Bit 
Zahl repräsentiert und du hast nur eine Funktion welche diese Zahl 
raustacktert. Da hat nix Längen.

> Ich würde das alles gerne mit einem Arduino realisieren.
Was hindert dich?

von Bastler (Gast)


Lesenswert?

>Dann haben ja Codes die 8IC's (64bit) ansteuern enorme längen.

Die Schieberegister schaltet man normalerweise hintereinander.
Sie lassen sich wie ein Großes (hier mit 64bit) ansteuern.

Das "Herausgetakte" erledigt man in einer Schleife.
Die Schleife läuft nicht von 0 bis 7 sondern von 0 bis 63.
Das ist alles!

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.