Hallo miteinander,
ich wollte fragen, ob jemand das Problem des "Phantomleuchten" kennt?!
Ohne (vorerst) jetzt den ganzen Quelltext zu posten:
Ich habe am Port C über PNP die Zeilen, an Port D über NPN die Spalten.
Die Adressen und Farbwerte (da RGB-LED) werden in zwei Arrays abgelegt.
Die Farbsteuerung erfolgt über Soft-PWM.
Die Adresstabelle hat den Zeilenaufbau: Zeile1, Spalte1, Zeile2,
Spalte2, Zeile3, Spalte3
Die Farbtabelle: R1, G1, B1, R2, G2, B2, R3, G3, B3
ActiveLEDs ist ein UDT und hält nur die drei LED-Nummern, die leuchten
sollen (z.B. 1, 2, 3).
Sobald alle LEDs entweder in der oberen, oder der unteren Reihe laufen,
klappt es hervorragend.
Daher meine Frage: Gehe ich die Sache falsch an?
Grüße M. Schwaikert
Das erste was du in der Schleife machen solltest sind alle Ausgänge auf
LOW zu schalten (oder HIGH, je nachdem wie deine Schaltung aussieht).
Also erst alle LEDs ausschalten bevor die neuen Werte zugewiesen werden.
Matrix schrieb:> Das erste was du in der Schleife machen solltest sind alle Ausgänge auf> LOW zu schalten (oder HIGH, je nachdem wie deine Schaltung aussieht).> Also erst alle LEDs ausschalten bevor die neuen Werte zugewiesen werden.
Vielen Dank. Das sind dann wohl die Tücken der MC-Programmierung. Das
muss man auch erstmal wissen, dass Aus nicht aus ist.
Grüße
M. Schwaikert.
@ Martin Schwaikert (sirnails)
>muss man auch erstmal wissen, dass Aus nicht aus ist.
Doch, aus ist schon aus, die Frage ist nur wie schnell. Ein einfacher
Transistor mit Basiswiderstand hat, je nach unglücklicher
Dimensionierung eine Speicherzeit von vielleicht 1-10µs. Eine richtig
dimensionierte Schaltung vielleicht 50ns.
MFG
Falk
>>Vielen Dank. Das sind dann wohl die Tücken der MC-Programmierung.
Nein, hat mit dem uc überhaupt nichts zu tun, eher damit wie man ein
Thema angeht, ob und wie man sich vernünftig informiert.
TS
TS schrieb:>>>Vielen Dank. Das sind dann wohl die Tücken der MC-Programmierung.>> Nein, hat mit dem uc überhaupt nichts zu tun, eher damit wie man ein> Thema angeht, ob und wie man sich vernünftig informiert.>> TS
Niemand wird als Experte in einem Thema geboren. Selbststudium ist ja
schön und gut, aber es ersetzt nie die Möglichkeit, jemanden zu einem
Problem eine Frage zu stellen. Ich gehe mal davon aus, dass auch Du
Fragen zu bestimmten Sachverhalten an den Professor gestellt hast.
>>muss man auch erstmal wissen, dass Aus nicht aus ist.>> Doch, aus ist schon aus, die Frage ist nur wie schnell. Ein einfacher> Transistor mit Basiswiderstand hat, je nach unglücklicher> Dimensionierung eine Speicherzeit von vielleicht 1-10µs. Eine richtig> dimensionierte Schaltung vielleicht 50ns.
Also doch nicht aus :) Ich treibe die Transistoren mit 10mA Basisstrom.
Diese Dimensionierung hat MaWin so vorgeschlagen.
@ Martin Schwaikert (sirnails)
>Also doch nicht aus :) Ich treibe die Transistoren mit 10mA Basisstrom.>Diese Dimensionierung hat MaWin so vorgeschlagen.
Naja. Viel Basisstrom ist statisch gesehen vielleicht wünschenswert,
eine derartig massive Übersteuerung bringt aber auch massig
Speicherzeit, weil viel Ladungsträgerüberfluß in der Basis vorhanden
ist. Könnte man dadurch verbessern, indem man einen Kondensator von
0,1-10nF parallel zum Basiswiderstand lötet, damit bekommt man
kurzzeitig viel Spannung/Strom an die Basis und kann deutlich schneller
abschalten. Dann geht es ggf. auch ohne die Umschaltpause.
MFG
Falk
Martin Schwaikert schrieb:> Das sind dann wohl die Tücken der MC-Programmierung.
Nein, das sind die Tücken des logischen Denkens.
Es ist oft zu sehen, daß Code eingehackt wird, bevor man sich den Ablauf
klargemacht hat.
Mit einem Programmablaufplan wäre das nicht passiert.
Peter
Martin Schwaikert schrieb:> Daher meine Frage: Gehe ich die Sache falsch an?
Das was Du da machst scheint mir keine richtige PWM zu sein, denn die
Umlaufzeit Deiner Schleife ist nicht konstant, sondern hängt davon ab,
welche Helligkeitswerte die einzelnen LEDs haben. Damit hängt auch die
Helligkeit jeder einzelnen LED von der Summe der Helligkeiten aller
anderen LEDs ab.
Das Phantomleuchten entsteht dann dadurch, daß bei wenigen
eingeschalteten LEDs die Schleife so schnell wiederholt wird (die
Warteschleifen der ausgeschalteten LEDs werden ja praktisch
übersprungen), daß die Zeit, in der während des Umschaltens das falsche
Bild angezeigt wird, im Verhältnis zu der Zeit, in der das richtige Bild
angezeigt wird, so groß wird, daß man das falsche Bild mit bloßem Auge
sehen kann.
Wie Matrix oben schon schrieb, läßt sich das durch Abschalten der Zeilen
vor dem Umschalten der Spalten vermeiden, aber Du solltest Dir auf jeden
Fall auch die PWM nochmal vornehmen:
Laß die Schleifen für die Spalten immer gleich lang laufen und nimm den
Ausdruck, den Du jetzt als Abbruchkriterium verwendest, um im Body der
Schleife zu gegebener Zeit die Ausgänge abzuschalten.
R. Max schrieb:> Laß die Schleifen für die Spalten immer gleich lang laufen
Schleifen sind generell tödlich fürs Multiplexen oder PWM.
Das geht nur mit einem Timerinterrupt zufriedenstellend.
Peter
R. Max schrieb:> Martin Schwaikert schrieb:>>> Daher meine Frage: Gehe ich die Sache falsch an?>> Das was Du da machst scheint mir keine richtige PWM zu sein,
Das was er da macht ist auch kein Multiplex nach den Regeln der Kunst.
> Das Phantomleuchten entsteht dann dadurch, daß bei wenigen> eingeschalteten LEDs die Schleife so schnell wiederholt wird (die> Warteschleifen der ausgeschalteten LEDs werden ja praktisch
Nö.
Das Phantomleuchten entsteht dadurch, dass er die Zeileninfo für die
Spalte n+1 einstellt, während noch die Spaltentreiber für die Spalte n
aktiv sind.
Er macht
Zeileninfo = ...
Spalteinfo = ...
warten
Zeileninfo = ... (A)
Spalteninfo = ...
Zum Zeitpunkt (A) wird kurzfristig die neue Zeileninfo mit der
vorhergehenden Spalteninfo aktiv. So zeitlich kurz dieser Zustand auch
ist, man sieht ihn. Das Auge ist ein biologisches Wunderwerk.
Was er tun müsste
Zeileninfo = ...
Spalteinfo = ...
warten
Spalteninfo = eine Einstellung, so dass alle Spaltentreiber sperren
Zeileninfo = ... (A)
Spalteninfo = ...
Und dann kann es natürlich noch sein, dass das von Falk angesprochene
Phänomen greift, dass er nach dem Abschalten der Spaltentreiber einen
kleinen Moment warten muss. Ich denke aber, dass die Arbeit die durch
die Arrayindizierung anfällt ausreichend ist, so dass da nichts mehr
sichtbar ist.
Die grundsätzliche Vorgehensweise mit den _delay_us ist natürlich völlig
indiskutabel. Da stimme ich völlig zu.
Morgend schrieb:> Bist wieder am Moped basteln? Vielleicht wieder eine versalzene> Crimpverbindung?
Noch nicht ganz wach gewesen? Das war doch der Joachim
Joachim Drechsel schrieb:> Ich habe bei meinem Moppedle böse Probleme mit Crimpverbindungen> (industriell gefertigter Kabelbaum). Unnachvollziehbare Aussetzer> der Zündung, manchmal sprang es nicht an etc.
Der Maddin ist der mit dem Reibe-Professor! :-)
Peter Dannegger schrieb:> Schleifen sind generell tödlich fürs Multiplexen oder PWM.> Das geht nur mit einem Timerinterrupt zufriedenstellend.
In erster Näherung sind korrekte Schleifen aber immer noch besser als
kaputte und ich wollte Martins Ansatz nicht gleich ganz auf den Kopf
stellen.
Karl Heinz Buchegger schrieb:> Das Phantomleuchten entsteht dadurch, dass er die Zeileninfo für die> Spalte n+1 einstellt, während noch die Spaltentreiber für die Spalte n> aktiv sind.
Schon klar, aber man sieht es nicht, wenn das Phantombild um
Größenordnungen kürzer angezeigt wird als das korrekte. Zwischendurch
ganz abschalten ist natürlich besser, da stimme ich Dir zu, und das
hatte ich ja auch schon geschrieben.
Martin Schwaikert schrieb:> Niemand wird als Experte in einem Thema geboren.
Ein selten dämlicher Spruch.
> Selbststudium ist ja schön und gut, aber es ersetzt nie die> Möglichkeit, jemanden zu einem Problem eine Frage zu stellen.
Hmm. Da frag ich mich, wie wir programmieren gelernt haben zu einer Zeit
als es noch keine Foren gab, als das Internet noch Arpanet hieß und
unter Oberhoheit des amerikanischen Militärs stand.
Was in deinen Schädel rein muss, ist die simple Tatsache, dass jeder
Befehl in der Abarbeitung ein bischen Zeit dauert. Durch die
sequentielle Anordnung der Befehle
1
PORTC=~ADRESSES[ActiveLEDs.LOWER_LED][0];
2
PORTD=ADRESSES[ActiveLEDs.LOWER_LED][1];
3
4
...
5
6
PORTC=~ADRESSES[ActiveLEDs.MIDDLE_LED][0];
7
PORTD=ADRESSES[ActiveLEDs.MIDDLE_LED][1];
hast du auch automatisch einen Ablauf in der Zeit definiert. Jede
einzelne der Zuweisungen benötigt Zeit. Nicht viel, aber doch. Und dann
muss man eben überlegen, was das für die Pegel an den Ausgangspins
bedeutet, welche eventuell ungewollten Zwischenzustände sich dadurch
ergeben.
Und ja, die meisten der Regulars hier sind von alleine auf die Lösung
des 'Problems' gekommen. Nach 2 Minuten nachdenken und beobachten. (Ich
hätt das hier nicht gesagt, wenn du nicht den Spruch vom geborenen
Experten gebracht hättest)
R. Max schrieb:>> Das Phantomleuchten entsteht dadurch, dass er die Zeileninfo für die>> Spalte n+1 einstellt, während noch die Spaltentreiber für die Spalte n>> aktiv sind.>> Schon klar, aber man sieht es nicht, wenn das Phantombild um> Größenordnungen kürzer angezeigt wird als das korrekte.
Wie gesagt: Das Auge ist ein Wunderwerk. Du kannst problemlos
Lichtblitze sehen, die sich in der Größenordnung von Mykro-Sekunden
(also Millionstel Sekunden)(!) abspielen. Und wenn die dann noch ein
paar Hundert mal in der Sekunde wiederholt werden, sehen wir ein
glimmen. Dieses Phantomleuchten (das auch dann sichtbar ist, wenn man
ansonsten alles andere richtig macht, nur eben die LED nicht so
schaltet, dass man die Zeilen verändern kann ohne dass eine LED deswegen
kurz aufleuchtet) ist der beste Beweis dafür.
Karl Heinz Buchegger schrieb:> Wie gesagt: Das Auge ist ein Wunderwerk.
Keine Frage.
> Du kannst problemlos Lichtblitze sehen, die sich in der Größenordnung von> Mykro-Sekunden (also Millionstel Sekunden)(!) abspielen.
Ja, aber nur in entsprechend dunkler Umgebung. Neben dem Phantom-Pixel
einer LED-Matrix ist aber immer mindestens eine leuchtende LED
vorhanden.
> Und wenn die dann noch ein paar Hundert mal in der Sekunde wiederholt werden,> sehen wir ein glimmen.
Ich hatte schon Matrix-Anzeigen bei denen trotz formal vorhandenem
Phantombild kein Glimmen zu sehen war, sobald die Zeiten nur weit genug
auseinander lagen.
Also mal ein paar Dinge:
1) Natürlich kann man sich auch etwas selbst beibringen. VB5/6 habe ich
auf diesem Weg gelernt. Aber wenn man die Möglichkeit hat, jemanden zu
fragen, und diese nicht wahrnimmt, ist man halt selbst schuld. Es gibt
viele Wege zu einem Ziel. Mir ist zwar nicht ganz klar, warum Du darauf
so empfindlich reagierst, aber das ist Ansichtssache und wir müssen
nicht einer Meinung sein.
2) Was haben Crimpkontakte und Löten damit zu tun?
3) Durch das explizite Ausschalten ist das Problem beseitigt.
4) Nein, weder die Helligkeit, noch die Farbe wird durch die
unterschiedlichen Zeiten wahnehmbar negativ beeinflusst.
5) Die LEDs sind so empfindlich, dass sie bereits durch das alleinige
Ein- und Ausschalten der Ports einen sichtbaren Lichtblitz abgeben.