Probleme mit 74HCT595N

Guten Tag

Ich würde gerne ein Lauflicht mit ca 20 bis 30 Kanälen über einen Arduino steuern ... bei meinen Internetrecherchen bin ich dann über den 74HCT595N gestolpert und konnte mit Mühe und Not noch 5 Stück in einem Laden ergattern (die scheinen nicht mehr produziert zu werden!?)

Nun war jedoch die Freude nur von kurzer Dauer, den nachdem ich den Chip angeschlossen und ein kleines Test-Arduino-Programm geschrieben hatte das mir in einer Schleife einfach nur via Data/Clock abwechselnd eine 0 & 1 sendet und danach vom Schieberegister ins Ausgaberegister übernimmt machte das Schieberegister was es wollte ...
Selbst nachdem die 3 Steueradern vom Arduino entfernt hatte macht das Ding weiterhin weiter (alle LEDs an ... alle LEDs aus ... Dimmen ... manche LEDs aus ... andere wieder ein ...)

Habe jetzt die Daten mal via Hand eingegeben (also ohne Arduino die Adern auf 5V gelegt) --> gleiches Chaos

Hat hier jemand Erfahrung mit diesem Schieberegister? - denn ich weiß langsam echt nicht mehr was hier noch richtig und falsch ist ...

  • das Arduino-Programm scheint es nicht zu sein, sonst müsste es ja zumindest beim direkten auflegen der Adern klappen
  • der Chip wurde schon gegen einen anderen getauscht
  • die Chipansteuerung scheint mir auch richtig:

0V Q7 Q6 Q5 Q4 Q3 Q2 Q1
| | | | | | | |

| |
| O

Q7' Reset Clock Schieber. Dimmen Data Q1 +5V
(+5V) zu (0V)
Ausgangsreg.

Wäre für jede Idee dankbar --> wenn ich nämlich sehe wie lange ich an dem Mist jetzt schon ohne Ergebnis hocke vergeht einem die Lust :~

hi,

ich verwende den 74HC595 ohne probleme, also gib nicht auf.
im playground gibt es eine sehr gute beschreibung, wie es geht, aber der playground ist momentan nicht erreichbar.
wirst sehen, ist ganz einfach. vor allem mußt Du die daten und clock nicht "händisch" rausschicken, sondern dafür gibt es shiftOut.
http://arduino.cc/en/Reference/ShiftOut

gruß stefan

Welchen Strom gönnst Du den LEDs? Wie versorgst Du die Schieberegister mit Strom? Über den Arduino und deisen über USB?
Grüße Uwe

hi,

seite gefunden:

gruß stefan

@ Eisebaer:
Vielen Dank für den Link, Stefan - werde mir das Tutorial mal durchlesen.
Wenn ich das richtig nachgelesen habe liegt der Unterschied vom 74HC595 und dem 74HC595N nur an den negierten Ausgängen - das Softwaretechnisch zu korrigieren sollte ja eigentlich kein größeres Problem werden :smiley:
(Mir fällt auch beim groben Drübersehen auf, das die nen Elko an den "ST_CP" auf 0V legen - vielleicht is das schon der Fehler ...)

@ uwefed:
Hab nen Gesamtstrom von 26mA wenn alle LEDs an sind - also eigentlich innerhalb der Leistungsfähigkeit.
Hatte auch gedacht das ich ihn vielleicht überlaste da er anfangs Chaos macht und später alles dunkel bleibt ...

Der gesamte Stromanschluss läuft über Laptop-USB auf Arduino (Nano V3) und über dessen 5V-Pin auf das Schieberegister.

Gruß Scorch

hi,

das ist kein elko, sondern ein 0815-kondensator. ist aber nicht notwendig, hab ich nie verwendet. das ist sicher nicht der grund.
bau einfach die schaltung so auf wie im tutorial, mit oder ohne kondensator, das funkt.

gruß stefan

Der Kondensator wird nicht gebraucht, er ist sogar falsch.

Das shift-out tutorial ist auch seit jahren falsch (bezuegilch des kondensators auf einer der datenleitungen).

Link: Arduino Forum

Aber der Kondensator verursacht normalerweise keine Fehler, bei mir funktionierten die Schieberegister auch mit fälschlicherweise eingebautem Kondensator.

Grüße,
J3RE

... wenn man keinen Kondensator mehr von nem Elko unterscheiden kann ... bin reif für Ferien XD

