Schaltung mit 74HC595 Schieberegister

Gast #7115260
Lesenswert?

Hallo zusammen,

ich wollte vor kurzem eine Schaltung mit den 74HC595 Schieberegistern 
aufbauen. Also habe ich mich etwas informiert und eine kleine Platine 
erstellt.
Leider funktioniert diese nicht und kann den Fehler nicht entdecken.
Evtl. kann mir jemand von euch helfen (übersehe ich nur eine 
Kleinigkeit?)

Im Anhang die Schaltung, der Arduinocode dazu sowie ein Bild der 
Platine.
Hier das Datenblatt der verwendeten Schieberegister
https://datasheet.lcsc.com/lcsc/2202252130_Shenzhen-Fuman-Elec-74HC595A_C110383.pdf

Den Attiny24 kann ich über einen Arduino programmieren allerdings 
leuchtet keine einzige LED.
Ich würde mich echt freuen, wenn mir jemand einen Tipp hat :)

Viele Grüße
Alex
Angehängte Dateien:
#7115301
Lesenswert?

Das geht so nicht. Der HC595 braucht nach dem Einlesen der Daten einen 
positiven  (LHL) Übernahme Impuls am RCLK Pin-12. das ist der 
zugrundeliegende Fehler.

Dann suche Dir besser ein englischsprachiges Datenblatt. Mein Chinesisch 
ist nicht zu gut:-)

https://www.ti.com/lit/ds/symlink/sn74hc595.pdf?ts=1656755164079&ref_url=https%253A%252F%252Fwww.google.com%252F

Dann ist auch der "NC" Pin-13 befremdlich, weil der normalerweise bei 
westlichen Chips der "OE" Pin-13 ist, um die Ausgänge aktiv zu machen. 
Der ist allerdings dem Schaltbild nach richtig beschaltet.

Spass beiseite. Um den HC595 richtig zu steuern, muss das etwas geändert 
werden. Da fehlt ein viertes Steuersignal am RCLK Pin-12.

Die SPI Shift Clock muss an SCK. Das sind jeweils acht Taktimpulse für 
jeden HC595. Wenn Du alle sechs HC595 mit Daten beschickt hast, muß an 
die RCLK Pins ein LHL "Übernahme Impuls" ausgegeben werden um die soeben 
erhaltenen Daten im Eingangs Shift Register in die Ausgangsdatenregister 
zu übernehmen. Das ist deshalb notwendig, weil der HC595 doppelt 
gepuffert ist um Datenverschiebungen während des Einlesens zu vermeiden.

Dann sollte es funktionieren, insofern der zugehörige Code funktioniert. 
Den habe ich mir allerdings nicht näher angeschaut.
Gast #7115325
Lesenswert?

Gerhard O. schrieb:
> Dann ist auch der "NC" Pin-13 befremdlich, weil der normalerweise bei
> westlichen Chips der "OE" Pin-13 ist, um die Ausgänge aktiv zu machen.
> Der ist allerdings dem Schaltbild nach richtig beschaltet.
Ja, seltsam, so dürfte er sich nicht HC595 nennen.

> Spass beiseite. Um den HC595 richtig zu steuern, muss das etwas geändert
> werden. Da fehlt ein viertes Steuersignal am RCLK Pin-12.

Ich hätte jetzt (ohne pers. Erfahrung mit dem 595) gesagt, dass das 
soweit richtig ist. SER ist das serielle Eingangssignal, CLOCK ist der 
Schieberegistertakt und DATA ist der Übernahmepuls (RCLK) auf die 
Ausgänge.
Welches vierte Signal meinst du?
Ob jedoch die SW das richtig macht, habe ich nicht geprüft.
Auch Pin 10 (/MR) liegt auf HIGH. Müsste aus HW-Sicht gehen.
Gast #7115333
Lesenswert?

Erstmal wow, vielen Dank für die ganzen Antworten :D

Wolfgang schrieb:
> Ich vermisse Abblockkondensatoren an den 74HC595
D. T. schrieb:
> wie schon erwähnt wurde, fehlen die Abblockkondensatoren.
HildeK schrieb:
> … die fehlenden Blockkondensatoren an den HC595!
Sind die Kondensatoren wirklich (zwingend) notwendig? Ist mir bei vielen 
Beispielschaltungen nicht aufgefallen.

D. T. schrieb:
> Wen ja, warum hast Du PIN 10 und 13 angeschlossen?
> Laut Google Translator bedeuten die PINs "floating".
Hab mich aus Unwissenheit einfach an die Beispielschaltungen gehalten 
und das übernommen. Werde morgen die Platine aber mal mit Lötkolben und 
Skalpell bearbeiten!

McMix schrieb:
> Tausch mal A5 und A7
Bringt leider nichts – habe inzwischen schon alle Kombinationen 
ausprobiert :D

Gerhard O. schrieb:
> Das geht so nicht. Der HC595 braucht nach dem Einlesen der Daten
> einen positiven  (LHL) Übernahme Impuls am RCLK Pin-12. das ist der 
zugrundeliegende Fehler.
> …
> Da fehlt ein viertes Steuersignal am RCLK Pin-12.
Also aktuell versuche ich mit den Pins 14  12  11 (+9) die 
Schieberegister zu steuern.
Wenn ich das richtig verstanden habe, wird das Schieberegister mit 
Daten- und Clocksignal gefüttert. Wenn man dann alle Ausgänge schreiben 
möchte, aktiviert man den Pin 12.
#7115335
Lesenswert?

HildeK schrieb:
> Ich hätte jetzt (ohne pers. Erfahrung mit dem 595) gesagt, dass das
> soweit richtig ist. SER ist das serielle Eingangssignal, CLOCK ist der
> Schieberegistertakt und DATA ist der Übernahmepuls (RCLK) auf die
> Ausgänge.
> Welches vierte Signal meinst du?

Ich bezog mich auf das RCLK Signal als "Viertes" Signal. Also müssen 
alle PIN-12 zusammen an einen weiteren uC Pin gelegt werden und nach dem 
Beschreiben aller HC595, schickt man ein einmaliges Übernahme 
Taktsignal. So habe ich es immer bei mir gemacht. Fehlende etwaige 
Abblock_Cs sollten natürlich nicht fehlen.
Gast #7115342
Lesenswert?

Alex schrieb:
> Bringt leider nichts – habe inzwischen schon alle Kombinationen
> ausprobiert :D

Blindes Probieren ist bei Elektronik oft nicht ratsam.
Guck dir die Signale an, die vom µC kommen und prüfe, ob das so 
aussieht, wie im Datenblatt des 74HC595.
Was hast du für Messmittel?
Besitzt du zum Programmieren eine IDE mit Simulator/Debugger?

Nochmal: Warum benutzt du nicht das USI des µC als SPI?
Gast #7115346
Lesenswert?

> Blindes Probieren ist bei Elektronik oft nicht ratsam.

Er muss es kombinatorisch durchpermutieren!
Dann bestehen 100%ige Erfolgsaussichten.

Noch schlauer waere ein Versuchaufbau auf einem Brotbrett gewesen.
(Firma: matzetronics) #7115347
Lesenswert?

Alex schrieb:
> Sind die Kondensatoren wirklich (zwingend) notwendig? Ist mir bei vielen
> Beispielschaltungen nicht aufgefallen.

Nö. Das schreiben alle Teilnehmer hier nur, weil sie Langeweile haben -- 
nicht.
Ja, sie sind zwingend nötig. Und vor allem bei Chips mit CMOS Ausgängen. 
Das liegt in der Natur der CMOS Endstufen begründet.

Mir ist bei solchen Dingen nicht klar, warum man nicht mal vorher auf 
einem Steckbrett so einen 595 durchtestet oder sich das Datenblatt von 
NXP anguckt, oder beides. Da wird schon mal eine Platine hergestellt und 
erst dann werden die Fehler entdeckt.
Gast #7115351
Lesenswert?

Wolfgang schrieb:
> Alex schrieb:
> Guck dir die Signale an, die vom µC kommen und prüfe, ob das so
> aussieht, wie im Datenblatt des 74HC595.
> Was hast du für Messmittel?
> Besitzt du zum Programmieren eine IDE mit Simulator/Debugger?
>
> Nochmal: Warum benutzt du nicht das USI des µC als SPI?

Aktuell nur ein etwas besseres Multimeter (Brymen BM869s).
Oszi etc. fehlt mir leider noch.

Ich verwende zum Programmieren die normale Arduino IDE (+einen Arduino 
Nano as ISP und den ATTinyCore).

Otto schrieb:
> Noch schlauer waere ein Versuchaufbau auf einem Brotbrett gewesen.
Matthias S. schrieb:
> Mir ist bei solchen Dingen nicht klar, warum man nicht mal vorher auf
> einem Steckbrett so einen 595 durchtestet oder sich das Datenblatt von
> NXP anguckt, oder beides.

Normalerweise mache ich das auch so. Allerdings hatte ich die Chips 
nicht zur Hand und dachte mir "was soll schon schief gehen :D"

Nochmal wegen den Kondensatoren:
Was für eine Größe/Typ würdet ihr mir da empfehlen. An welchen Pins?
Gast #7115379
Lesenswert?

Alex schrieb:
> Matthias S. schrieb:
>> Pro Chip einen 100nF von VCC nach GND - und das dicht am IC.
> Dann probiere ich das als erstes!

Die vergessliche Edelbastler aus den 80igern haben diesen Kondensator 
oben auf den Schaltkreis gesetzt und die Beinchen mit den GND und Ub 
Pins verbunden.
#7115397
Lesenswert?

Alex,

mein Rat wäre, einen Arduino (Nano?) und Steckbrett mit einem HC595 
drauf zusammenzuschalten und dann diese Anordnung testen und 
Fehlersuchen bis das funktioniert.



