Forum: Mikrocontroller und Digitale Elektronik 74HC595 geht nicht


von Michael N. (garril)


Lesenswert?

Nabend,
ich steh auf dem Schlauch und verstehe es nicht. Habe den Code von hier 
zum Porterweitern genommen
http://www.mikrocontroller.net/articles/Porterweiterungen#Porterweiterung_.C3.BCber_74HC595_.28Ausgang.29
(Porterweiterung über 74HC595 Ausgang)

Mittlerweile bin ich soweit, dass die Variablen alle noch wie im 
Original stehen, also so: (Verkabelt ist auf Steckbrett direkt mit dem 
entsprechenden Pin des Controllers. Habe mich beim 74HC595 an die 
Pin-Nr. gehalten)
1
// PORTS
2
#define PORT_com74hc595 PORTC
3
#define PORT_SER     PC0    //74HC595 PIN 14
4
#define PORT_SCK     PC1    //74HC595 PIN 12
5
#define PORT_RCK     PC2    //74HC595 PIN 11
6
#define PORT_OE     PB3    //74HC595 PIN 13

VCC und GND natürlich angeschlossen und den übrigen Pin 10 (MR) hab ich 
dauerhaft direkt an GND geschlossen.

Ich bekomm das ding nicht zum laufen...

Beim ersten mal einschalten sind die ersten 4 Ausgänge High, dann 
nochmal kurz spannungsfrei machen (kompletter Atmega8) und dann sind es 
plötzlich nurnoch die ersten 2. Nochmal, dann leuchten die ersten beiden 
nur kurz auf und alle weiteren male bleibt alles dunkel...
Wo ist denn da der Wurm drin? Ist ja schon komisch, dass es immer das 
gleiche macht, wenns mal stromlos war

Meine main:
1
int main(void)
2
{
3
    com74hc595_init();
4
  com74hc595[0]=0b00011000;
5
  com74hc595_out();
6
 
7
    while(1)
8
    {
9
            _delay_ms( 2000 );
10
11
    }
12
}

von Klaus2m5 (Gast)


Lesenswert?

Michael N. schrieb:
> ...den übrigen Pin 10 (MR) hab ich
> dauerhaft direkt an GND geschlossen.

Du hast also das Schieberegister dauernd auf Reset? Da schiebt defintiv 
nix mehr.

von Garril (Gast)


Lesenswert?

ähm schmarrn auf 5V hab ich ihn. ganz am anfang wars auf gnd,habe ich 
aber geändert.

von Der (Gast)


Lesenswert?

Versuch doch mal mehrfach das gleiche zu senden.

So etwa:
1
int main(void)
2
{
3
    com74hc595_init();
4
  com74hc595[0]=0b00011000;
5
  com74hc595_out();
6
 
7
    while(1)
8
    {
9
       _delay_ms( 1000 );
10
       com74hc595[0]=0b00011000;
11
       com74hc595_out();
12
    }
13
}

von Michael N. (garril)


Lesenswert?

Also so compiliert es wesentlich schneller (scheint sonst etwas nicht 
optimieren zu können), hilft aber auch nichts.

Habe es jetzt so probiert:
1
int main(void)
2
{
3
    com74hc595_init();
4
    while(1)
5
    {
6
      _delay_ms( 2000 );
7
      com74hc595[0]=0b00011000;
8
      com74hc595_out();
9
            
10
11
    }
12
}
Alle LEDn bleiben aus (hängen an den Ausgängen aktuell zum testen)

von Florzo (Gast)


Lesenswert?

Schema - aber etwas plotzlich. Hopp.

von Daniel S. (supernova01)


Lesenswert?

...ich kenne den code jetzt nicht, aber woher weiß die out funktion 
eigentlich wieviel daten sie aus dem Feld senden soll?

DS

von Daniel S. (supernova01)


Lesenswert?

und noch mal kontrollieren das du RCK und SCK nicht vertauscht hast...

von Karl H. (kbuchegg)


Lesenswert?

> (Verkabelt ist auf Steckbrett direkt mit dem entsprechenden Pin
> des Controllers. Habe mich beim 74HC595 an die Pin-Nr. gehalten)

Sehen wollen!
(Bild machen)

Die Sache ist die
Du hast (angeblich) deine Hardware genau so aufgebaut wie gefordert. Du 
benutzt Funktionen, die funktionieren.
Eigentlich müsste alles gehen.
Da es aber nicht funktioniert, hast du irgendwas anders gemacht.
Das kriegen wir aber nicht raus, wenn du auf eine WEb-Seite verweist, 
auf der beschrieben ist, wie es sein SOLLTE.
Dein realer Aufbau muss untersucht werden. Dein Programm muss untersucht 
werden.