Der Aufbau war bis auf den Kondensator identisch (der ja dann auch sowieso entfällt)

Hab die 3 Testprogramme mal ausprobiert und siehe da das 1.1 hat schon ne Reaktion gezeigt ... es geht also doch :stuck_out_tongue_closed_eyes:
Skript 1.2 macht jedoch nichts - und Skrypt 1.3 blinkt nur kaum wahrnehmbar ...

Werd mich heute Abend mal in den shiftOut()-Code einlesen (dessen nichtverwendung wohl mein Fehler war) und dann sollte dieses Lauflicht endlich mal laufen!

Danke @ All :wink:

Gruß Scorch

hi,

script1 sollte die leds binär hochzählen lassen, also
00000001
00000010
00000011
00000100
00000101
00000110
usw.

script2 sollte bei eingaben in den seriellen monitor der IDE leds anmachen, ich glaube Du mußt zahlen von 1-8 eingeben.

script3 sollte ohne zutun mit 2 schieberegistern funken.

immer alles mit voller stärke.

gruß stefan

hi,

was mir noch aufgefallen ist:

Wenn ich das richtig nachgelesen habe liegt der Unterschied vom 74HC595 und dem 74HC595N nur an den negierten Ausgängen

ich konnte noch nie datenblätter lesen, aber bist Du Dir da sicher?
für mich steht das N für die bauform, und ob HC oder HCT bestimmt den spannungsbereich, in dem sie arbeiten. wie gesagt, bin nicht sicher, aber miß doch nach...

gruß stefan

74HC595 bezeichnet den Baustein, der Buchstabe am Ende die Bauform.

74HC595N DIP16 plastic dual in-line package; 16 leads (300 mil) 
74HC595D SO16 plastic small outline package; 16 leads;body width 3.9 mm
74HC595DB SSOP16 plastic shrink small outline package; 16 leads; body width 5.3 mm
74HC595PW TSSOP16 plastic thin shrink small outline package; 16 leads; body width 4.4 mm
74HC595BQ DHVQFN16 plastic dual in-line compatible thermal enhanced very thin quad flat package;

Und, ja, HC oder HCT beschreibt vor allem die Eingangsspannungen.
HC: Vin High = 2,5V (typ)
HCT: Vin High = 1,6V (typ)

Aber der Baustein wird nach wie vor produziert und ist verfügbar. Sogar bei Ebay!

Grüße

Gunther

Codeerklärung:
SN ... Herstellercode. Bestimmte Hersteller verwenden bestimmte Buchstaben.
74 ... TTL-Schaltung. Auch 54 für militärischen Temperaturbereich.
HTC ... Nach welcher Technologie der Baustein aufgebaut ist. Davon hängt der Stromverbrauch, der max Strom pro Ausgang, die Spannungen für H und L und die max Geschwindigkeit ab. Viele Schaltungstechnologien sind untereinander nicht kompatibel. HC bedeutet High speed Cmos; HCT High speed Cmos TTL Spannungscompatibel.
595 ... Funktion des IC. In diesem Fall Schieberegister serial in, paralell out
N ... Die Buchstaben danach geben Temperaturrange, Gehäuseformen und dadurch max Verlustleistung und max Ausgangsströme, ob Bleifrei.
Bei anderen ICs auch Schaltungsoptionen ( wie zB das D beim L293 was integrierte Dioden bedeutet oder das A beim PCF8574 ändert die I2C Basisadresse) Stromverbrauch (zB beim ATmega328), Genauigkeit (zB bei Temperatursensoren)
Nicht aufgedruckt ist die Verpackungsform und Anzahl der Teile pro Verpackungsform.
Weitere Daten aufgedruckt sind und die eigentlich nicht zum sind Produktcode zählen sind Herstellungswoche und Jahr Herstellerangaben (zb auf welcher Fertigungsstraße bzw Fabrik produziert)

Beispiele
Philips: http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf Tabelle 1 Seite 2.
Texas Instruments https://www.sparkfun.com/datasheets/IC/SN74HC595.pdf Tabelle auf Seite 1
SGS Thomson 74HC595 pdf, 74HC595 Description, 74HC595 Datasheet, 74HC595 view ::: ALLDATASHEET ::: order codes unter Zeichnung oben rechts.
On Semiconductor Technical Documentation Tabelle rechts Seite 1

Logikfamilien:

