Probleme mit dem zweiten HC595

Gast #3657215
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
#3657233
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?
Gast #3657253
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
Gast #3657273
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
Gast #3657282
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
Gast #3657289
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
Gast #3657303
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 :(
Gast #3657339
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
#3657349
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
}
Gast #3657355
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^^
Gast #3657366
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?
#3657371
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
#3657400
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.
Gast #3657423
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 ?
Gast #3657454
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.
#3657645
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.
Gast #3658036
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
Gast #3658058
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.
Gast #3658209
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren