Bitschiebereien - Teil 3: Weiterführendes zum 74HC595 und 7-Segment-Anzeigen am Raspi

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,
    auf zum dritten Teil mit dem Titel


    Bitschiebereien - Teil 3: Weiterführendes zum 74HC595 und 7-Segment-Anzeigen am Raspi

    Dieser Teil war ursprünglich gar nicht geplant, aber beim Erstellen der beiden ersten Teile sind mir noch ein paar Sachen eingefallen, die ich Euch nicht vorenthalten will.
    Wir benötigen dafür allerdings einen komplett neuen Schaltungs-Aufbau und ein paar zusätzliche Bauteile:

    Material-Liste:
    2 Stück 7-Segment-Anzeige (14,2 mm/0.56") mit Dezimalpunkt, rot, gemeinsame Anode
    16 Stück Widerstand 470 Ohm
    2 Stück Schieberegister 74HC595 DIP 16 (oder SO16 mit Adapter)
    1 großes Breadboard
    2 kleine Breadboards
    xx Dupont-/Jumper-Kabel male/male in versch. Farben
    natürlich einen Raspi, dabei ist es egal, ob Zero, Pi1, Pi2, Pi3 als A, A+, B oder B+ Modell
    und, wie immer, ein Multimeter zur Kontrolle

    Natürlich könnt ihr wieder Levelshifter verwenden, aber darauf gehe ich im Laufe dieses Teils nicht weiter ein.
    Auch die Themen Vorwiderstände und gemeinsame Anode/Kathode wurden in den beiden ersten Teilen ausführlich behandelt und ich lasse sie hier aussen vor.

    Zuerst sehen wir uns das Schieberegister noch mal genauer an:

    Funktionsweise des 74HC595 Schieberegister

    Die prinzipielle Arbeitsweise des IC kennen wir ja bereits ... über den Pin DS werden bitweise Daten übertragen, die durch einen Clock-Impuls auf SHCP in das aktuelle interne Register übernommen werden. Durch einem Impuls auf STCP werden die internen acht Register in das Ausgangsregister übertragen und sind dann an den Ausgängen Q0 bis Q7 "sichtbar".
    Bisher haben wir der Einfachheit angenommen, dass ein Clock-Impuls auf SHCP bewirkt, dass das aktuelle interne Register um eins erhöht und bei einem Überlauf wird dieses Register wieder auf das erste zurückgesetzt wird.
    Das ist allerdings jetzt nicht ganz korrekt.
    Man kann sich den Baustein wie ein Rohr mit acht Abzweigungen vorstellen. Der Durchmesser der Abzweigungen entspricht dabei dem Innen-Duchmesser des Rohres und sind im "Normal-Zustand" verschlossen.

    shiftregister-shcp.jpg
    In der Skizze habe ich die Abzweiger mit Q0 bis Q7 bezeichnet, die internen Register haben die Bezeichnungen R0 bis R7.
    Zur besseren Veranschaulichung habe ich für nicht gesetzte Bits (LOW) weisse und für gesetzte Bits (HIGH) schwarze "Kugeln" verwendet.
    Die rechte Seite des Rohres entspricht dem Eingang DS (Pin #14) des 74HC595, die rechte Seite dem Ausgang Q7S (Pin #9).
    Durch einen Impuls auf SHCP schieben wir jetzt das HIGH-Bit von rechts in unser Schiebe-"Rohr" auf die Position R0. Dadurch "fällt" links, also an Q7S, das LOW-Bit heraus, das vorher an Position R7 war.


    shiftregister-stcp.jpg
    Wird jetzt ein Clock-Impuls auf die STCP-Leitung gegeben, wird der Inhalt der internen Register R0 bis R7 in die Ausgänge Q0 bis Q7 übertragen. Der Inhalt von R0 bis R7 bleibt dabei aber erhalten.


    shiftregister-shcp-all.jpg
    Wiederholen wir die Schiebe-Funktion aus dem ersten Bild noch siebenmal, dann sind alle unsere internen Register mit HIGH-Bits belegt. Zur Veranschaulichung schieben wir jetzt noch ein LOW Bit hinterher. Dadurch "fällt" ein HIGH-Bit aus dem Ausgang Q7S.
    Den Ausgang QS7 (Pin #9 / serial data output / Ausgang serielle Daten) hatten wir bisher immer unbeachtet und deshalb auch unbeschaltet gelassen. Er kommt dann in's Spiel, wenn man zwei oder mehrere 74HC595 in Reihe schaltet.
    Bei einer Reihenschaltung mehrerer Bausteine kann dieser Pin verwendet werden, um Datenbits vom vorderen zum nachfolgenden IC weiterzugeben. Dazu wird Pin #9 (Q7S) der ersten Bausteins mit Pin #14 (DS) des nächsten Bausteins verbunden. Dessen Pin #9 geht dann wieder zu Pin #14 des nächsten usw.


    shiftregister-shcp-q7s.jpg
    In unserem Beispiel oben wird durch den Schiebe-Impuls an SHCP das Bit aus R7 des ersten Schiebe-Register über den DS-Eingang des zweiten Schiebe-Register in dessen internes Register R0 übernommen.
    Bei jedem weiteren Schiebe-Takt wird nach demselben Schema ein weiteres Bit aus dem ersten in das zweite Schiebe-Register übertragen.
    Analog zum ersten IC "fallen" dabei natürlich auch beim zweiten IC die "überflüssigen Bits" aus dem Ausgang Q7S heraus.
    Damit dieses Konstrukt synchron arbeitet, müssen ausserdem die Pins SHCP und STCP aller Bausteine miteinander verbunden werden.


    Soviel zur, jetzt korrekten, Beschreibung der Funktion des 74HC595 und der besonderen Bedeutung des Ausgang Q7S.
    Es gibt noch zwei weitere Pins, denen wir diesmal Beachtung schenken werden: Pin #10 (MR / master reset ) und Pin #13 (OE / output enable ).
    Allerdings sind die Funktionen recht trivial: mit OE lässt sich der 74HC595 abschalten (Anzeige ist aus). Der Master Reset bewirkt, wie der Name schon sagt, ein Rücksetzen des Bausteins. Dabei werden die internen und Ausgabe-Register auf 0 gesetzt.

    Zurück zu unserer Schaltung.

    Aufbau der Schaltung:

    Anmerkung:
    Ich habe in meinem Aufbau das rechte Schieberegister mit der linken Anzeige und das linke mit dem rechten 7-Segment-Modul verbunden.
    Warum? Nun, das linke Schieberegister wird später direkt an den Raspi angeschlossen. Der rechte 74HC595 ist sozusagen der "Slave", der vom linken Baustein "gefüttert" wird. Wir lesen Zahlen aber von links nach rechts. Deshalb repräsentiert die erste übertragene Zahl die Zehnerstellen ... muss also über den "Slave" auf die linke Anzeige.
    Das klingt jetzt vielleicht etwas kompliziert, aber wenn ihr die Schaltung in Aktion seht, wisst ihr wie das gemeint ist.
    Natürlich könnt ihr das Ganze auch vollkommen anders verkabeln.
    Achtet aber darauf, das ihr die Verbindungen zum ersten bzw. zweiten IC nicht untereinander vermischt. Das gibt später Fehler, die schwer zu finden sind.


    Wir fangen wieder mit den Anzeigen und den Schieberegistern an.
    Dazu verbinden wir die Pins 1,2,4,5,6,7,9 und 10 der Anzeigen wie im Bild dargestellt nach oben und unten jeweils über einen Widerstand mit einer freien vertikalen Verbindungsleiste.
    Als nächstes verdrahten wir, wie im zweiten Teil, die Schieberegister mit den Vorwiderständen der 7-Segment-Anzeigen. Achtet, wie bereits gesagt darauf, die Verbindungen nicht untereinander zu vermischen.

    Code
    Anzeige Pin  #7  (A)  -> 74hc595 Pin #15 (Q0)
    Anzeige Pin  #6  (B)  -> 74hc595 Pin #1  (Q1)
    Anzeige Pin  #4  (C)  -> 74hc595 Pin #2  (Q2)
    Anzeige Pin  #2  (D)  -> 74hc595 Pin #3  (Q3)
    Anzeige Pin  #1  (E)  -> 74hc595 Pin #4  (Q4)
    Anzeige Pin  #9  (F)  -> 74hc595 Pin #5  (Q5)
    Anzeige Pin  #10 (G)  -> 74hc595 Pin #6  (Q6)
    Anzeige Pin  #5  (DP) -> 74hc595 Pin #7  (Q7)

    Schliesslich bekommen unsere zwei Schieberegister noch Verbindungen zu Vcc (jeweils Pin #16) und GND (jeweils Pin #8) und die beiden 7-Segment-Anzeigen ebenfalls eine Verbindung zur Versorgungs-Spannung.

    Legt jetzt testhalber Pin 10 (MR) der ICs auf Vcc und Pin 13 (OE) auf GND.
    Nach Einschalten der Stromzufuhr sollten alle Segmente beider Anzeigen leuchten. Falls nicht, habt ihr entweder einen Fehlerverbaut oder aber die Ausnahme mit gemeinsamer Kathode trifft bei Euch zu.
    Passt es, dann entfernt die Verbindungen von MR und OE wieder.

    Als letztes widmen wir uns der Verkabelung der Schiebe-Register untereinander bzw. mit dem Raspi. Dazu, wie üblich, wieder alles stromlos machen.
    Diesmal benötigen wir, wie in Teil 1, zunächst:
    SHCP (Pin #11 / shift register clock input / Schiebetakt)P
    STCP (Pin #12 / storage register clock input / Transfer der internen Bits in das Ausgaberegister)
    DS (Pin #14 / serial data input / Eingang bitweise Daten)

    Dazu kommen jetzt noch die Pins:
    MR (Pin #10 / master reset / Rücksetzen)
    OE (Pin #13 / output enable / Ausgaben ein/aus)
    QS7 (Pin #9 / serial data output / Ausgang serielle Daten)

    Die GPIOs für SHCP, STCP und DS habe ich, wie im Beispiel von Teil 2, bei GPIO17, GPIO27 und GPIO22 belassen.
    Wir verbinden also GPIO17 (Pin #11) mit SHCP (Pin #11), GPIO27 (Pin #13) mit STCP (Pin #12) und GPIO22 (Pin #15) mit DS (Pin #14) des ersten (linken) Baustein.
    Dann verbinden wir SHCP des ersten (linken) Bausteins mit SHCP des zweiten (rechten) Bausteins sowie STCP des ersten (linken) Bausteins mit STCP des zweiten (rechten) Bausteins.
    Es folgt der "Überlauf" ... dazu wird Q7S des ersten (linken) Bausteins mit DS des zweiten (rechten) Bausteins verbunden.

    Jetzt fehlen nur noch die neuen Verbindungen OE und MR ...
    Dafür habe ich GPIO23 und GPIO24 vorgesehen. Also jetzt noch OE des ersten (linken) Bausteins mit GPIO23 und MR des ersten (linken) Bausteins mit GPIO24 verbinden.
    Diese beiden Signale geben wir an den zweiten Baustein weiter, indem wir
    OE des ersten (linken) Bausteins mit OE des zweiten (rechten) Bausteins und MR des ersten (linken) Bausteins mit MR des zweiten (rechten) Bausteins zusammenschalten.
    Achtung! Ich habe im Fritzing-Schema den Master-Reset (orange Verbindung vom PI aus) zuerst auf den zweiten und von da auf den ersten Baustein gelegt. Das dient nur der besseren Übersicht, weil sonst die Verbindungen vom Raspi ein ziemlich undurchschaubares Wirrwarr dargestellt hätten, und hat keinen speziellen Grund.

    Zum Abschluss noch die Masse des Raspi mit der Masse des Breadboards verbinden, damit wäre unsere Schaltung fertig aufgebaut.

    Machen wir noch mal eine kurze Rückschau zur 7-Segment-Anzeige

    Hier kommt in Grunde nichts Neues, sondern ich möchte, wie im zweiten Teil versprochen, auf die Darstellung einfacher Texte eingehen.
    Sehen wir uns die Segment der Anzeige noch mal genauer an:

    220px-7_segment_display_labeled.svg.png

    Quelle: https://en.wikipedia.org/wiki/Seven-segment_display

    Neben den 10 Ziffern 0 bis 9 können, durch geschickte Auswahl der Segmente und mit etwas Kreativität, auch fast alle Buchstaben des Alphabets angezeigt werden. Vielleicht ist dem einen oder anderen von Euch das schon bei z.B. tragbaren CD-Playern begegnet.
    Mit den Segmenten C, D, E und G könnte ein kleines O dargestellt werden, mit den Segmenten E, F, A, B und G ein großes P, durch C, D und E ein kleines U usw.
    Im Software-Part habe ich versucht alle möglichen Kombinationen aufzuführen.
    -> Hier auf Wikipedia <- findet ihr auch noch weitere Informationen zu diesem Thema.

    Weiter geht's mit der Software

    Das Software-Beispiel:

    Beim Demo-Code handelt es sich um den Beispielcode aus dem zweiten Teil, den ich ein wenig umgestaltet und um vier Funktionen erweitert habe.

    Anmerkungen zum Code-Beispiel
    Den Part mit den Ziffern lasse ich jetzt mal weg. Den hatten wir schon im zweiten Teil.
    Nach demselben Schema habe ich mal versucht alle möglichen Buchstaben zu definieren. Ich hoffe, ich habe jetzt keinen vergessen. Wir müssen da jetzt nicht unbedingt alle durchegehen, denke ich.
    Wir nehmen mal das große A und das kleine und große U als Beispiele. Die restlichen Definitionen findet ihr im Source-Code.

    Der Buchstabe A ist gut darstellbar. Es handelt sich dabei um eine 8, deren unteres Segment (D) aus ist:

    Das kleine u ist auch recht simpel. Dafür werden die C, D und E beleuchtet. Wenn man das kleine u als einziges u belässt,

    kann man das große U z.B. als Buchstaben V verwenden. Das ist ebenfalls ziemlich einfach und sieht aus wie eine 8, bei der die Segmente A und G dunkel bleiben:

    Wie gesagt, lässt man das nur das kleine u als einziges u zu, kann man das große U als V verwenden.
    Über die Image-Suche findet ihr noch mehr solcher Beispiele: https://www.google.de/search?q=7-segment+letters&tbm=isch


    Die neuen Funktionen:

    void masterReset( uint8_t mrPin )
    Diese Funktion zieht den Pin MR kurz auf LOW um ihn anschliessend wieder auf HIGH zu setzen. Dadurch wird ein Reset des 74HC595 ausgelöst, der alle Register auf 0 setzt.

    void outputDisable( uint8_t enPin )
    Mit dieser Funktion kann das Schieberegister abgeschaltet werden. Dabei werden auch die Ausgänge ausgeschaltet und die Anzeige ist dunkel.

    void outputEnable( uint8_t enPin )
    Damit ist es möglich den 74HC595 wieder zu aktivieren.

    void displayPattern( void )
    Diese Funktion läuft über alle 256 möglichen Werte uns stellt sie im Display als Muster dar. Bei diesem Beispiel ist, aufgrund der langen Laufzeit, sehr schön zu beobachten, wie das rechts angezeigte Muster im nächsten Anzeige-Zyklus nach links wandert.

    void displayDigits( void )
    Das ist nur eine simple Schleife, mit der die Ziffern 0 bis 9 dargestellt werden. Auch hier ist gut zu sehen, wie der zuvor angezeigte Wert nach links "geschoben" wird.

    void displayLetters( void )
    Analog zur Ziffern-Anzeige werden alle definierten Buchstaben ausgegeben.

    void display2Digits( uint8_t val )
    Diese Funktion gibt einen zweistelligen Wert auf die Anzeigen aus.

    Mehr gibt's dazu jetzt nicht zu sagen. Probiert es einfach aus ...

    Übersetzt wird das Beispiel mit

    Code
    gcc -Wall -o 74hc595-2x7-segment 74hc595-2x7-segment.c -lpthread -lpigpio


    Anschliessend kann das Programm mit

    Code
    sudo ./74hc595-2x7-segment


    ausgeführt werden.


    Und das war Teil 3.
    Ich hoffe, dieses dreiteilige Tutorial hat Euch geholfen und/oder Spaß gemacht und es sind nicht allzuviele Fehler drin.

    Und, wie immer: Fragen und Anregungen bitte in einem eigenen, gesonderten Thread z.B. unter "GPIO & Elektrotechnik" mit Verweis auf dieses Tutorial posten.
    Eure Mitleser werden es Euch danken ;)

    ciao,
    -ds-

  • Bitschiebereien - Teil 3: Weiterführendes zum 74HC595 und 7-Segment-Anzeigen am Raspi? Schau mal ob du hier fündig wirst!

  • Hallo dreamshader,

    warum begreift denn niemand, das CMOS - IS vom Typ HC am Raspi russisches Roulette sind. Der H-Pegel des Pi liegt nur geringfügig über dem verbotenen Eingangsbereich der Eingänge. Der H-Pegel des Pi wird gerade so an der untersten Grenze des zulässigen Eingangssignals liegen. Wozu geben denn IC - Hersteller Datenblätter heraus? Das wird nur unter günstigsten Bedingungen funktionieren! Schon die geringste Störeinstrahlung kann die Kommunikation stören.

    Wenn solche IS direkt an den Pi angeschlossen werden, dann muß unbedingt ein Typ 74HCT verwendet werden! Der ist von allen Logik-IS verfügbar, und ist von der Logik her absolut Pinkompatibel. Der kostet in der Regel auch genau den gleichen Preis. Der einzige Unterschied ist, das der Einhangspegel optimal zu den GPIO des Pi passen.

    Warum also die Empfehlung zu diesem IC, wenn es einen gleichen Typ gibt, der sich viel besser eignet.

  • Hallo,

    was bringt es denn, wenn man hier gavierende Fehler postet und an einer ganz anderen Stelle dan darüber diskutiert wird. Wer garantiert denn, das andere Leser überhaupt den neuen Thread lesen und diese Angaben für richtig und Nachbausicher halten ? Das währe wie die Falschmeldung auf der ersten Seite und zwei Zeilen Dementi, die keiner liest.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!