http://www.mikrocontroller.net/articles/74xx
http://www.elektronik-kompendium.de/public/schaerer/digsemin.htm

Grüße Uwe

The following error or errors occurred while posting this message:
Your session timed out while posting. Please try to re-submit your message.
No subject was filled in.
The message body was left empty.

Und weg war der ellenlange Text ... :0

Naja dann das ganze nochmal von vorne :~

00000001
00000010
00000011
00000100
00000101
00000110

Ja und genau da lag auch mein Denkfehler - hab bisjetzt net viel mit Chips etc. zu tun gehabt und mein Bezug zum Thema Schieberegister war die Funktion der Kleinsteuerung Easy von Möller/Eaten ... und da läuft das ganze Bit für Bit und nicht via Binäre-Code ... deswegen war da auch nichts mit Eingabe via Hand. :grin:

ich konnte noch nie datenblätter lesen, aber bist Du Dir da sicher?

... kann dir da nur sagen: du bist nicht allein :wink:

@ uwefed & guntherb:
Danke für die ausführlichen Erklärungen!!!
Bei mir in der Schule is das eher nach "learning by doing" - bekommst die Teile hingelegt und dann mach mal ... demnach haben auch die ersten Skripte für den Arduino ausgesehen =(
Das mit dem Spannungsunterschied von HCT und HC hab ich bei nem ähnlichen Chip gelesen und dabei stand dann auch das mit dem N = negiert.

Werd mir die Links mal als Abend-Lektüre vornehmen 8)

Hätte dann aber noch ne Frage zum Skript:
Das folgende Skript hab ich aus der oben verlinkten Seite kopiert und etwas erweitert ... Schieberegister 1 + 2 läuft ohne Probleme, ab 3 jedoch klappts dank lowByte/highByte dann net mehr (zumindest fällt mir nix ein wie ichs da noch rein bekäme).

Habs jetzt mal mit ner if-Abfrage versucht, doch obwohl ich den Code quasi 1:1 in die 2. if-Abfrage kopiert und nur die Variablen durch "2" ergänzt habe läuft das 3. Reg. immer noch nicht.

const int latchPin = 8; // Pin  ST_CP
const int clockPin = 12; // Pin  SH_CP
const int dataPin = 11; // Pin  DS

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
} 

void loop() {
  for (int thisLed = 0; thisLed < 24; thisLed++) {
    registerWrite(thisLed, HIGH);
    delay(250);
    Serial.begin(9500);
  }
}

void registerWrite(int whichPin, int whichState) {
  Serial.println (whichPin);
  if (whichPin <= 15){
    unsigned int bitsToSend = 0;    
    digitalWrite(latchPin, LOW);

    bitWrite(bitsToSend, whichPin, whichState);

    byte registerOne = lowByte(bitsToSend);
    byte registerTwo = highByte(bitsToSend);
  
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
    shiftOut(dataPin, clockPin, MSBFIRST, registerOne);

    digitalWrite(latchPin, HIGH);
  }
  if (whichPin > 16){
    unsigned int bitsToSend2 = 0;    
    digitalWrite(latchPin, LOW);
    Serial.println (bitsToSend);
    bitWrite(bitsToSend2, whichPin, whichState);

    byte registerOne2 = lowByte(bitsToSend2);
    byte registerTwo2 = highByte(bitsToSend2);
  
    shiftOut(dataPin, clockPin, MSBFIRST, registerOne2);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);

    digitalWrite(latchPin, HIGH);
  }

--> bitsToSend zählt brav hoch - bitToSend2 bleibt just bei 0 ... wieso is mir noch schleierhaft :roll_eyes:

Gruß Scorch

Ok Fehler gefunden:

if (whichPin > 15){
    Serial.println ("Lv2");
    unsigned int bitsToSend2 = 0;    
    digitalWrite(latchPin, LOW);
    
    bitWrite(bitsToSend2, whichPin [b]- 17[/b], whichState);
    Serial.println (bitsToSend2);
    byte registerOne2 = lowByte(bitsToSend2);
    byte registerTwo2 = highByte(bitsToSend2);
  
    shiftOut(dataPin, clockPin, MSBFIRST, registerOne2);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);

    digitalWrite(latchPin, HIGH);
  }

Bei der Variablen whichPin muss man die vorherigen LEDs +1 abziehen --> 16+1 = -17 und schon klapps :grin:

Gruß Scorch