(Und ganz ehrlich: um ein 595 das erste mal anzusprechen braucht man 
keine 4 Seiten Code. Dazu genügen 5 Zeilen Code. Ein 595 ist genügsam - 
d.h. man darf an allen Stellen im Code Delays nach Belieben einbauen um 
mit ein paar LED die Ausgänge zu überwachen, bzw. direkt an den 595-Pins 
zu messen, ob auch alle Signale korrekt ankommen. Sind ja nur 3, bzw. 4 
mit OE)

von Michael N. (garril)


Lesenswert?

Ich bin gerade leider nicht zu Hause,werde aber später einen schaltplan 
(wie ich tatsächlich verkabelt habe) hochladen.

In einem alten projekt habe ich schon einige 595 laufen. Leider damals 
zu schlecht dokumentiert um das nochmal vergleichen zu können...

von Michael N. (garril)


Angehängte Dateien:

Lesenswert?

Anbei der Schaltplan auf die schnelle gezeichnet.
Leider sind die Bezeichnungen im Datenblatt etwas anders als die im 
Tutorial. Habe ich da etwas vertauscht?

Versorgung habe ich auf der Zeichnung weg gelassen.

von Eumel (Gast)


Lesenswert?

Wieso benutzt du nicht das Hardware SPI Interface?

von Daniel S. (supernova01)


Lesenswert?

#define PORT_SCK     PC1    //74HC595 PIN 12
#define PORT_RCK     PC2    //74HC595 PIN 11


Beitrag "Re: 74HC595 geht nicht"

komisch, in diesem Datenblatt ist RCLK Pin 12 und SRCLK Pin 11.

Wie gesagt ich kenne den Code nun nicht. Pin 11 ist der Clock der zu den 
Daten gehört, pin 12 der der den Wert parallel übernimmt. Also die 
Bezeichnung ist eigentlich falsch herum. Da es sich aber um Code handelt 
der ja getestet ist, sollte das wohl stimmten. Du kannst es ja auch 
leicht testen indem du 11 und 12 mal tauscht...

RCK = RCLK = ST_CP ->Strobe Clock 12
SCK = SRCLK = SH_CP ->Shift Clock 11


DS

von Daniel S. (supernova01)


Lesenswert?

#define PORT_OE     PB3    //74HC595 PIN 13


eigentlich müsste es doch auch noch ein Portdefine zu PortB geben. Check 
auch mal nach ob dein OE wirklich PB3 ist...

DS

von MR? (Gast)


Lesenswert?

Michael N. schrieb:
> Anbei der Schaltplan auf die schnelle gezeichnet

Warum Pin10 an GND? MR ist low aktiv!

von Michael N. (garril)


Lesenswert?

MR ist an 5V das war wieder die alte überlegung...sry
Werde später mal 11 und 12 tauschen

von Karl H. (kbuchegg)


Lesenswert?

> #define PORT_OE     PB3    //74HC595 PIN 13
>
>
> eigentlich müsste es doch auch noch ein Portdefine zu PortB geben. Check
> auch mal nach ob dein OE wirklich PB3 ist...

Das geht aber nicht.
Der Code geht davon aus, dass ALLE Leitungen zum 595 am selben Port 
hängen.
Einen Teil am PORTC und ein Teil am PORTB, das macht der Code so wie er 
ist, nicht mit. Entweder alles am B oder alles am C. Aber mischen is 
nicht. Kann man natürlich im Code einbauen, aber wie gesagt: so wie der 
Code auf der Siete ist, spielts das nicht.


Den Rest, das 11 und 12 verkehrt rum angeschlossen ist, ... das sehe ich 
auch so.

von Michael N. (garril)


Lesenswert?

Okay wie gesagt tausche ich die beiden später
Komisch,dass die ursprünglichen variablen jedoch so gesetzt sind. Biege 
die dann auch auf einen port

von Karl H. (kbuchegg)


Lesenswert?

Michael N. schrieb:
> Okay wie gesagt tausche ich die beiden später
> Komisch,dass die ursprünglichen variablen jedoch so gesetzt sind. Biege
> die dann auch auf einen port


Ganz wichtige Lektion im Leben eines jeden Progrmmierers:
Kommentare sind Schall und Rauch und öfter falsch als richtig.

Daher: nachprüfen und keinem Kommentar blind vertrauen.

von Michael N. (garril)


Lesenswert?

Programmiere normal nur alleine an größeren Java/PHP-Projekten da 
verlasse ich mich auf die eigenen Kommentare. Aber in diesem Fall konnte 
man dem ganzen wirklich nicht trauen:

11 und 12 getauscht. Pins des gleichen Ports genommen (kam mir sowieso 
schon spanisch vor, warum der das in einem beispiel macht) und schon hat 
es funktioniert :)

Großes Danke und schöne Weihnachtszeit an alle Helfer

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.