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.
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
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?
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
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
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?
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ß> StefanLED'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
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
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:
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
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 :(
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.
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
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,
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^^
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...
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?
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
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.
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!
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...
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 ?
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.
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.
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
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.
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.