Forum: Mikrocontroller und Digitale Elektronik Immer noch Probleme mit 74HC595


von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Hallo
ich habe immer noch Probleme mit dem HC595 Schiebregister, beim 
einschalten flackern alle Ausgänge willkürlich.
Ich habe schon folgendes unternommen:
1
            5V
2
             |
3
            | | 4,7kOhm
4
            | | und 10kOhm ausprobiert
5
             |
6
PIN13--------------PC3 des Atmegas
7
des 74HC595 (OE)
dazu dann folgende Programmroutine beim einschalten (s.unten):

Ausserdem habe ich auch mal SCL des 74HC595 an den Reset des Atmegas 
gelegt, irgendwie hat nichts gebracht!

Trozdem flackern die Relais die ich an z.B JP4 zwischen 1 und 2 hängen 
habe (s.Anhang)! Den JP3 habe ich kurzgeschlosse. Das es dort den R1 
gibt, ist im Nachinein ein Fehler!
Hat da noch irgendeiner einen Tip für mich, was ich noch ausprobieren 
kann, bin mit meinem Latein komplett am Ende....

Vielen Dank!
1
Description  : Initializing
2
*/
3
void com74hc595_init()
4
{
5
    /* set Ports to OUT */
6
  DDR_com74hc595 |= ( 1 << DDR_SER);
7
  DDR_com74hc595 |= ( 1 << DDR_SCK);
8
  DDR_com74hc595 |= ( 1 << DDR_RCK);
9
10
#ifdef WITH_OE
11
  DDR_com74hc595 |= ( 1 << DDR_OE);
12
#endif
13
14
    /* set SER to LOW */
15
  PORT_com74hc595 &= ~(1<<PORT_SER);
16
17
    /* set SCR und RCK to HIGH */
18
  PORT_com74hc595 |= (1<<PORT_SCK);
19
  PORT_com74hc595 |= (1<<PORT_RCK);
20
#ifdef WITH_OE
21
  PORT_com74hc595 |= (1<<PORT_OE);
22
#endif
23
24
  AusgangUnsetAll();
25
  AusgangOut();     
26
27
#ifdef WITH_OE
28
  PORT_com74hc595 &= ~(1<<PORT_OE);
29
#endif
30
}

dazu dann die Ports:
1
#define PORT_com74hc595 PORTC
2
#define PORT_SER     PC0    //74HC595 PIN 14
3
#define PORT_SCK     PC1    //74HC595 PIN 11
4
#define PORT_RCK     PC2    //74HC595 PIN 12
5
#define PORT_OE     PC3    //74HC595 PIN 13
6
7
#define DDR_com74hc595  DDRC
8
#define DDR_SER     DDC0  //74HC595 PIN 14
9
#define DDR_SCK     DDC1  //74HC595 PIN 11
10
#define DDR_RCK     DDC2  //74HC595 PIN 12
11
#define DDR_OE       DDC3  //74HC595 PIN 13
12
13
// use with /OE
14
#define WITH_OE

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

1
void com74hc595_init()
2
{
3
  /* vorher Ports besetzen, vor allem OE auf 1 setzen */
4
  PORT_com74hc595 = (1<<PORT_OE);
5
6
  /* set Ports to OUT */
7
  DDR_com74hc595 = (1<<DDR_SER)|(1<<DDR_SCK)|(1<<DDR_RCK)|(1<<DDR_OE);
8
9
  AusgangUnsetAll(); // was auch immer die treiben
10
  AusgangOut();      // sie werden alle bits setzen
11
12
  PORT_com74hc595 &= ~(1<<PORT_OE); // erst jetzt Ausgang freigeben
13
}
> Ausserdem habe ich auch mal SCL des 74HC595 an den Reset des Atmegas
> gelegt

Da würde wohl eher MR des 595 dran kommen, ist letztlich aber egal.

: Bearbeitet durch User
von Markus P. (sebastianwurst)


Lesenswert?

Was ist denn mit MR gemeint, im DB steht das nicht...

Normalerweise war der PullUp aber schon richtig, oder? Ob jetzt mit 4,7k 
oder 10k spielt doch bestimmt nicht die große Geige, oder?

von Karl H. (kbuchegg)


Lesenswert?

Markus P. schrieb:
> Was ist denn mit MR gemeint, im DB steht das nicht...

Ihr meint beide dasselbe.
In dem einen Datenblatt heisst das SCL (Clear), im anderen MR (Master 
Reset)


Die SCL bringt dir nicht viel. Denn der Pin löscht nur das 
SChieberegister und nicht das Latch. Du müsstest also sofort einen PUls 
am RCK nachschieben, damit dann auch das Latch sicher auf 0 steht.

> Trozdem flackern die Relais die ich an z.B JP4 zwischen 1 und 2 hängen habe 
(s.Anhang)!

Das will mir ehrlich gesagt nicht eingehen.
Nach dem Anlegen der Spannungsversorgung dauert es ein paar Takte, bis 
der µC aus dem Resez draussen ist. Nehm ich den Zwangsreset durch den 
Brownout noch dazu, dann sind das ein paar Millisekunden, bis dann der 
Mega die Kontrolle soweit hat um die 595 sauber zu initialisieren.

Ich würde dem OE einen großen Pullup-Widerstand spendieren, damit 
gesichert ist, dass in dieser Zeit der 595 auf Tristate-Ausgang geht. Da 
kann dann in weiterer Folge nichts mehr flackern, weil die ULN2803 dann 
nicht durchschalten.

Wenn es immer noch flackert, dann stimmt mit deiner Ansteuerung was 
nicht.

: Bearbeitet durch User
von Frank L. (frank_l)


Lesenswert?

Hallo,
korrigiere mal die Init-Routine.
1
void com74hc595_init()
2
{
3
  /* set Ports to OUT */
4
  DDR_com74hc595 = (1<<DDR_SER)|(1<<DDR_SCK)|(1<<DDR_RCK)|(1<<DDR_OE);
5
6
  /* vorher Ports besetzen, vor allem OE auf 1 setzen */
7
  PORT_com74hc595 |= (1<<PORT_OE);
8
9
  AusgangUnsetAll(); 
10
  AusgangOut();      
11
12
  PORT_com74hc595 &= ~(1<<PORT_OE); // erst jetzt Ausgang freigeben
13
}

Wennn Du das so in meinem Artikel oder in meinen Sourcen gefunden hast, 
bitte kurzes Feedback, damit ich das ändern kann.

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

Eine Idee hab ich noch.
Da sich das ganze am Port C abspielt:

Über welchen µC reden wir eigentlich?
Auf einigen µC liegt am Port C das JTAG Interface und das ist per 
Default eingeschaltet. Wenn das nicht per Fuse abgeschaltet wird, dann 
funktionieren am Port C einige Pins nicht so, wie sie sollten.

von Markus (Gast)


Lesenswert?

@Karl Heinz
Hi das ist das NetIo mit einem 1282p Atmega,

@Frank,

ich habe den irgednwo aus dem Fourm, weiss jetzt aber leider nicht mehr 
wo genau von wem das gekommen ist.... Oben im Kopf steht auch kein 
Kommentar...

Aber was soll ich denn Überhaupt ändern, ich sehe da garkeinen 
Unterschied in dem was du gepostet hast!

Danke ersteinmal schonmal, ich werde die Tipps einmal zu Hause 
durchspielen und dann melde ich mich noch einmal!

von Seano L. (Gast)


Lesenswert?

Wenn das nur die Pins betrifft die von Port C kommen dann wird es wie KH 
schrieb an der Konfig wegen JTAG liegen, Pullups hast du ja schon 
probiert. Konfiguriere mal die Ports entspr. um, dann müsste das 
Geflacker weg sein.

Ich hatte gestern das selbe Problem an einem 595, bei mir waren es 
schlecht gelötete Pullups bzw. Pulldowns (diskrete Schaltung, Taster an 
den entspr. Pins, kein MC), nachgelötet -> Geflacker weg.

von Frank L. (frank_l)


Lesenswert?

Hallo Markus,
die Änderung ist, das Setzten des OE nach der Initialisierung der 
Ausgänge.

Das Setzen des OE vor der Initialisierung als Ausgang dürfte in diesem 
Fall zweckfrei sein.

In meinen Sourcen hatte ich das bereits geändert.

Sollte übrigends kein Angriff sein, sondern nur eine Frage. Weil es gibt 
einen Artikel und in der Codesammlung etwas dazu. Es wäre unschön, wenn 
hier Fehler nicht korrigiert würden. Wobei das auch an meine Adresse 
geht. Ich hatte es vollkommen verdrängt.

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

Frank L. schrieb:
> Hallo Markus,
> die Änderung ist, das Setzten des OE nach der Initialisierung der
> Ausgänge.
>
> Das Setzen des OE vor der Initialisierung als Ausgang dürfte in diesem
> Fall zweckfrei sein.

