Schieberegister 74HC595 funktioniert nicht!

  • Moin Moin und Hallo aus Flensburg.
    Ich habe mich eben hier angemeldet und hoffe auf eine aktive Community. Vielleicht kann ich auch meinen Teil dazu beitragen.


    Zu meinem problem:


    Ich arbeite mich seit ein paar Wochen mit kleinen experimenten in die Elektronik und in den Raspberry Pi ein. Das meiste klappt auch ganz gut, nur bei dem o.g. Schieberegister verzweifel ich langsam. Ich habe über der Suchmaschien meines Vertrauens und auch hier im Forum noch keine sachdienlichen Hinweise gefunden.


    Ich habe alles wie folgt verkabelt: (Am Raspberry Pi von Links nach Rechts: 26, 19, 13)


    [Blocked Image: http://jazzconaction.de/download/sketch.png]


    Die Verschaltung müsste eigentlich stimmen,


    Der Code:



    Achja, ist mit Hilfe von WirinPi in der Shell.


    Wenn ich das Skript nun ausführe, passiert nichts. Ich habe die Spannung jeweils an den 3 GPIO`s gemessen und an +. Die wird geschaltet...


    Vielen Dank schonmal für die Mühe


    Thomas

  • Du rufst dein ResetPins() gar nicht auf.
    Für den Takt und den Latch solltest du diese beim Starten direkt auf LOW setzen, damit du sicherstellst, das die auch den richtigen Status am Anfang haben.
    Wenn du dann einen Takt oder ein Latch ausführen willst mach immer ein HIGH und direkt danach wieder zurück auf LOW. Ist auch kein sleep dabei nötig, denn die Software ist da eh langsamer, als das was der Register verträgt.


    Gewöhn dir am besten direkt an immer alle 8 Bit zu setzen. Egal ob 7 davon 0 sind. So weisst du immer was im Register gespeichert ist. Ansonsten schiebst du die Bits einfach immer weiter, und der Status der anderen Bits ist ungewiss.


    Bau dein Script mal mit diesen hinweisen um, dann sollte es klappen.


    p.s. Habe jetzt nicht ins Datenblatt geguckt, aber ich hab da immer gerne den Fehler gemacht den Takt und Latch Pin zu vertauschen...

  • Vielen Dank für die Rasche Antwort. Ich habe das Skript nun soweit angepasst:



    Da tut sich immer noch nichts.
    Du hast das mit den 8-bits setzen angesprochen. Soweit bin ich noch nicht, dass ich das ganze verstanden habe, wie es genau funktioniert. Ich habe im Internet nur wage Beschreibungen gefunden. Ich arbeite mir gerade durch ein Buch durch, wo das so vorgestellt wird.


    Kannst du mir das mit dem latch etc. kurz erklären? Ich blicke da nicht ganz durch. Also das Prinzip in Schritten habe ich nicht verstanden. Danke

  • Also der 74HC595 ist ein 8-bit Schieberegister. Das heisst er kann 8 Zustände speichern (HIGH oder LOW, bzw an oder aus). Und er "schiebt" diese Zustände immer eine Stelle weiter, wenn neue Daten eingegeben werden.


    Das heißt also einfach erklärt:
    Jedes mal wenn du am Takt das Signal einschaltest (hohe Flanke, also LOW auf HIGH) wird der Zustand am Daten-Pin eingelesen. Dieser wird auf dem unterem Bit (also Ausgang 0) gespeichert. Das was vorher für 0 gespeichert wurde, wird auf 1 geschoben, was voerher auf 1 gespeichert war wird auf 2 geschoben usw.
    Desshalb sagte ich solltest du immer alle 8bit schreiben. Dann weisst du immer, welche Zustände die 8 Ausgänge haben.
    Willst du also die LED an Ausgang 0 zum leuchten bringen wäre es:


    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 0
    Takt an, Takt aus
    Datenpin: 1
    Takt an, Takt aus


    Die 0en werden immer weiter geschoben, und die letzte 1 dann auf Ausgang 0 gespeichert.


    Schaltest du das Signal am Latch-Pin dann an und wieder aus werden diese eingegebenen Daten auf die Ausgänge geschrieben.
    Hier solltest du auch immer den Pin auf HIGH und direkt wieder auf LOW schalten, denn der reagiert auch auf eine hohe Flanke (also beim Übergang von 0 auf 1).


    Der Schieberegister hat also 2 interne Speicher. Ein Speicher übernimmt die Daten, die du eingibst, der andere kontrolliert die Ausgänge.
    Das ist so gemach, weil man auch mehrere hintereinander schalten kannst. Also würden durch den ersten Register auch die Daten des zweigen "durchgeschoben" bevor man dann mit dem Latch-Pin die Ausgänge aktiviert.

  • Vielen Dank für die ausführliche Erklärung. Allerdings ist mir das alles bereits bewusst gewesen. Was mir gefehlt hat, hast du mit dem Datenpin 0 Takt An, Takt aus, erklärt. Somit verstehe ich nun auch wie das abläuft. Ich versuche mal den Code anzupassen.

  • Ich sehe auch gerade in deiner Schaltung, das du den Reset-Pin frei gelassen hast.
    Normal verbindet man den Pin mit der Spannungsversorgung, wenn der nicht kontrolliert werden soll.
    Wenn du den auf GRDN legst wird der Register reseted, wenn dort Spannung anliegt nicht.
    Wenn da gar kein Kabel anliegt könnte durch Induktion oder sonstige Störungen unvorhergesehene Effekte auftreten.

  • Okay, da kein ein kleiner Fehler manchmal große Probleme bereiten.


    Es leuchtet nun. Zwar auch was nicht leuchten soll, aber das werd ich schon hinbekommen.


    Mein aktueller Code:



    Vielen Dank nochmal für die Mühe!
    [hr]
    Eine Frage habe ich noch, wie bekomm ich den Speicher jetzt geleert? Muss ich die Reset jetzt an Masse legen?

  • Code
    for((i=0; i<=8; i++))


    So verarbeitest Du 9 Werte aus einer Tabelle mit nur 8, das geht nicht gut, erst recht nicht mit dem Schieberegister. :(
    Also besser:

    Code
    for((i=0; i<8; i++))
    oder
    for((i=0; i<=7; i++))


    Gruß, mmi