Hallo, kann mir jemand von euch sagen, warum bei den Schieberegistern folgender Code funktioniert... void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); digitalWrite(latchPin, HIGH); delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, B00000000); digitalWrite(latchPin, HIGH); delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, B01111110); digitalWrite(latchPin, HIGH); } ..dieser hier aber nicht void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); digitalWrite(latchPin, HIGH); delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, B01111110); digitalWrite(latchPin, HIGH); } Es geht dabei um den direkten Wechsel der Bits von 11111111 zu 01111110 ohne vor das Register mit Nullen leeren zu müssen. Macht man dies nicht, kommt bei meinen LED's ein 11111110 heraus. Überschreibt ein Schieberegister nicht immer das komplette Byte? Muss ich tatsächlich bei jedem Byte-Wechsel das Register leeren?! Danke schonmal für hilfreiche Tipps von euch ! Liebe Grüße
Schon mal mit einer zusätzlichen 0 probiert? Sieht für mich so aus als ob da ein Bit übersprungen wird. Was kommt bei 00111111 raus, oder bei noch anderen Mustern? Augenmerk darauf ob es um ein Bit "verschoben" ist. Ich hatte mal, dass der Clock invertiert war und dadurch immer das erste Bit noch vom letzen Zustand des vorigen Shiftout war und das letzte Bit des aktuellen nicht mehr ankam...
Hallo ! Schonmal danke für die Antwort. 0011 1111 funktioniert scheinbar immer, egal ob das Register voher "voll" oder "leer" war. Ich habe das Problem auch hin und wieder mal mit anderen Werten. Darauf gestoßen bin ich, als ich eine Routine für eine 7-Segment-Anzeige mit Dezimalwerten schreiben wollte. Das Register hat einfach nicht gemacht, was es sollte. Es tritt z.B. auch auf wenn ich von 1000 0001 auf 1100 0000 "hochlaufen" möchte (dann zieht er ein Bit immer hinter sich her). --> Von 0000 0000 auf 1000 0000 klappt es aber... Oder auch wenn ich 2x hintereinander 01000001 registrieren lasse... Ich habe so ein Gefühl, was du mit dem Bit überspringen meinst. Aber ich trage doch exakt 8 bits ein, deshalb verstehe ich das Problem nicht ganz. Wie kann ich genau prüfen, ob der Clock invertiert ist? Die Anschlüsse habe ich jetzt schon mehrfach kontrolliert? Liegt das evtl. an der Arduino ShiftOut-Routine?
Mike schrieb: > Ich habe das Problem auch hin und wieder mal mit anderen Werten. Wenn es hin und wieder auch sonst nicht funktioniert, so vermute ich eher, dass es ein Hardware-Problem ist. Wie ist das Schieberegister angeschlossen? Speisung in Odnung? Ist ein Abblock-Kondensator daran vorhanden? Ich vermute eher was in der Richtung.
Ich lass das SR an 3.3V ohne Kondensator laufen (3.3 V weil ich jetzt auf die Schnelle zu faul für Vorwiderstände für die LED'S gewesen bin). Hab aber auch noch keine Schaltung mit Kondensator gefunden? Wo müsste der den hin und wie müsste er dimensioniert sein?
Also LED direkt ohne Vorwiderstand an Schieberegister? Ja dann ist klar, dass es nicht immer funktioniert, weil da kurzzeitig die Speisung am Schieberegister einbricht. An jedes IC gehört ein Abblock-C von 10-100nF nahe über der Speisung. An jede LED gehört immmer ein Vorwiderstand zur Strombegrezung. Wird das Schieberegister mit 3.3V gespiesen und der Arduino auch mit 3.3V?
Der Arduino läuft gerade über 5V USB. Ich weiß eigentlich, dass der Kondensator und die Vorwiderstände in jedes Prototype gehören, habe aber bis jetzt noch nie Konsequenzen daraus ziehen müssen, dass ich es nicht gemacht habe ^^ gibt für alles ein erstes Mal. Schonmal vielen Dank bis jetzt, ich werde es mal mit voller Montur versuchen und dann nochmal Feedback geben.
Also speisst der Arduino mit 5V das Schieberegister via den IO-Pins, weil des Schieberegister nur 3.3V hat. Das ist ungesund. Was ist es denn genau für ein Schieberegister? Und welcher Arduino?
Mike schrieb: > Überschreibt ein > Schieberegister nicht immer das komplette Byte? Muss ich tatsächlich bei > jedem Byte-Wechsel das Register leeren?! RTFM, Seite 42
Das SR ist ein 74HC595 und läuft zwischen 2 und 6 V. Nein, ich wollte nicht so viel Saft auf die LED's geben. Und jetzt fühle ich mich gerade ziemlich dumm, weil ich vergessen haben, dass die IO Pins immer 5V rausgeben... Ich habe jetzt das komplette Setup inkl. Kondensator und Vorwiderstände fertig und lasse den IC nun über 5V laufen und.. was soll ich sagen: Alles funktioniert ! Das sollte mir eine Lehre sein :) Vielen Dank für deine Hilfe !!!
Ich vermute mal, das komplette Nullen dient der Synchronisation bei eventuellen Hardwareproblemen. Wenn du in weniger als 1% der Fälle einen "SChluckauf" im Register hast, weil du keinen Abblock C verwendest, die Zuleitungen zu lang sind, oder was auch immer, summieren sich die Fehler, wenn nach ner Stunde z.B. der nächste Fehler auftaucht. Durch das Nullen wird aber jedesmal ein definierter Ausgangszustand geschaffen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.