Hallo!
Ich habe ein Problem mit der Kaskadierung von Schieberegistern am Atmel:
Der Aufbau:
Jeweils ein 74HC595 + ULN2803 steuern eine 100mm 7-Segment Anzeige.
Diese Schaltung habe ich jetzt 10mal gebaut, jeweils in ein Gehäuse
gepackt und die Steuerleitungen der Schieberegister über SUB-D nach
aussen geführt.
Die Zusammengesteckten Schieberegister sind dann wie im AVR Tutorial
beschrieben hintereinander geschaltet (Serielle Daten durchgeshiftet,
Clocks parallel)
Angesteuert wird das Ganze von einem ATMEGA8 der über UART jeweils ein
Zeichen liest und das Equivalent als Byte in das erste Register shiftet.
Jetzt zum Problem:
Mit 7 aneinandergesteckten Anzeigenkästen (also 7 Schieberegister)
funktioniert alles.
Kommt ein achtes Register hinten dran, entstehen ab dem 5. Register
fehlerhafte Ausgaben.
Diese Fehler sind immer identisch und reproduzierbar und werden
"korrekt" weitergeshiftet (wenn z.B. Ein bit von 1 nach 0 gekippt ist,
bleibt es beim weiterschieben auch im nächsten Register 0)
Das Verrückte: Ich kann keine guten oder schlechten Platinen ausmachen,
also Platinen die in 5er Gruppen funktionieren zeigen in 8er Gruppe
Fehler, usw.
Ich verzweifle langsam.
Ein Fehler in der Software kann sich doch eigentlich nur auf das erste
Register auswirken, aber es kann kein Fehler in einem Späteren erzeugt
werden.
Also ein Schirmungs- Störungs- Masseproblem? Da hätte ich ein mehr
zufälliges Verhalten erwartet, nicht so berechenbar.
Wenn ich gleich nach Hause komme poste ich mal die Schaltpläne, evtl.
Hat ja bis dahin schon jemand einen Tip...
Gruss,
Kolja
Jede angesteckte Platine stellt für die Ansteuerung eine Last dar und
bring noch zusätzlich eine längere Leitung (kap. Last und Reflexionen).
Mit dem Oszilloskop die Signalqualität an CLock und Strobe prüfen, mit
einer Platine, 2 Platinen, 3 Platinen ... usw. Da zeigt sich dann, ob
Dein Design für 8 und mehr Platien geeignet ist.
Versuche schon händeringend, mir für morgen irgendwo ein Oszi
auszuleihen...
Sagen wir, die Clocks sind nicht mehr sauber, läßt sich das zwischen
Atmel und erster Platine beheben?
Also zum Beispiel durch eine zusätzliche Signalverstärkung?
Oder muss ich dann das ganze Design über den Haufen werfen?
Schau Dir doch erst mal die Signale an, such nach der Ursache für den
Fehler und entscheide dann, was zu tun ist.
Wie lang ist denn das Clock und Strobe-Signal ? Wenn die Flanken
verschliffen sind und nicht mehr High-Pegel erreichen, könnte schon eine
zeitliche Verlängerung des Signals günstig sein. Hängt natürlich von der
Art der Eingangsbeschaltung auf den Platinen ab. Hoffe es sind
Schmitt-Trigger verwendet...
Also erst Signale beurteilen, dann über die Maßnahmen nachdenken, alles
andere ist das Pferd von hinten aufgezäumt.
Gute Anmerkung!
Hatte ich noch gar nicht erwähnt:
Ich habe vorhin Delays in meinen Code gebastelt.
Sah dann etwa so aus:
- Ein Bit für Serielle Leitung setzen, Serialclock Low
- 1 Sekunde warten
- serielles Bit halten, Serial Clock High
- 1 Sekunde warten
- nächstes Bit für Serielle Leitung setzen, Serialclock Low
- 1 Sekunde warten
- serielles Bit halten, Serial Clock High
- 1 Sekunde warten
...
nach jeweils acht Bit habe ich den Storage Clock getaktet. Dabei wieder
zwischen allen Bitveränderungen eine lange Wartezeit.
Das fehlerverhalten war exakt das Selbem, wie bei schneller
Verarbeitung. Es wurden die selben Bits an der selben Stelle
"vergessen".
Ich poste gleich Code und Chaltung, suche grade alles zusammen.
Die Delays sind horrender Blödsinn. Damit änderst Du nichts an
derTtaktlänge Deiner Signale, nichts an der Ausgangsleistung deiner
Treiberschaltung, nichts an Leitungslängen, nichts an Masseführung,
nichts an irgendetwas relevantem.
Oszi -> Singnale anschauen -> beurteulen -> verbessern
Alles andere ist Quatsch, Spekulation, Kristallkugelschauen, und nur
frustrierend für Dich.
@kurz:
Öhm, natürlich sind keine Schmitt-Trigger drin!
Ich musste bis vor wenigen Sekunden auch noch nicht, was das ist, aber
Wikipedia hat mich gerade aufgeklährt.
Wenn ich sicher weiß, das die Signale vermurkst werden kann ich aber
jeweils zwischen den Platinen noch eine solche Triggerschaltung
einbauen. Dann muss ich die mühevoll geätzen Platinen nicht wegwerfen.
Wie lange ist denn die Gesamtleitung?
Sind die ICs abgeblockt per 100nF Kerko? Bei langer Signalleitung mal
versuchen mit 100pF KerKo an den Signalen.
Ohne Oszi /Analizer ist das natürlich blöd.
Oder in der Ausgaberoutine ist ein Array zu kurz geraten.
Johann
kurz schrieb:
> Damit änderst Du nichts an derTtaktlänge Deiner Signale [...]
Natürlich ändert er die Taktlänge, wenn er dazwischen immer eine Sekunde
wartet. Damit hat er zumindest schonmal auf einfache Weise
ausgeschlossen, daß es an der Geschwindigkeit liegt, mit der er die
Daten in die Register schiebt.
Oder meintest Du vielleicht gar nicht die Taktlänge, sondern die Länge
der Taktflanken? Die ändert sich natürlich nicht.
Johann L. schrieb:
> Oder in der Ausgaberoutine ist ein Array zu kurz geraten.
Dann wären die Daten schon im ersten Register falsch und nicht erst
weiter hinten in der Kette.
Ist leider ein Problem aller '595...
Hatte auch schon damit zu kämpfen. Auf einem PCB gehts normalerweise
aber wenn mehrere PCB's ins Spiel kommen kanns kritisch werden.
Delays bringen dir nichts...
Das Problem ist dass das die Bits auf die gleiche Clk Flanke
rausgeschoben werden wie sie auch beim nachfolgendem 595 am Eingang
gelesen werden. Abhilfe schaft ein zusätzliches Latch zwischen den
verschiedenen 595er.
Dieses Latch sichert dir den alten Zustand für den nächsten 595.
Hab leider meine Dokumentation (Scope Bilder) nicht da ich das für einen
Kunden untersucht habe. Vieleicht rückt er die raus, dann kann ich das
hier posten.
Cheers
Wäre natürlich alles halb so schlimm, wenn die Anzeigetafel die so
entstehen sollte nicht am Wochenende zum Einsatz kommen sollte.
Vielen Dank schonmal für die vielen Antworten, so ein aktives Forum ist
wirklich eine feine Sache.
Ich hab jetzt 13 Stunden darüber nachgegrübelt, gelesen, ausprobiert.
Heute werd ich die vielen Dinge von denen ich keine Ahnung habe nicht
mehr nachlesen und verstehen können.
Morgen früh fräse ich mich durch die verschiedenen Ansätze zur
Bereinigung der Taktflanke. Wenn ich es schaffe, bis abends alle nötigen
Bauteile zu beschaffen kann das noch klappen.
Also ich habe mit den HC595 eine Infotafel gebaut. Zehn Stk. HC595 auf
einer Platine und 6 Platinen mit jeweils 20cm Flachkabel verbunden (die
Stromversorgung über Extraleitungen 0,75qmm). Alle HC595 liegen in
Reihe. Ich habe keine Probleme damit. Das funktioniert einwandfrei. Zum
Timing: Es ist nicht sehr schnell. Dauert etwa eine halbe Sekunde, bis
einmal alles durchgeschoben ist. Das liegt aber daran, das ich 'ne
C-Control zum Takten davor habe, und die ist nun mal nicht schneller.
Ich würde mal die Betriebsspannung jeder einzelnen Platine (wenn alles
leuchtet) messen. Außerdem den Spannungsabfall über die Masseleitungen.
Kann es vielleicht auch an der Software liegen? Irgendetwas zählt nur
bis 7 statt bis 8?
Nach Deinem Test mit der 1-Sekunden-Taktung würde ich Timingprobleme als
Fehlerursache ausschließen.
Gruß Ralf
@ Layouter (Gast)
>Ist leider ein Problem aller '595...
Nöö.
>Das Problem ist dass das die Bits auf die gleiche Clk Flanke>rausgeschoben werden wie sie auch beim nachfolgendem 595 am Eingang>gelesen werden.
Das machen 90% aller Digital-ICs und das funktioniert gut.
> Abhilfe schaft ein zusätzliches Latch zwischen den>verschiedenen 595er.>Dieses Latch sichert dir den alten Zustand für den nächsten 595.
Käse. Schon mal was von Setup- und Hold Zeiten gehört? Und Clock Skew?
@ Kolja (Gast)
>Kommt ein achtes Register hinten dran, entstehen ab dem 5. Register>fehlerhafte Ausgaben.
Da sind dann schon ein paar cm Kabel dazwischen, nicht wahr?
>Also ein Schirmungs- Störungs- Masseproblem?
Ein Masse und Reflexionsproblem. Siehe Wellenwiderstand.
Ein AC-Terminierung am Ende der Taktleitung könnte helfen. Halbwegs
gescheite Masseführung vorausgesetzt.
MFG
Falk
Die Kabellängen sind bei mir schon eine ganz andere Kategorie als 20cm.
Bei direkter Verbindung der Kästen sprechen wir von ca. 30-40cm zwischen
den Registern. Im finalen Aufbau kommen nach jeweils zwei Registern aber
nochmal bis zu 100cm dazu.
Alles zusammengerechnet komme ich für die insgesamt 16 Zeichen auf...
OMG, das werden 15 Meter Kabel!
Ist das überhaupt noch per Terminierung in den Griff zu bekommen? So wie
das Fehlerbild jetzt schon aussieht wird das doch am Ende um ein
vielfaches schlimmer.
Da werde ich wohl nicht drumrum kommen, mindestens das Taktsignal
zwischendurch aufzubereiten.
Ich wette sowas passiert einem kein zweites Mal, war mir einfach in
keinster Weise bewußt, daß die Kabellängen sich so negativ auswirken.
Eigentlich bedauerlich, hätte mir schon beim Design klar sein können.
Kolja schrieb:
> ...10Meter... aber schlimm genug.
klar, alles geht - ich würde aber sein lassen und stattdessen z.b. mit
funk versenden - wenn sein muss auch in jedem kasten ein atmega - hast
mehr möglichkeiten, kann nach bedarf abändern und wird garantiert
günstiger und störungsicherer als irgendetwas.
Hi
>klar, alles geht - ich würde aber sein lassen und stattdessen z.b. mit>funk versenden - wenn sein muss auch in jedem kasten ein atmega - hast>mehr möglichkeiten, kann nach bedarf abändern und wird garantiert>günstiger und störungsicherer als irgendetwas.
Wie hieß der Spruch: Wer Funk kennt, nimmt Kabel
Bei diesen Entfernungen einfach RS485-/RS422- oder Can-Treiber/Empfänger
verwenden. Damit ist das Problem gegessen. Auf jeden Fall billiger und
sicherer als Funk und/oder zusätzliche AVRs.
MfG Spess
10Meter werden es insgesamt, also Entfernung zwischen Atmel und letztem
Register.
die einzelnen Register sind dann maximal mit 1,5m verbunden.
Funk steht für dieses Projekt nicht zur Debatte und 16 Atmegas auch
nicht.
jaja, Funk für so nen Kram, lieber Gott...
Vorher Gedanken machen hilft. Oder wenigstens nachher wie Kolja. Aber
dann auch die richtigen.
Prinzipiell würde ich bei den Leitungslängen von vornherein auf
Leitungstreiber setzen.
EMV/slew rate beachten. RS485 oder CAN-Treiber lassen sich auch für
solche Sachen einsetzen, ohne wirklich einen Bus aufzubauen.
Kolja schrieb:
> 10Meter werden es insgesamt, also Entfernung zwischen Atmel und letztem> Register.> die einzelnen Register sind dann maximal mit 1,5m verbunden.> Funk steht für dieses Projekt nicht zur Debatte und 16 Atmegas auch> nicht.
habe 10m zwischen den kästen verstanden, für 1.5m ist natürlich funk
overkill
Um die Empfehlung von crazyhorse noch etwas zu konkretisieren:
Die billigste Variante düfte sein, die Takt- und Strobe-Leitungen
differentiell auszuführen, also hinter die Ausgänge des AVR einen RS-485
Transmitter und vor die Eingänge der einzelnen Platinen jeweils einen
Receiver zu setzen. Damit brauchst Du in den Platinen keine zusätzliche
Intelligenz, denn Du fährst ja kein RS-485-Protokoll, sondern nuzt nur
die Störsicherheit der RS485-Leitungstreiber aus.
Ein RS485-Transceiver vom Typ 75176 kostet bei Reichelt gerade mal 26
Cent. Davon bräuchtest Du pro Platine zwei und nochmal zwei für den AVR.
Wenn Du der Vollständigkeit halber die Datenleitungen auch noch
diferentiell ausführen willst, kannst Du pro Platine einen 75175
(vierfach Receiver, 60 Cent) für die Eingänge und einen 75176 für den
Datenausgang verbauen und bleibst damit immer noch unter einem Euro an
Mehrkosten pro Platine.
Ich hatte das mal mit mehreren 7 Segment Anzeigen auch so gemacht. Das
ganze differenziell mit RS422 Leitungstreibern (also Clock,Strobe und
Daten Treibertype 75LBC179) uebertragen und gut ist. Das ganze lief in
einer von mehreren Frequenzumrichtern stoerverseuchten Umgebung
einwandfrei. So direkt TTL Signale ueber mehrere Meter auf einer Leitung
zu uebertragen ohne Leitungsabschluss geht meisten schief.
Gruss Helmi
Ich habe ein ähnliches Problem: eine Matrix mit 10x8 LEDs zeigte ein
merkwürdiges Verhalten, sobald ich die 74595 über eine 2m lange Leitung
an den Controller hängte. Einzelne LEDs flackerten einfach so vor sich
hin und die letzte Reihe war permanent leuchtend.
Als ich die Leitungen testweise auf 10cm verkürzt hatte, lief alles wie
gewünscht. Bei der nächsten Hardwarebestellung werde ich mir ein paar
Treiber und abgeschirmte Leitungen besorgen, da auch im Radio Störungen
auftraten, sobald ich das Gerät einschaltete.
Mal sehen, ob mit den Sachen die Chose sauberer läuft.
>sobald ich die 74595 über eine 2m lange Leitung an den Controller hängte.
Man kann TTL Signale nicht so ohne weiteres ueber mehrere Meter Leitung
schicken ohne die Leitung abzuschliessen. Reflektionen lassen gruessen.