Hallo! Ich habe eine Matrix (5 x 22) erstellt. D.h. es wurden 5 BC517 verwendet und als Spaltentreiber habe ich den TLC5916 verwendet. Funktioniert soweit auch. Es wird Zeilenweise gemultiplext. D.h. Daten der ersten Zeile in den TLC geschrieben, 1. Transistor ein und dann gleiches für die anderen Zeilen. Aber wenn ich z.b. in der ersten Zeile ein paar LEDs leuchten lasse, leuchten genau die selben LEDs in der nächsten und übernächsten Zeile auch, nur dass die LEDs ganz schwach leuchten. Dazu meine Frage: Kann es sein, dass der BC517 vielleicht zu lang braucht, um vollständig zu sperren? Gruß Mathias
Hört sich nach "Ghosting" an. Mach mal ne Pause wischen der Zeilenumschaltung.
Geizkragen schrieb: > R5, R8 und R9 sind zu groß gewählt. Richtig, Schaltung vergessen. Auf seite 1 sollte alles soweit beschrieben sein. http://www.mikrocontroller.net/wikifiles/9/9c/Wordclock_variante3_schaltplan.pdf Teo Derix schrieb: > Hört sich nach "Ghosting" an. > Mach mal ne Pause wischen der Zeilenumschaltung. Ja, dass hier das Problem liegen könnte habe ich mir auch gedacht. Werds mal mit einer Pause versuchen.
Darlingtons sind langsam, und daher keine gute Wahl, ausserdem ist ihr Spannungsabfall mit über 1V recht hoch.
MaWin schrieb: > Darlingtons sind langsam, und daher keine gute Wahl, ausserdem ist ihr > Spannungsabfall mit über 1V recht hoch. Und was würdest du statt Darlingtons empfehlen?
Ich habe nun probiert immer die gleiche Zeile zu toggeln pro Timer-Interrupt.
1 | ISR(TIMER0_OVF_vect){ |
2 | |
3 | invert(CSEL0_PORT, CSEL0_PIN); |
4 | }
|
Jedoch werden kurzzeitig die anderen Spalten eingeschaltet. Woran könnte das liegen. Im Programm werden diese nirgends eingeschaltet. Vielleicht Massefehler? ____________________________________________ Blau: Der getoggelte Transistor Restlichen Farben: Transistoren welche auf 0 liegen sollten
Wenn ich die Verbindung zw. Transistor und LED-Matrix löse, tritt das Problem nicht mehr auf. Sozusagen muss es an der LED-Matrix liegen oder vll. am TLC5916. Aber was könnte es sein?
Mathias S. schrieb: > invert(CSEL0_PORT, CSEL0_PIN); invert ist kein Opcode, kommt drauf an, was der Compiler draus macht, wahrscheinlich irgendeine Form von Read-Modify-Write. Wie sich das auswirkt kann man ohne Schaltplan sowieso nicht beurteilen, aber möglicherweise musst du eben selbst bestimmen, was nacheinander passiert: alle Spalten abschalten(!!), Segmente umschalten, dann die neue Spalte einschalten. Da kann man auch noch kurze Delays einfügen, aber das ist sicher garnicht notwendig. Deine gemessenen Spaltenimpulse müssen jedenfalls weg. Gruss Reinhard
#ifndef invert #define invert(sfr, bit) (_SFR_BYTE(sfr) ^= _BV(bit)) #endif invert inviert ganz normal ein Bit. Mehr ist das nicht. Reinhard Kern schrieb: > was nacheinander > passiert: alle Spalten abschalten(!!), Segmente umschalten, dann die > neue Spalte einschalten. Momentan gehts aber mal darum, das ich immer nur EINE Zeile ein und aus schalte und die restlichen Zeilen sollten aus bleiben, was sie aber nicht tun. Schaltplan für die Matrix sieht man hier auf Seite 1 und 2 http://www.mikrocontroller.net/wikifiles/9/9c/Wordclock_variante3_schaltplan.pdf
Mathias S. schrieb: > Dazu meine Frage: Kann es sein, dass der BC517 vielleicht zu lang > braucht, um vollständig zu sperren? Ghosting ist durchaus denkbar, wie es schon jemand bemerkte. Auch eine viel zu hohe Multiplexfrequenz. Ich arbeitete einmal mit einer 8-stelligen Siebensegmentanzeige, und hatte dort den ollen Intel 8279 (Keyboard-Display-Interface) dran, der das Multiplexing von selbst macht, und nur den Datenbus zum µC braucht. Wenn ich mich recht erinnere, waren dort in den Umschaltungen Delays von 80µs drin, die der Baustein automatisch einfügt. Die Leistungs-Darlingtons BD675 als Spaltentreiber machten da überhaupt keine Probleme. Der Spannungsabfall am Darlington machte ebenfalls keine Probleme. Die Transistoren brauchten weder einen Kühlkörper, noch wurden sie warm. Energie wird da bei sowas ohnehin verbraten. Der BC517 ist doch auch ein Darlington, wie er im Schaltbild nicht verwendet wird. Sie schalten etwas langsamer ab, als einfache Transistoren, besonders, wenn sie maßlos übersteuert waren.
Mathias S. schrieb: > Momentan gehts aber mal darum Ich dachte, dir gehts um eine funktionierende Anzeige - so kann man sich täuschen. Gruss Reinhard
MaWin schrieb: > Darlingtons sind langsam, und daher keine gute Wahl, ausserdem ist ihr > Spannungsabfall mit über 1V recht hoch. Die sind hier aber in Kollektorschaltung, also ist das o.k. Nur in Emitterschaltung sind sie langsam.
Mathias S. schrieb: > Jedoch werden kurzzeitig die anderen Spalten eingeschaltet. Woran könnte > das liegen. Im Programm werden diese nirgends eingeschaltet. Sicher? Ist es denn so unsäglich schwer, die *.h, *.c als Anhang zu posten? Schnipsel posten bringt nichts. Du guckst doch auch nicht einen Film gerne durchs Schlüsselloch.
Das ist an so vielen Stellen schlecht... 1. der Schaltplan ist ein Witz. Eine ganze Seite wird verschwendet, um die (triviale) Verschaltung der LED-Matrix zu zeigen, aber dann tauchen da einzelne Transistoren auf bei denen lediglich Netznamen an den Pins stehen die man sich dann selber auf den 4 Seiten suchen darf. Falls das Programm (wie erwartet) genau so ein Spaghetti ist, dann möchte ich es gar nicht sehen. 2. der Schaltplan zeigt FZT-irgendwas, keine BC517. Ein Symbol für Darlington-Transen scheints auch nicht zu geben? 3. die Spaltentreiber werden als Emitterfolger betrieben. Selbstredend ohne Basiswiderstände. 4. noch dazu mit einer separaten Spannung für die LED. Und wir wissen noch nicht mal, ob nun höher oder niedriger oder gleich der Versorgungsspannung des µC ist. Streng genommen kann man die Spaltentreiber nur dann direkt mit dem µC ansteuern, wenn das die gleiche Spannung ist. 5. das invert() Makro ist nicht hilfreich. Viel eher hätte man ein Makro zum Ein- und ein zweites zum Ausschalten einer Zeile erwartet. Dann würde der (vereinfachte Pseudo)Code selbstdokumentierend sein:
1 | ISR displaymux |
2 | {
|
3 | static int spalte; |
4 | spalte_aus(spalte); |
5 | spalte++; |
6 | if (spalte>=anzahl_stellen) |
7 | spalte=0; |
8 | lade_zeile(spalte); |
9 | spalte_an(spalte); |
10 | }
|
6. das Oszillogramm zeigt, daß alle Spalten mal kurz eingeschaltet werden. Es ist also kein Ghosting, sondern ganz klar ein Softwarefehler. XL
> Nur in Emitterschaltung sind sie langsam.
Nein, sie sind ganz allmein beim Abschalten langsam weil aus dem zweiten
Transistor die Basis nicht ausgeräumt wird.
Manche Leistungsdarlingtons haben deswegen BE-Widerstände drin.
MaWin schrieb: > Manche Leistungsdarlingtons haben deswegen BE-Widerstände drin. Und schon 35 Jahre alte Displaycontroller ein Delay in der Umschaltung. Wenn man das ohne Controller direkt vom µC aus macht, da ist es doch aber kein Problem, in die Umschaltung ein Delay einzufügen.
MaWin schrieb: > Nein, sie sind ganz allmein beim Abschalten langsam Das mag ja sein, ist aber hier nicht relevant - nach seinen Oszillogrammen schaltet er irgendwo die anderen Spalten alle gleichzeitig sauber ein, er weiss aber nicht wo, weil er weder Hard- noch Software versteht. Ein Bit invertieren kann nicht alles sein um Spalten weiterzuschalten, aber wenn man dazu was sagt, wird er auch noch pampig. Gruss Reinhard
Habe nun alle c- und h-Files angehängt. Ich habe das Programm darauf reduziert, dass immer nur eine Zeile aus und eingeschaltet wird, aber die anderen Zeilen werden auch immer kurz eingeschaltet. Nur warum?
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.