Nö ist es nicht.
Da der Pin noch auf Eingang gestellt ist, schaltet das den Pullup 
Widerstand ein. Und damit wird der Pin schon mal nach High gezogen.
Nach dem Umschalten auf Ausgang ist der Pin dann auch 
ausgangs-treiberseitig auf High.

Ziel der Sache ist es, den Pin so schnell wie möglich nach Anlegen der 
Spannung auf High zu kriegen. Ob das der interne Pullup macht, oder die 
Output-Treiber Stufe ist in diesem Fall egal. High ist High.

: Bearbeitet durch User
von Frank L. (frank_l)


Lesenswert?

Schaumal in diesen Artikel.

http://www.mikrocontroller.net/articles/Porterweiterungen#Datei_.28com74hc595.c.29

Die dort beschriebene Routine funktioniert bei mir schon ziemlich lange 
ohne Probleme.

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

@Markus

> Trozdem flackern die Relais

Könntest du das noch mal näher ausführen? Was muss man sich darunter 
vorstellen?
Ist das ein einmaliges kurzes Zucken der Relais nach dem Einschalten 
oder dauert das eine gewisse Zeit lang an?
Denn eigentlich sollte das Programm die Pins nicht länger als ein paar 
µs in einem (aus Sicht des 595) undefinierten Zustand lassen. Gleich 
danach ist aber die Initialisierung durch und dann dürfte da nichts mehr 
klackern. Ob ein Relais auf derart kurze Pulse im µs Bereich mechanisch 
reagiert, weiß ich nicht. So recht vorstellen kann ich es mir nicht.

von MaWin (Gast)


Lesenswert?

> Da der Pin noch auf Eingang gestellt ist, schaltet das den Pullup
> Widerstand ein. Und damit wird der Pin schon mal nach High gezogen.
> Nach dem Umschalten auf Ausgang ist der Pin dann auch
> ausgangs-treiberseitig auf High.

Ja, wobei ausgangsseitig sowieso schon ein pull up existiert

   5V
             |
            | | 4,7kOhm
            | | und 10kOhm ausprobiert
             |
PIN13--------------PC3 des Atmegas
des 74HC595 (OE)

> Ziel der Sache ist es, den Pin so schnell wie möglich nach Anlegen der
> Spannung auf High zu kriegen. Ob das der interne Pullup macht, oder die
> Output-Treiber Stufe ist in diesem Fall egal. High ist High.

Es war also mein Ziel, zumindest nicht AUF LOW zu schalten.

Das hat Frank L. offensichtlich nicht verstanden und wollte die 
Korrektur kaputtkorrigieren

"korrigiere mal die Init-Routine."

von Felix P. (fixxl)


Lesenswert?

Markus P. schrieb:
>
1
> Description  : Initializing
2
> */
3
> void com74hc595_init()
4
> {
5
>
6
> ...
7
> 
8
>#ifdef WITH_OE
9
>   DDR_com74hc595 |= ( 1 << DDR_OE);
10
> #endif
11
> 
12
> ...
13
> 
14
> #ifdef WITH_OE
15
>   PORT_com74hc595 &= ~(1<<PORT_OE);
16
> #endif
17
> }
18
>
Das Problem liegt meines Erachtens darin, dass du zuerst den OE-Pin als 
Ausgang definierst (DDR auf 1) und ihn erst danach auf High-Level legst 
(PORT auf 1), so dass er zwischendurch kurzzeitig ein "Low-Ausgang" ist 
und die zufälligen Anfangszustände des Speicherregisters aktiv an die 
Ausgänge gelegt werden.

Ich würde, bevor du irgendetwas anderes tust, PORT auf 1 setzen, damit 
ist der Pullup aktiviert - parallel zum ohnehin externen Pullup, schadet 
also nichts - und wenn dann DDR auf 1 gesetzt wird, gibt es auch keinen 
Low-Puls mehr, sondern du hast einen Ausgang auf High-Pegel. 
Anschließend kannst du dann das Schieberegister mit 0en füllen, sie in 
die Latches übernehmen und danach PORT auf 0 setzen, um die Ausgänge zu 
aktivieren.

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Halllo,
Ich habe alle eure Tips durchgesetzt...und jetzt geht es. Wodran es 
genau gelegen hat, weiss ich noch nicht. Ich glaube ich werd auch nicht 
mehr auf Fehlersuche gehen..

Danke

von Frank D. (Gast)


Lesenswert?

Nichts gegen C, tolle Sprache, leider kann ich sie nicht. Habe zur 
Ansteuerung eines HC595 Bascom verwendet, ging auf Anhieb.

Gruß  Frank

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.