Ich verwende bei mir z.B. diesen Code (Nicht Arduino Syntax):
#include <SPI.h>

void SPI_MasterInit()
{
  SPCR |= (1<<SPE)|(1<<MSTR);
  SPSR |= (1<<SPI2X);
}

// nicht vergessen PortPins als Ausgaenge zu setzen

// Sample Daten um bei jeden HC595 ein LED mehr einzuschalten
uint8_t HC595data[] = {0x01,0x03,0x07,0x0F, 0x1F, 0x3F};

void spi_drive_U2()
{
    SPDR = HC595data[0]; // Sende Daten nacheinander zu den HC595ern
    while(!(SPSR & (1<<SPIF))); // Warte bis Daten raus sind
    SPDR = HC595data[1]; // Sende Daten
    while(!(SPSR & (1<<SPIF))); // Warte bis Daten raus sind
    SPDR = HC595data[2]; // Sende Daten
    while(!(SPSR & (1<<SPIF))); // Warte bis Daten raus sind
    SPDR = HC595data[3]; // Sende Daten
    while(!(SPSR & (1<<SPIF))); // Warte bis Daten raus sind
    SPDR = HC595data[4]; // Sende Daten
    while(!(SPSR & (1<<SPIF))); // Warte bis Daten raus sind
    SPDR = HC595data[5]; // Sende Daten
    while(!(SPSR & (1<<SPIF))); // Warte bis Daten raus sind
    UPDATE_STROBE_HC595  // RCLK Impuls an PIN-12
}
// Geht auch als Loop zum Schreiben
UPDATE_STROBE_U2_U4 ist ein Macro: (Passe das an Deinen uC an)

#define UPDATE_STROBE_HC595   PORTB &= ~(1 << 2); \
                              delayMicroseconds(1);         \
                              PORTB |= (1 << 2);  \
                              delayMicroseconds(1);         \
                              PORTB &= ~(1 << 2);
// oder diesen Macro:
#define WAIT_SPI_SEND_COMPLETE  while(!(SPSR & (1<<SPIF)));

    SPDR = HC595data[0]; // Sende Daten nacheinander zu den HC595ern
    WAIT_SPI_SEND_COMPLETE // Warte bis Daten raus sind
...
Gast #7115432
Lesenswert?

Gerhard O. schrieb:
> mein Rat wäre, einen Arduino (Nano?) und Steckbrett mit einem HC595
> drauf zusammenzuschalten und dann diese Anordnung testen und
> Fehlersuchen bis das funktioniert.

Ohne Messmittel ist das leichter gesagt als getan.
Da kann man sich allenfalls mit ein paar LEDs und super-slow Motion 
durchfummeln.
#7115462
Lesenswert?

Wolfgang schrieb:
> Gerhard O. schrieb:
>> mein Rat wäre, einen Arduino (Nano?) und Steckbrett mit einem HC595
>> drauf zusammenzuschalten und dann diese Anordnung testen und
>> Fehlersuchen bis das funktioniert.
>
> Ohne Messmittel ist das leichter gesagt als getan.
> Da kann man sich allenfalls mit ein paar LEDs und super-slow Motion
> durchfummeln.

Das sehe ich nicht ganz so schwarz. In solchen Fällen ist es am Besten 
es zuerst mit bekannt, funktionierendem Code und HW auszuprobieren. 
Speziell bei AVR ist der Gebrauch der SPI HW nicht schwer. Und wenn man 
funktionierenden Code schon hat, dann funktioniert das schon mit etwas 
Glück ohne Messmittel. Es gibt ja auch Bibliotheken für Arduino und 
HC595. Mein einfaches Programmbeispiel von vorher stammt ja auch aus 
funktionierendem Code.

Es sind ja auch nur wenig Bedingungen zu erfüllen um den SPI Port 
benutzen zu können:

Benutzte Pins als Outputs setzen
SPI Control Register setzen um den SPI Port zu aktivieren

SPI Data Register schreiben
Wiederholt SPI-Flag Bits checken um zu warten bis alle Bits weggeschickt 
wurden.
Die nächsten Bytes so senden; wenn fertig:
Dann am Ende den Übernahme Taktpuls senden um die Daten an die Ausgänge 
der HC595 zu transferieren.

Hier die Arduino SPI Lib:
https://github.com/Simsso/ShiftRegister74HC595
https://github.com/Simsso/ShiftRegister74HC595/blob/master/examples/example/example.ino

Oder

https://timodenk.com/blog/shift-register-arduino-library/

https://learn.adafruit.com/adafruit-arduino-lesson-4-eight-leds/the-74hc595-shift-register
Gast #7115543
Lesenswert?

Wenn ich aus China nicht schon welche erhalten hätte, würde ich es mir 
auch kaum vorstellen, daß jemand diesen Aufwand betreibt. Das wird ja 
eigentlich schnell entdeckt. Auch in meinem Fall waren die Kommentare 
dann entsprechend.

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