Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem zweiten HC595


von Martin (Gast)


Lesenswert?

Hey,
ich habe leider Probleme beim durcharbeiten eines Tutorials und 
verzweifele grade ein bisschen. Ich versuche grade mit Multiplexern zu 
arbeiten und hab mir für den Anfang den 74HC595 ausgesucht.
Meine Schaltung ist genauso aufgebaut wie diese hier
http://arduino.cc/en/Tutorial/ShiftOut
(die untere mit 2)
Jedoch sind bei mir nur die Ausgänge Q1-Q4 und beim 2ten 595 Q1-Q5 mit 
LEDS bestückt.
Ich habe grade keinen 220Ohm widerstand parat, daher habe ich einen 10k 
Ohm vor Widerstand für die LED's benutzt.
1
int latchPin = 8;
2
int clockPin = 12;
3
int dataPin = 11;
4
int eingabe [6];
5
6
void setup() {
7
  Serial.begin(9600);
8
  pinMode(latchPin, OUTPUT);
9
  pinMode(clockPin, OUTPUT);
10
  pinMode(dataPin, OUTPUT);
11
  eingabe[0] = B00000010;
12
  eingabe[1] = B00000100;
13
  eingabe[2] = B00001000;
14
  eingabe[3] = B00010000;
15
}
16
17
void loop() {
18
  for (int i = 0; i < 4; i++) {
19
    digitalWrite(latchPin, LOW);
20
    shiftOut(dataPin, clockPin, MSBFIRST, (eingabe[i]>>8));
21
    shiftOut(dataPin, clockPin, MSBFIRST, (eingabe[i]));
22
    Serial.print(i);
23
    digitalWrite(latchPin, HIGH);
24
    delay(200);
25
  }
26
}

