Hallo erst mal,
habe heute ein problemchen mit dem kaskadieren von zwei
Schieberegistern.
Meine Zielsetzung ist es vier 4094 mit einnander zu verbinden um eine
4-stellige BIG 7-Segmentanzeige zu erstellen.
ich habe bereits zwei anzeigen vorbereitet die auch beide für sich
funktionieren. Pro Segment verwende ich ein 4094 als Schieberegister ein
ULN2803A als Treiber für die 7cm hohe 7-Segmentanzeige und natürlich die
7-Segmentanzeige.
sobald ich aber den Takt an den zweiten 4094 anlege bricht mir die erste
Anzeige zusammen.
Kann mir jemand sagen woran das liegt und wie ich dem entgegen wirken
kann?
Gundelputz schrieb:> Hallo erst mal,> habe heute ein problemchen mit dem kaskadieren von zwei> Schieberegistern.> sobald ich aber den Takt an den zweiten 4094 anlege bricht mir die erste> Anzeige zusammen.
ENABLE Eingänge richtig beschaltet und angesteuert?
> Kann mir jemand sagen woran das liegt und wie ich dem entgegen wirken> kann?
Lad mal den Schaltplan hoch :-)
Frank T. schrieb:> Lad mal den Schaltplan hoch :-)
hat das verückte Pferd schon gemacht nur das dahinter noch der ULN und
die Anzeige(gem. Katode)
Peter D. schrieb:> Ist sie dann nur noch 3,5cm hoch oder was?
um es verständlich aus zu drücken: Sie erlischt, geht aus, zeigt nichts
mehr an oder leuchtet ganz einfach nicht mehr.
Aber mal im ernst: jedes Segment ist wie im Bild gezeigt verbunden.
Zusätzlich speise ich noch ein 12V Festspannung in die Untere Reihe ein.
Beider Segmente funtionieren seperat ohne Probleme. Schiesse ich beide
wie gezeigt paralel(beide Datenpins zusammen) an einen UNO an zeigen
beide den gewünschten wert. Gehe ich aber mit dem QS von IC1 an Data von
IC2 so zeigtermaximal das f-Segment vom zweiten Display an.
ich sende nacheinnander die zifern 2, 4 und 6. Es sollte also statt
einem "-"(nicht im Code deklariert) die voorrangegangen Ziffer
erscheinen.
Hier noch der Code:
int zahl = 83;
byte einer = zahl % 10;
byte zehner = (zahl / 10) % 10;
byte hunderter = (zahl / 100) % 10;
byte tausender = (zahl / 1000) % 10;
int freigabe1 = 11;//CD4094 PIN1 (storePin)
int tackt1 = 12;//CD4094 PIN3 (clockPin)
int bit1 = 13;//CD4094 PIN2(datapin)
int uebergabe = 10;// �bergibt die Zeichen an Anzeige
int spalten_wert = 0;
int display_zeichen = 7;
byte daten_spalte;//datacol(5)
int count1 = 10000;
void setup()
{
pinMode(freigabe1, OUTPUT);
pinMode(tackt1, OUTPUT);
pinMode(bit1, OUTPUT);
pinMode(uebergabe, OUTPUT);
}
void loop()
{
for (int z = 1; z < 4; z++)
{
zahl = 246;
einer = zahl % 10;
zehner = (zahl / 10) % 10;
hunderter = (zahl / 100) % 10;
tausender = (zahl / 1000) % 10;
digitalWrite(uebergabe, LOW);
if (z == 1)
{
display_zeichen = einer;
zeil_schreib();
}
if (z == 2)
{
display_zeichen = zehner;
zeil_schreib();
}
if (z == 3)
{
display_zeichen = hunderter;
zeil_schreib();
}
for (int i = 1; i < 8; i++)
{
digitalWrite(freigabe1, LOW);
daten_spalte = spalten_wert;
shiftOut(bit1, tackt1, LSBFIRST, daten_spalte);
digitalWrite(freigabe1, HIGH);
}
digitalWrite(uebergabe, HIGH);
if (z == 4)
{
digitalWrite(uebergabe, HIGH);
}
delay(1000);
}
}
void zeil_schreib()
{
//hier soll die Auswahl f�r die zeichen hin geschriebe:
B,a,b,c,d,e,f,g,dp
switch (display_zeichen)
{
case 0:
spalten_wert = B11111101;
break;
case 1:
spalten_wert = B01100001;
break;
case 2:
spalten_wert = B11011011;
break;
case 3:
spalten_wert = B11110011;
break;
case 4:
spalten_wert = B01100111;
break;
case 5:
spalten_wert = B10110111;
break;
case 6:
spalten_wert = B10111111;
break;
case 7:
spalten_wert = B11100001;
break;
case 8:
spalten_wert = B11111111;
break;
case 9:
spalten_wert = B11110111;
break;
}
}
Gundelputz schrieb:> habe heute ein problemchen mit dem kaskadieren von zwei> Schieberegistern.
Da habe ich Dir doch erst gestern gezeigt, wie das geht; sogar 6 x 4094
und mit Programm.
Entferne einfach die Kurzschlüsse auf dem Steckbrett.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Mitlesa schrieb:> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
muss nicht zwingend gemacht werden.
habe das aber auch schon probiert.
m.n. schrieb:> Entferne einfach die Kurzschlüsse auf dem Steckbrett.
welche Kurzschlüsse??? Bin ich blind?
m.n. schrieb:> Da habe ich Dir doch erst gestern gezeigt, wie das geht; sogar 6 x 4094
nach deinem Vorbild ist die Schaltung aufgebaut. Der Code wahr mir etwas
zu kompliziert. Ich möchte immer etwas lernen. deswegen erst mal der
eigene Code.
Gundelputz schrieb:> muss nicht zwingend gemacht werden.> habe das aber auch schon probiert.
Man muss auch nicht zwingend Luft in Fahrradreifen pumpen.
Holpert dann zwar ein wenig mehr, fährt aber trotzdem.
Mitlesa schrieb:> Beratungsresistenz ist eine Zier,> doch weiter kommt man ohne ihr.
Liest sich mein Code nicht auf den ersten Blick, liegt es an des Lesers
Ungeschick.
Ich habe mir mal die Freiheit genommen, deinen Code etwas aufzuräumen,
und ein paar Fehler zu entfernen.
Bei der fehlenden Funktion shiftOut() gehe ich mal davon aus, dass sie
das macht, was sie verspricht...
Joe F. schrieb:> Liest sich mein Code nicht auf den ersten Blick, liegt es an des Lesers> Ungeschick.
Leider muss ich dir da zustimmen.
Habe dem neuen Code gelesen und "fast" verstanden. Sehr schön und
einfach.
einzieg folgende Zeihle wahr mir noch nicht bekannt.
shiftOut(p_data, p_clk, LSBFIRST, pattern);
Leider wird nur das letzte Zeichen richtig angezeigt.
Ich probiere noch ein wenig rum und melde mich heute Abend noch mal.
Vielen Dank schon mal.
Gundelputz schrieb:> Leider wird nur das letzte Zeichen richtig angezeigt.
Und die anderen Displays? Ist da wenigstens irgendetwas zu sehen, oder
sind die dunkel?
Was ist denn bei dir am Output 10 ("uebergabe") angeschlossen?
Gundelputz schrieb:> Habe dem neuen Code gelesen und "fast" verstanden. Sehr schön und> einfach.
Der unterscheidet sich von deinem Code in folgenden Dingen:
- Formatierung: um es anderen leichter zu machen den Code zu lesen,
rückt man alles sinnvoll ein.
- Funktionen: Funktionen kennen "Argumente" und einen "Rückgabewert".
Diese Dinge sollte man auch benutzen. Globale Variablen sind hier
vollkommen unangebracht.
- Variablendeklaration
Alle Variablen einfach global zu deklarieren verwirrt sehr.
Wenn man in jeder Funktion nur die Variablen deklariert, die auch
gebraucht werden, kann man die Funktion wesentlich schneller verstehen.
- Variablen und Port-Namen möglichst sinnvoll benennen.
Wenn deine Pins am Schieberegister schon einen Namen haben, kann man
diesen auch gleich im Programm verwenden. Ein zusätzliches "p_" oder
"pin_" davor macht jedem sofort klar, was hier gemeint ist.
- Arrays verwenden. Wenn du in einer Schleife immer wieder das gleiche
machst (4 Zeichen ausgeben), ist "if..." und 4 verschienene Variablen
("einer", "zehner"...) die falsche Methode.
Durch die Verwendung eines Arrays wird der Code kürzer und einfacher.
- Kommentare helfen zu verstehen, was die kommentierten Zeilen genau
machen sollen, wenn es sich nicht ohnehin selbst erklärt.
Guten morgen,
warum finde ich in dem C-Code so viele Variable von Typ int ?
Ich sehe keinen Grund vorzeichenbehaftet 16Bit Datentypen zu verwenden.
Joe F. schrieb:> Ich habe mir mal die Freiheit genommen, deinen Code etwas aufzuräumen,> und ein paar Fehler zu entfernen.
> warum finde ich in dem C-Code so viele Variable von Typ int ?> Ich sehe keinen Grund vorzeichenbehaftet 16Bit Datentypen zu verwenden.
Normalerweise brauche ich einen Grund, einen anderen Datentyp als int zu
verwenden (zu kleiner Wertebereich bei int, zuviel Speicher bei größeren
int-Feldern, ...) und keinen Grund, int zu verwenden. Das ist ja
sozusagen der Standardtyp für Ganzzahlen.
Joe F. schrieb:> Und die anderen Displays? Ist da wenigstens irgendetwas zu sehen, oder> sind die dunkel?
nein.
number = 1234;
erste Segment zeigt (b,c) 1
zweite Segmnent zeigt (a,c,d,f) u mit Strich darüber
dritte und vierte Segment zeigen (a,b,c,d,e,f,g) 8
_
| |_||_|
||_||_||_|
Joe F. schrieb:> Was ist denn bei dir am Output 10 ("uebergabe") angeschlossen?
Schieberegiste Pin 15 OE (habe ich auch schon an 5V gehabt mit gleichen
Erfolg).
Gundelputz schrieb:> Danke fürs zurechtstutzen.> Denke das habe ich mal wieder gebraucht.
Naja, ich wollte dich nicht wirklich "zurechtstutzen". Lediglich anhand
eines Beispiels aufzeigen, dass mit ein wenig Aufwand (vor allem
Formatierung) Programmcode viel lesbarer wird. Die Chancen, dass dir
dann jemand helfen kann/will werden dann besser ;-)
Gundelputz schrieb:> nein.> number = 1234;> erste Segment zeigt (b,c) 1> zweite Segmnent zeigt (a,c,d,f) u mit Strich darüber> dritte und vierte Segment zeigen (a,b,c,d,e,f,g) 8
Die Kette ist so aufgebaut, dass die erste Anzeige (die dann die "1"
korrekt anzeigt) am Ausgang des Arduinos hängt, richtig?
- Hast du mal versucht, die nachfolgenden Schieberegister-Eingänge (Pin
2) jeweils mit Pin 10 (QS*) des vorherigen Registers zu verbinden?
Momentan geht vermutlich immer Pin 9 auf Pin 2 des nächsten Registers.
Pin 10 hat den Vorteil, dass das Signal um 1/2 CLK verschoben ist, und
damit das Timing sicherer ist.
- Wie schnell ist deine CLK (KHz, MHz?)
Kannst du mal die Funktion shiftOut() zeigen?
- Sind CLK und STROBE überall korrekt angeschlossen?
- Sind alle Output-Enable Eingänge (Pin 15 der Schieberegister) auf +5V
bzw. mit dem Arduino-Output 10 verbunden?
Diese Eingänge dürfen nicht unverbunden bleiben.
der mechatroniker schrieb:> Normalerweise brauche ich einen Grund, einen anderen Datentyp als int zu> verwenden (zu kleiner Wertebereich bei int, zuviel Speicher bei größeren> int-Feldern, ...) und keinen Grund, int zu verwenden. Das ist ja> sozusagen der Standardtyp für Ganzzahlen.
Weist aber schon, dass son AVR nen 8 Bitter ist?
Und wieviel hat son int? Na?
Joe F. schrieb:> Die Kette ist so aufgebaut, dass die erste Anzeige (die dann die "1"> korrekt anzeigt) am Ausgang des Arduinos hängt, richtig?
Ja
zeichne gerade noch den kompletten Aufbau.
Joe F. schrieb:> - Hast du mal versucht, die nachfolgenden Schieberegister-Eingänge (Pin> 2) jeweils mit Pin 10 (QS*) des vorherigen Registers zu verbinden?
Ja.
Im der Beschreibung steht das ja genau so drinn.
Joe F. schrieb:> - Wie schnell ist deine CLK (KHz, MHz?)
das kann ich so genau nicht sagen. Habe einen Arduino UNO. Der sollte im
MHz bereich arbeiten.
Joe F. schrieb:> Kannst du mal die Funktion shiftOut() zeigen?
Da habe ich momentan deinen Code.
Also:
shiftOut(p_data, p_clk, LSBFIRST, pattern);
Joe F. schrieb:> - Sind CLK und STROBE überall korrekt angeschlossen?
Sind alle mit dem UNO verbunden. Also alle im gleichen Tackt.
Joe F. schrieb:> - Sind alle Output-Enable Eingänge (Pin 15 der Schieberegister) auf +5V> bzw. mit dem Arduino-Output 10 verbunden?> Diese Eingänge dürfen nicht unverbunden bleiben.
Ja.
Martin W. schrieb:> Weist aber schon, dass son AVR nen 8 Bitter ist?> Und wieviel hat son int? Na?
Ja, ist vollkommen richtig.
Der richtige Datentyp für alle Dinge dieses Firmwareteils wäre
"uint8_t".
Ich war schlampig...
Gundelputz schrieb:> Joe F. schrieb:>> - Hast du mal versucht, die nachfolgenden Schieberegister-Eingänge (Pin>> 2) jeweils mit Pin 10 (QS*) des vorherigen Registers zu verbinden?>> Ja.> Im der Beschreibung steht das ja genau so drinn.
Auf deinem Breadboard ist aber Pin 9 verwendet.
Nimm mal Pin 10 statt 9 als Data-Out.
Und dann liegt da auch ein zweiter Hase im Pfeffer:
du hast immer Pin 9 (QS) mit Pin 3 des nächsten Registers verbunden.
Pin 3 ist aber CLK und nicht DATA in...
Wie dann das erste Register funktionieren kann, ist mir schleierhaft,
vermutlich ist DATA auf gelb und CLK auf grün...?
Joe F. schrieb:> Momentan geht vermutlich immer Pin 9 auf Pin 2 des nächsten Registers.
Und das ist auch gut so.
> Pin 10 hat den Vorteil, dass das Signal um 1/2 CLK verschoben ist, und> damit das Timing sicherer ist.
Damit kann lediglich eine zu flache Flanke von CLK etwas kompensiert
werden. Mit einem ordentlichen CLK-Signal, wie es ein ATmegaxx liefert,
ist Pin 9 als Ausgang besser und erlaubt höchste Taktraten, da die
setup-time fast doppelt so lang sein kann. Eine verlängerte hold-time,
wie sie Qs* liefert, ist garnicht notwendig.
Gundelputz schrieb:> hier noch eben die fast fertige Grafik vom Aufbau.
Was will und so ein Bild sagen ?
Ich dachte immer in einem technischen Hobby zählt ein Schaltplan, so ein
Bild ist für mich nichtssagend.
m.n. schrieb:> Mit einem ordentlichen CLK-Signal
Bei so einem Drahtverhau?
Ich würde ja eher mit der CLK Rate runtergehen. Für sowas reichen ja ein
paar KHz....
Kann nur nicht finden, wie man das beim Arduino konfigurieren kann.
shiftOut() scheint zu irgendeiner nicht näher spezifizierten Library zu
gehören...
Und wenn es Probleme mit Pin 10 gibt, kann man Pin 9 ja wenigstens mal
ausprobieren.
Problem liegt aber wohl eher in der Verwechslung von CLK und DATA...
Was soll das sein ?
shiftOut(p_data, p_clk, LSBFIRST, pattern);
Die Frage zielt nicht auf den Protoype ab, sondern auf die
Implementierung des realen Codes.
Man sieht noch nicht mal die Datentypen der Parameter noch deren
Bedeutung !
Joe F. schrieb:> Problem liegt aber wohl eher in der Verwechslung von CLK und DATA...
Ohne Frage ;-)
Frage schrieb:> Was will und so ein Bild sagen ?> Ich dachte immer in einem technischen Hobby zählt ein Schaltplan, so ein> Bild ist für mich nichtssagend.
Ich finde das Bild richtig gelungen. Da sieht man, daß sogar ein
Widerstand vorhanden ist. Wer den Kondensator findet, hat gewonnen!
Frage schrieb:> Was soll das sein ?>> shiftOut(p_data, p_clk, LSBFIRST, pattern);
Das wird wohl ein bisschen vor den Arduino Programmierern versteckt, um
sie sich erstmal um das Wesentliche kümmern zu lassen...
Finde ich ja nicht schlecht.
Ich vermute mal es ist diese Implementierung:
http://linux.dd.com.au/wiki/Arduino_ShiftOut
1
// License GNU Lesser General Public License 2.1 original material copyright David A. Mellis, changes copyright Scott Penrose
2
// New shiftOut, but backwards compatible, accepts
Und jetzt ist auch klar, wie man eine andere Bitbreite oder
Geschwindigkeit als die Defaults einstellt...
Die Zeit zwischen low/high der Clock ist halt nicht so richtig
konfigurierbar...
m.n. schrieb:> Wer den Kondensator findet, hat gewonnen!Mitlesa schrieb:> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.> Ich muss bei jedem IC ein Abblock-C von VCC nach GND anschliessen.
Joe F. schrieb:> Die Zeit zwischen low/high der Clock ist halt nicht so richtig> konfigurierbar...
Dafür aber garantiert sehr lang.
Du wolltest kHz, da hast Du kHz ;-)
Joe F. schrieb:> Und dann liegt da auch ein zweiter Hase im Pfeffer:> du hast immer Pin 9 (QS) mit Pin 3 des nächsten Registers verbunden.> Pin 3 ist aber CLK und nicht DATA in...
das ist jetzt für mich aber extrem peinlich. Du hast aber sowas von
Recht.
Ich schreibe diese Zeilen von 5m unter der Erde. Denn so tief bin ich
gerade darin versunken.
Wenn mir das an dieser Stelle erlaubt sein darf so möchte ich dich in
hösten masse Loben. Dies wahr einer der wenigen Beiträge in dennnen man
mich nicht von oben herrab behandelt hat. Da Gute Litteratur eher selten
ist sind Anfänger wie ich mehr und mehr auf die hilfe der "neuen Medien"
angewiesen. Ich habe durh dich in den letzten Tagen mehr gelernt als den
restlichen Fragen die ich hier gestellt.
Vielen vielen Dank vom ganzen Herzen.
Frage schrieb:> Was will und so ein Bild sagen ?> Ich dachte immer in einem technischen Hobby zählt ein Schaltplan, so ein> Bild ist für mich nichtssagend.
siehe Lösung.
Nochmals vielen Danke für eure Hilfe.
m.n. schrieb:> Wer den Kondensator findet, hat gewonnen!
die habe ich nicht mit eingezeichnet. Nicht das noch Stimmen laut werden
man könne durch diese nichts mehr erkennen. Aber sei versichert sie sind
vorhanden.
Habe jetzt noch mal geprüft ob es auch ohne funktioniert.
Was soll ich sagen?
Ja macht es.
Aber keine Angst sind gleich wieder drann.
Hallo zasammen ,
bitte um Antwort.
Immer bevor im "Debug (printf) Viewer" eine Zahl korrekt dargestellt
wird, erscheinen eine ganze Reihe von Ausgaben von nichtgültigen Zahlen
in schneller Folge. Erklären Sie, warum das so ist.
Hallo zasammen ,
bitte um eine kurze Erklärung.
1.) Immer bevor im "Debug (printf) Viewer" eine Zahl korrekt dargestellt
wird, erscheinen eine ganze Reihe von Ausgaben von nichtgültigen Zahlen
in schneller Folge. Erklären Sie, warum das so ist.
2.) Sie haben nur simuliert und nicht auf der Hardware am Laufen
gesehen. Wie wird sich diese Störung (unter Punkt 1) bemerkbar machen?
3.) Was müßte getan werden, um diesen Störeffekt zu beseitigen?
Ey, ist das wirklich nötig, uralte Threads mit deinen Hausaufgaben
vollzuspammen?
Das Thema des Threads hat doch nicht im Geringsten mit "deinen" Fragen
zu tun!