Forum: Mikrocontroller und Digitale Elektronik Problem mit Schieberegister 74HC595 und RaspberryPi


von Lukas (Gast)


Lesenswert?

Hallo zusammen,

Ich bin neu in dieser Welt der Mikrocontroller ;) und bin gerade daran 
eine LED-Matrix mittels vier Schieberegister zu steuern.

Nun wollte ich in einem ersten Schritt das Programm für nur ein einziges 
Schieberegister testen. Ich will also lediglich 8 LED's mit einem 
8Bit-Schieberegister steuern. Hierzu verwende ich den 74HC595 von 
Reichelt: 
https://secure.reichelt.com/74HC-595/3/index.html?&ACTION=3&LA=446&ARTICLE=3269&artnr=74HC+595&SEARCH=74HC595
(das erhaltene Schieberegister hat aber nun die Typennummer: 
U74HC595AG?!)

Hier ist das Python-Programm mit welchem ich das Schieberegister 
ansteuern will:
////////////////////////////////////////////////////////////////////////
# Module importieren
# ******************

import time
import RPi.GPIO as GPIO

# init GPIO
# *********

GPIO.setmode(GPIO.BOARD)

GPIO.setup(23, GPIO.OUT) #Clock    alt 4
GPIO.setup(19, GPIO.OUT) #Datbit   alt 17
GPIO.setup(21, GPIO.OUT) #Latch    alt 18

GPIO.output(23, GPIO.LOW)
GPIO.output(19, GPIO.LOW)
GPIO.output(21, GPIO.LOW)

# Definieren des Laufmusters
# **************************

matrix= [
        [1,0,0,0,0,0,0,0],
        [0,1,0,0,0,0,0,0],
        [0,0,1,0,0,0,0,0],
        [0,0,0,1,0,0,0,0],
        [0,0,0,0,1,0,0,0],
        [0,0,0,0,0,1,0,0],
        [0,0,0,0,0,0,1,0],
        [0,0,0,0,0,0,0,1],
        [0,0,0,0,0,0,0,1],
        [0,0,0,0,0,0,1,0],
        [0,0,0,0,0,1,0,0],
        [0,0,0,0,1,0,0,0],
        [0,0,0,1,0,0,0,0],
        [0,0,1,0,0,0,0,0],
        [0,1,0,0,0,0,0,0],
        [1,0,0,0,0,0,0,0]
        ]

# Schieberegister leer machen
# ***************************

for i in range(8):
        GPIO.output(19, GPIO.LOW)
        GPIO.output(23, GPIO.HIGH)
        GPIO.output(23, GPIO.LOW)
GPIO.output(21, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(21, GPIO.LOW)

# Hauptprogramm
# *************

for i in range(8):
        GPIO.output(19, GPIO.LOW)
        GPIO.output(23, GPIO.HIGH)
        GPIO.output(23, GPIO.LOW)
GPIO.output(21, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(21, GPIO.LOW)

# Hauptprogramm
# *************

while 1:

        for j in range(16):
                for k in range(8):
                        if matrix[j][k]== 1:
                                GPIO.output(19, GPIO.HIGH)
                        else:
                                GPIO.output(19, GPIO.LOW)
                        GPIO.output(23, GPIO.HIGH)
                        GPIO.output(23, GPIO.LOW)
                GPIO.output(21, GPIO.HIGH)
                time.sleep(0.2)
                GPIO.output(21, GPIO.LOW)
///////////////////////////////////////////////////////////


Nun habe ich aber das Problem, dass immer zwei Ausgänge gleich schalten.
Also die Ausgänge (0 und 1), (2 und 3), (4 und 5) und (6 und 7) schalten 
immer zusammen. So als wäre es nur ein 4-Bit Schieberegister?!

Kann sich jemand von euch den Grund dafür erklären?
Der Output-Enable habe ich auf den Ground und der MR auf Vcc verdrahtet.

Ich bin gerade echt ratlos...

Grüsse
Lukas

von Marc H. (marchorby)


Lesenswert?

Lukas schrieb:
> Ich bin neu in dieser Welt der Mikrocontroller ;)

Hast du am Schieberegister auch nen Abblockkondensator dran?

von Lukas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Marc,
Nein ich habe kein Kondensator dran.

Ich habe es ähnlich dem angehängtem Schema verdrahtet.

von Stefan F. (Gast)


Lesenswert?

Dann mach mal einen 100nF an VCC und GND. Könnte durchaus schon die 
Problemursache sein.

von Lukas (Gast)


Lesenswert?

Okay, vielen Dank für die rasche Antwort.

Ich werde mir gleich so ein Kondensator besorgen und melde mich dann 
wieder.

von Noch einer (Gast)


Lesenswert?

Wenn es dann immer noch nicht zuverlässig funktioniert...

Sind GND und Clock wirklich so kurz? Ab so etwa 30cm Drahtlänge kommen 
die HC durcheinander.

Die anderen Leitungen sind nicht so kritisch.

von 6a66 (Gast)


Lesenswert?

Lukas schrieb:
> Ich bin neu in dieser Welt der Mikrocontroller ;) und bin gerade daran
> eine LED-Matrix mittels vier Schieberegister zu steuern.

Hallo Lukas,

ich empfehle Dir, eine Systematische Fehlersuche zu erlernen anstatt zu 
Fragen. Lernst Du mehr.
a) schließe erst einmal EINE LED an den Ausgangsport an und schau ob 
sich da was tut, wenn nicht suche nach möglichen Fehlerursachen
b) Schließe mehrere LEDs an und simuliere damit das Verhalten der 
Ansteuerung deines Schieberegisters/Matrix. Führe Dein Programm mit 
Einzelschritt durch und schau ob die Signale in der richtigen 
Reihgenfolge kommen
c) Baue Deine Schaltung Stück für Stück weiter auf und erweitere Deinen 
Code entsprechend
d) besorge Dir eien einfaches Hilfsmittel um Logikpegel an bestimmten 
Stellen zu messen (nannte man früher Logikstift). Damit kannst Du dann 
auch in Echtzeit zumidest erahnen was an Digitalleitungen passiert.

rgds

von Falk B. (falk)


Lesenswert?

@  Noch einer (Gast)


>Sind GND und Clock wirklich so kurz? Ab so etwa 30cm Drahtlänge kommen
>die HC durcheinander.

Unsinn. Wenn gleich ab 30cm Leitungslänge man sich schon mal um das 
Thema Wellenwiderstand Gedanken machen muss.

von Stefan F. (Gast)


Lesenswert?

Er hat schon Recht, ab 30cm Leitungslänge sind Probleme zu erwarten.
Du kennst dich vielleicht mit der Theorie (Wellen) gut aus. Dafür kenn 
ich die Praxis und Falk ganz sicher auch.

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.