Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Schieberegistern !


von Mike (Gast)


Lesenswert?

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

von Soso (Gast)


Lesenswert?

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...

von Mike (Gast)


Lesenswert?

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?

von Markus (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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?

von Markus (Gast)


Lesenswert?

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?

von Mike (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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?

von Douglas Adams (Gast)


Lesenswert?

Mike schrieb:
> Überschreibt ein
> Schieberegister nicht immer das komplette Byte? Muss ich tatsächlich bei
> jedem Byte-Wechsel das Register leeren?!

RTFM, Seite 42

von Mike (Gast)


Lesenswert?

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 !!!

von Markus (Gast)


Lesenswert?

Gern geschehen!
Super, dass es jetzt funktioniert.

von Gerald B. (gerald_b)


Lesenswert?

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
Noch kein Account? Hier anmelden.