Der erste Multiplexer tut was er soll, der zweite tut jedoch garnichts 
und die LED`s sind einfach dauer an.
Ich habe es auch schon mit anderen Schreibweisen Probiert:
shiftOut(dataPin, clockPin, MSBFIRST, (eingabe[i] >> 8));
shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]>>8);

beides funktioniert bei mir nicht.
Es scheint aus meinen Augen also daran zu liegen das ich mit meinem Code 
die Binärzahlen nicht verschiebe.

Ich hoffe mir kann jmd sagen wo mein Fehler liegt.

Grüße
Martin

von Max H. (hartl192)


Lesenswert?

Entkoppelkondensatoren an den ICs? Vermutlich nicht, siehe: 
https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator

Da du hier
> eingabe[3] = B00010000;
nur etwas in die unteren bits schreibst ergibt
> (eingabe[i]>>8)
immer Null.

BTW: 74HC595 sind keine Multiplexer, das sind Schieberegister

Woher hat diese Arduino seite eigentlich den Unsinn mit dem 1µF an Latch 
Pin und keinem Entkoppelkondensator?

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Entkoppelkondensatoren an den ICs? Vermutlich nicht, siehe:
> https://www.mikrocontroller.net/articles/Kondensat...
>
> Da du hier
>> eingabe[3] = B00010000;
> nur etwas in die unteren bits schreibst ergibt
>> (eingabe[i]>>8)
> immer Null.
>
> BTW: 74HC595 sind keine Multiplexer, das sind Schieberegister

Kondensator ist drin,

mhmh versteh ich nicht, so wie er das hier beschreibt
http://www.youtube.com/watch?v=uSYWFkXtoMI
verschiebt man ja damit die bits um 8 nach hinten.
Wie müsste ich es denn richtig machen?

ich hatte auch schon B0000 0000 0001 0000 (ohne leerzeichen) versucht da 
hab ich dann aber natürlich das problem mit der kapazität der 
datentypen.

Danke dir schonmal
Grüße

von Max H. (hartl192)


Lesenswert?

Martin schrieb:
> ich hatte auch schon B0000 0000 0001 0000 (ohne leerzeichen) versucht da
> hab ich dann aber natürlich das problem mit der kapazität der
> datentypen.
Int sollte eigentlich 16bit sein.

Was passiert wenn du  B0000 0000 0001 0000 um 8 nach rechts verschiebst?

 B0000 0000 0001 0000 >> 8  =
           B0000 0000

: Bearbeitet durch User
von stefan (Gast)


Lesenswert?

ob die LED mit einem Vorwiederstand von 10K noch leuchted?
Sind dann ca. 0,3 mA statt 20 mA...

Gruß
Stefan

von Max H. (hartl192)


Lesenswert?

stefan schrieb:
> ob die LED mit einem Vorwiederstand von 10K noch leuchted?
Ich betreibe meine blauen 5mm-LEDs oft als Signal LEDs mit 10k an 3.3V, 
ca. 50µA

Martin schrieb:
> Kondensator ist drin,
100nF zwischen Vcc und GND an jedem IC, so kurze Leiterbahnen wie 
möglich?

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Martin schrieb:
>> ich hatte auch schon B0000 0000 0001 0000 (ohne leerzeichen) versucht da
>> hab ich dann aber natürlich das problem mit der kapazität der
>> datentypen.
> Int sollte eigentlich 16bit sein.
>
> Was passiert wenn du  B0000 0000 0001 0000 um 8 nach rechts verschiebst?
>
>  B0000 0000 0001 0000 >> 8  =
>            B0000 0000

wenn ich versuche nach links mit << zu verschieben passiert allerdings 
auch nicht

stefan schrieb:
> ob die LED mit einem Vorwiederstand von 10K noch leuchted?
> Sind dann ca. 0,3 mA statt 20 mA...
>
> Gruß
> Stefan

LED's leuchten ohne Probleme, die vom ersten Schieberegister blinken 
fröhlich durch, die vom zweiten leuchten dauerhaft...

Max H. schrieb:
> stefan schrieb:
>> ob die LED mit einem Vorwiederstand von 10K noch leuchted?
> Ich betreibe meine LED oft als Signal LEDs mit 10k an 3.3V
>
> Martin schrieb:
>> Kondensator ist drin,
> Zwischen Vcc und GND?

ne zwischen ST CP (latch pin) und GND hab aber Probweise mal umgesteckt 
Problem bleibt bestehen

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> stefan schrieb:
>> ob die LED mit einem Vorwiederstand von 10K noch leuchted?
> Ich betreibe meine blauen 5mm-LEDs oft als Signal LEDs mit 10k an 3.3V,
> ca. 50µA
>
> Martin schrieb:
>> Kondensator ist drin,
> 100nF zwischen Vcc und GND an jedem IC, so kurze Leiterbahnen wie
> möglich?

2,2 Mikrofarad oder ist das zuviel?
hab leider nix kleineres da

leiterbahnen sind max 10cm lang

von Max H. (hartl192)


Lesenswert?

Martin schrieb:
> wenn ich versuche nach links mit << zu verschieben passiert allerdings
> auch nicht
  B0000 0000 0001 0000 << 8  =
  B0001 0000 0000 0000
Und deine Funktion versenden wahrscheinlich nur die Unteren 8 bit. 
Versuch mal das zu senden:
1
    shiftOut(dataPin, clockPin, MSBFIRST, (0xAA);
2
    shiftOut(dataPin, clockPin, MSBFIRST, (0xAA);

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Martin schrieb:
>> wenn ich versuche nach links mit << zu verschieben passiert allerdings
>> auch nicht
>   B0000 0000 0001 0000 << 8  =
>   B0001 0000 0000 0000
> Und deine Funktion versenden wahrscheinlich nur die Unteren 8 bit.
> Versuch mal das zu senden:    shiftOut(dataPin, clockPin, MSBFIRST,
> (0xAA);
>     shiftOut(dataPin, clockPin, MSBFIRST, (0xAA);

Pin 2 und Pin 4 vom ersten schieberegister leuchten, beim zweiten 
schieberegister leuchtet immer noch alles

von Max H. (hartl192)


Lesenswert?

Kannst du einen Hardwarefehler ausschließen?

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Kannst du einen Hardwarefehler ausschließen?

Hab den 595 schon 2 mal ausgetauscht,
hatte auch noch nen 59581 hier den hab ich auch ausprobiert, 
fehlanzeige.

Kabel hab ich auch schon alle einmal ausgetauscht ( hab die schaltung 
nun zum 3ten mal aufgebaut und alle Kabel durchgetauscht )

Ob der arduino ne macke hat kann ich nich sagen, nen osziloskop hab ich 
leider nicht da :(

von Max H. (hartl192)


Lesenswert?

Wie hast du das mit den Entkoppelkondensatoren momentan gelöst?

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Wie hast du das mit den Entkoppelkondensatoren momentan gelöst?

er hängt zwischen GND und dem latch pin. Hab ihn auch schonmal zwischen 
Vcc und GND gehängt den Ardiono resetet und den code neu aufgespielt.

von Max H. (hartl192)


Lesenswert?

Martin schrieb:
> Vcc und GND gehängt
Direkt am 74HC595?

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Martin schrieb:
>> Vcc und GND gehängt
> Direkt am 74HC595?

wie sowas den nicht direkt? o.O
Am Vcc pin vom 74HC595 und GND halt

von Martin (Gast)


Lesenswert?

Verzeih ich habe misst gebaut,
bzw jedenfalls nicht richtig mitgedacht...

Ich hab vorhin zwar den Schiebeleiter getauscht,
da hatte ich aber noch mein Code drin. Die LED's blieben aus daher dacht 
ich gut geht halt nicht, jetzt hab ich ihn grad nochmal getauscht mit 
deinem code und siehe da pin 1,3,5 gehen an -.-

Sorry!!!

nun währe es super wenn du mir helfen könntest mein Code so zu 
verbessern das er die bits richtig sendet

von Max H. (hartl192)


Lesenswert?

Was willst du eigentlich genau Ausgeben. Dein Code gibt nur etwas auf 
dem 1. SR aus bzw. 0000000 auf dem zweiten.

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Was willst du eigentlich genau Ausgeben. Dein Code gibt nur etwas
> auf
> dem 1. SR aus bzw. 0000000 auf dem zweiten.

genau das selbe wie auf SR 1,
also
B00000010;
B00000100;
B00001000;
B00010000;

nur halt auf den zweiten,

von Max H. (hartl192)


Lesenswert?

Also auf beiden das gleiche:
1
void loop() {
2
  for (int i = 0; i < 4; i++) {
3
    digitalWrite(latchPin, LOW);
4
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
5
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
6
    Serial.print(i);
7
    digitalWrite(latchPin, HIGH);
8
    delay(200);
9
  }
10
}

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Martin schrieb:
> Max H. schrieb:
>> Was willst du eigentlich genau Ausgeben. Dein Code gibt nur etwas
>> auf
>> dem 1. SR aus bzw. 0000000 auf dem zweiten.
>
> genau das selbe wie auf SR 1,
> also
> B00000010;
> B00000100;
> B00001000;
> B00010000;
>
> nur halt auf den zweiten,

bzw möchte sicher wissen wie ich schieberegister der reihe nach sauber 
mit bits versorge. Sicher währe eine Schleife sinnvoller, jedoch möcht 
ich das erstmal nur zum Verständnis "per Hand" schicken.

wenn ich übrigens 8 nullen davor hänge kommt:
sketch_may15b:11: error: 'B0000000000000010' was not declared in this 
scope

woraus ich geschlossen hab das int zu klein ist... weil ich ja keine 
deklarierung gelöscht habe sondern lediglich nulen hinzugefügt hab^^

von Kaj (Gast)


Lesenswert?

Max H. schrieb:
> Ich betreibe meine blauen 5mm-LEDs oft als Signal LEDs mit 10k an 3.3V,
> ca. 50µA
Jetzt erklärst du mir bitte wie bei 3.3V / 10kOhm 50µA rauskommen 
sollen...
I = U/R
Außerdem bezweifel ich das deine LED auch nur im ansatzt glimmt, bei 
50µA...

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Also auf beiden das gleiche:void loop() {
>   for (int i = 0; i < 4; i++) {
>     digitalWrite(latchPin, LOW);
>     shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
>     shiftOut(dataPin, clockPin, MSBFIRST, eingabe[i]);
>     Serial.print(i);
>     digitalWrite(latchPin, HIGH);
>     delay(200);
>   }
> }

ah na klar, mit latchPin Low sagt man ihm ja hier gehts los und mit HIGH 
stoppt man, da kann man natürlich den Code einfach durchschieben...
Darauf bin ich garnicht gekommen.

geht sowas denn irgendwie mit <<8 bzw so ähnlich?

weil wenn ich z.b. einen 00001010 fürs erste SR hab und nun nur den 2ten 
verändern möchte, muss ich dann 00001010 nochmal fürs erste schicken? 
oder kann ich auch gleich nur irgendwie den 2ten ansprechen?

von Max H. (hartl192)


Lesenswert?

Kaj schrieb:
> Jetzt erklärst du mir bitte wie bei 3.3V / 10kOhm 50µA rauskommen
> sollen...
> I = U/R
Und ja sie leuchtet und man kann es auch bei Tag sehen. Das Schöne daran 
ist, es bleibt wahr ob du es glaubst oder nicht :-)
> Außerdem bezweifel ich das deine LED auch nur im ansatzt glimmt, bei
> 50µA...
Und da du anscheinend noch nie einen LED Vorwiderstand berechnet hast 
bezweifle ich, dass du hier richtig bist.

BTW: Es sind keine Low Current LEDs oder sonstiges, es sind diese: 
http://www.ebay.it/itm/160767702833

: Bearbeitet durch User
von Teo D. (teoderix)


Angehängte Dateien:

Lesenswert?

Hier ne 3mm LED mit 40µA.
Nich grad hell, nervt dafür aber nich wenn's zu heftig blinkt :)

von Max H. (hartl192)


Lesenswert?

Teo Derix schrieb:
> nervt dafür aber nich wenn's zu heftig blinkt :)
Richtig. Den 470Ω Vorwiderstand habe ich nach der ersten Inbetriebnahme 
sofort durch einen 10kΩ ersetzt. Ich persönlich sehe beim µC 
Programmieren lieber den Quellcode auf dem Bildschirm anstatt von der 
Power-On LED geblendet zu werden.

Wir kommen vom Thema ab,... Aber diesen Blödsinn kann man nicht 
unkommentiert stehen lassen.


Zurück zum Thema:

Martin schrieb:
> weil wenn ich z.b. einen 00001010 fürs erste SR hab und nun nur den 2ten
> verändern möchte, muss ich dann 00001010 nochmal fürs erste schicken?
> oder kann ich auch gleich nur irgendwie den 2ten ansprechen?
Du kannst nur Daten in beide SR gemeinsam hineinschieben, einzeln 
Ansteuern geht bei dieser Schaltung nicht.

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Max H. schrieb:
>
> Wir kommen vom Thema ab,...

Richtig :D

letzte frage meiner seits, wieviele Schieberegister kann ich maximal 
hintereinander schalten ohne das es zu starken verzögerungn kommt? bzw 
wie rechne ich das aus?

Vielen dank aufjedenfall für deine Hilfe!

von Max H. (hartl192)


Lesenswert?

Martin schrieb:
> bzw
> wie rechne ich das aus?
Ich habe keine Ahnung wie lange der Arduino für die shiftOut()-Funktion 
braucht, im Allgeneinen kann man Aber sagen, dass die Zeit zum Füllen 
linear mit der Anzahl der 74HC595 zunimmt. Doppel so viel 595er, 
doppelte Zeit...

von Martin (Gast)


Lesenswert?

Max H. schrieb:
> Martin schrieb:
>> bzw
>> wie rechne ich das aus?
> Ich habe keine Ahnung wie lange der Arduino für die shiftOut()-Funktion
> braucht, im Allgeneinen kann man Aber sagen, dass die Zeit zum Füllen
> linear mit der Anzahl der 74HC595 zunimmt. Doppel so viel 595er,
> doppelte Zeit...

wenn ich dann z.b. 10 schieberegister habe, ist es sinnvoller diese so 
zu schalten?:
einen "Main" an den dann jeweils einer dran hängt wo ein zweiter dran 
ist?
also
1x5x1 ?

von Easylife (Gast)


Lesenswert?

Martin schrieb:
> Max H. schrieb:
>> Martin schrieb:
>>> bzw
>>> wie rechne ich das aus?
>> Ich habe keine Ahnung wie lange der Arduino für die shiftOut()-Funktion
>> braucht, im Allgeneinen kann man Aber sagen, dass die Zeit zum Füllen
>> linear mit der Anzahl der 74HC595 zunimmt. Doppel so viel 595er,
>> doppelte Zeit...
>
> wenn ich dann z.b. 10 schieberegister habe, ist es sinnvoller diese so
> zu schalten?:
> einen "Main" an den dann jeweils einer dran hängt wo ein zweiter dran
> ist?
> also
> 1x5x1 ?

Ehm, wutt?

Wenn du 2 Schieberegister hintereinander hängst, kannst du dir das 
einfach als 1 Schieberegister mit entsprechend verdoppelter Bitanzahl 
vorstellen.
Ob das jetzt 1 Chip oder 2 oder 100 sind, ist am Ende egal. 10 
hintereinander gehängte 8-Bit Schieberegister sind so anzusprechen wie 
ein 80-Bit Schieberegister.

Schneller wird es nur, indem du die Clockfrequenz erhöhst, oder mehrere 
Schieberegister-Ketten parallel betreibst.
Du hast z.B. 20 Schieberegister, und die teilst du in 2 Ketten mit 
jeweils 10 auf. Dann brauchst du natürlich bei gleicher Clockfrequenz 
nur die Hälfte der Zeit, alle Schieberegister mit Daten zu füllen.
Das hat natürlich den Nachteil, dass du mehr Datenleitungen brauchst 
(jede Kette braucht ja eine). Die Clocks können sich alle Ketten teilen.

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:

> wenn ich dann z.b. 10 schieberegister habe, ist es sinnvoller diese so

sinnvoll hängt davon ab, was an den Schieberegtistern hängt.
Wenn das raustakten von 1 Byte ca 1µs dauert, dann dauern 10 Bytes (mit 
ein wenig Einrechnung von etwas Overhead) ca 10 bis 12µs. Das bedeutet 
immer noch, dass du alle Schieberegister in der Größenordnung von 1 bis 
2  Hundertausendstel Sekunden updaten kannst. Da wird wohl das restliche 
Programm länger mit der Berechnung der auszugebenden Daten benötigen.


Wenn es dir wirklich auf Speed ankommt, dann schmeiss die Arduino 
Funktionen über Board. Die sind zwar als eierlegende Wollmilchschweine 
mit Rundumschutz bekannt, das kostet aber auch Zeit. digitalWrite ist 
ca. um einen Faktor 130 langsamer als ein direkter Portzugriff. Dort 
liegt deine Zeit und nicht bei 2 oder 3 oder 10 weiteren 
Schieberegistern.

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Karl Heinz schrieb:
> Martin schrieb:
>
>> wenn ich dann z.b. 10 schieberegister habe, ist es sinnvoller diese so
>
> sinnvoll hängt davon ab, was an den Schieberegtistern hängt.
> Wenn das raustakten von 1 Byte ca 1µs dauert, dann dauern 10 Bytes (mit
> ein wenig Einrechnung von etwas Overhead) ca 10 bis 12µs. Das bedeutet
> immer noch, dass du alle Schieberegister in der Größenordnung von 1 bis
> 2  Hundertausendstel Sekunden updaten kannst. Da wird wohl das restliche
> Programm länger mit der Berechnung der auszugebenden Daten benötigen.
>
> Wenn es dir wirklich auf Speed ankommt, dann schmeiss die Arduino
> Funktionen über Board. Die sind zwar als eierlegende Wollmilchschweine
> mit Rundumschutz bekannt, das kostet aber auch Zeit. digitalWrite ist
> ca. um einen Faktor 130 langsamer als ein direkter Portzugriff. Dort
> liegt deine Zeit und nicht bei 2 oder 3 oder 10 weiteren
> Schieberegistern.

gut, mir war nicht bewusst wie das schnell das ganze geht,
ich möchte unter 20 ms sekunden bleiben aber das erscheint mir ja kein 
Problem.

ich werde mir einen direkten Portzugriff mal anschauen. Ist zwar nicht 
relevant für mich, dennoch denk ich sehr interessant.

Ich habe nun 10 schieberegister die mir eine optische wiedergabe meiner 
drehencoder geben sollen.
Kann mir jmd einen Link oder das passende googel stichwort gebe wie ich 
sowas realisiere?

geht eigentlich nur um die funktion, weil wenn ich den ersten 
drehencoder drehe, so muss ich ja die letzten 16 bits eig nur 
raussenden. Geht sowas überhaupt?

Oder währe es sinnvoller mir den Binärcode der für die schieberigster in 
Variablen zu speichern und dann alle zusammen rauszuschicken wenn sich 
der wert meines drehencoder ändert?

Danke für eure Zeit.

Grüße aus Berlin

von Schimanski (Gast)


Lesenswert?

Max H. schrieb:
> Woher hat diese Arduino seite eigentlich den Unsinn mit dem 1µF an Latch
> Pin und keinem Entkoppelkondensator?

oben in der Seite sind es noch 0.1"F. Dann später im Stromlaufplan 
1µF...
Waren sicher .1µF. mangels schlechter Qualität des Bildes war "punkt" 
nicht mehr zu sehen. So wurden EIN MIKROFARAD daraus.
Da kommt eigentlich kein Kondensator hin. Dieser gehört über VCC und 
GND.

von Easylife (Gast)


Lesenswert?

Martin schrieb:
> Oder währe es sinnvoller mir den Binärcode der für die schieberigster in
> Variablen zu speichern und dann alle zusammen rauszuschicken wenn sich
> der wert meines drehencoder ändert?

Nur so geht es. Du hast das Prinzip von Schieberegistern nicht 
verstanden.
Immer wenn du vorne auch nur 1 Bit reinschiebst, ändert sich die gesamte 
Schieberegister-Kette.
Wenn du nur auch 1 Bit ändern möchtest, musst immer alle Bits (in 
deinem Fall 10x8=80) für die gesamte Schieberegister-Kette reinschieben.

> geht eigentlich nur um die funktion, weil wenn ich den ersten
> drehencoder drehe, so muss ich ja die letzten 16 bits eig nur
> raussenden. Geht sowas überhaupt?
nein.

> gut, mir war nicht bewusst wie das schnell das ganze geht,
> ich möchte unter 20 ms sekunden bleiben aber das erscheint mir ja kein
> Problem.

Das ist eine einfache Rechnung.
Du hast 80 Bits, und 20ms Zeit.
20ms / 80 = 0,25ms pro Bit
1/0.00025s = 4000 Hz

Deine Shift-Clock muss also mind. 4 KHz haben, in der Regel wird die 
eher so bei ein paar hundert KHz bis 1-2 MHz liegen.

von Easylife (Gast)


Lesenswert?

Vielleicht helfen dir diese Links ja:

Ein 595 Schieberegister interaktiv ausprobieren:
http://conductiveresistance.com/2011/02/28/interactive-595-shift-register-simulator/


Ansteuerung von 1 und 2 hintereinander gehängten Schieberegister mit 
Port-Zugriffen:
http://www.protostack.com/blog/2010/05/introduction-to-74hc595-shift-register-controlling-16-leds/

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.