Forum: Mikrocontroller und Digitale Elektronik LED-Matrix: Phantomleuchten


von Martin S. (sirnails)


Angehängte Dateien:

Lesenswert?

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
1
  uint8_t ADRESSES[12][6] =  {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 
2
                {0x20, 0x10, 0x10, 0x10, 0x08, 0x10}, 
3
                {0x20, 0x08, 0x10, 0x08, 0x08, 0x08}, 
4
                {0x20, 0x04, 0x10, 0x04, 0x08, 0x04}, 
5
                {0x20, 0x02, 0x10, 0x02, 0x08, 0x02}, 
6
                {0x20, 0x01, 0x10, 0x01, 0x08, 0x01}, 
7
                {0x04, 0x10, 0x02, 0x10, 0x01, 0x10}, 
8
                {0x04, 0x08, 0x02, 0x08, 0x01, 0x08}, 
9
                {0x04, 0x04, 0x02, 0x04, 0x01, 0x04}, 
10
                {0x04, 0x02, 0x02, 0x02, 0x01, 0x02}, 
11
                {0x04, 0x01, 0x02, 0x01, 0x01, 0x01}, 
12
                {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
13
14
  uint16_t LED[10][9] =  {{0, 0, 0, 0, 0, 13333, 732, 0, 5935}, 
15
              {0, 0, 5000, 1098, 0, 8902, 1098, 0, 3902}, 
16
              {549, 0, 4451, 2196, 0, 7804, 1647, 0, 3353}, 
17
              {1098, 0, 3902, 3294, 0, 6706, 2196, 0, 2804}, 
18
              {1647, 0, 3353, 4392, 0, 5608, 2745, 0, 2255}, 
19
              {2196, 0, 2804, 5490, 0, 4510, 3294, 0, 1706}, 
20
              {2745, 0, 2255, 6588, 0, 3412, 3843, 0, 1157}, 
21
              {3294, 0, 1706, 7686, 0, 2314, 4392, 0, 608}, 
22
              {3843, 0, 1157, 8784, 0, 1216, 4941, 0, 59}, 
23
              {5856, 0, 810, 13176, 0, 157, 0, 0, 0}};
24
25
  uint16_t LEDBuffer[9] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};

In der Schleife:
1
COLORVALUES = (TEMPERATURE - 10) / 2;
2
memcpy(&LEDBuffer[0], &LED[COLORVALUES][0], 9 * sizeof(uint16_t));
3
// RED LED 1    
4
    PORTC = ~ADRESSES[ActiveLEDs.LOWER_LED][0];
5
    PORTD = ADRESSES[ActiveLEDs.LOWER_LED][1];
6
    for (uint16_t i = 0; i < (LEDBuffer[0] / 1000); i++)
7
    {
8
      _delay_us(10);
9
    }
10
11
    
12
    // RED LED 2
13
    PORTC = ~ADRESSES[ActiveLEDs.MIDDLE_LED][0];
14
    PORTD = ADRESSES[ActiveLEDs.MIDDLE_LED][1];
15
    for (uint16_t i = 0; i < (LEDBuffer[3] / 1000); i++)
16
    {
17
      _delay_us(10);
18
    }
19
20
      
21
    // RED LED 3
22
    PORTC = ~ADRESSES[ActiveLEDs.HIGHER_LED][0];
23
    PORTD = ADRESSES[ActiveLEDs.HIGHER_LED][1];
24
    for (uint16_t i = 0; i < (LEDBuffer[6] / 1000); i++)
25
    {
26
      _delay_us(10);
27
    }
28
29
    //...

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

von Falk B. (falk)


Lesenswert?


von Matrix (Gast)


Lesenswert?

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.

von Martin S. (sirnails)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von TS (Gast)


Lesenswert?

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

von Martin S. (sirnails)


Lesenswert?

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.

von Martin S. (sirnails)


Lesenswert?

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

von Morgend (Gast)


Lesenswert?

Bist wieder am Moped basteln? Vielleicht wieder eine versalzene 
Crimpverbindung?

von Falk B. (falk)


Lesenswert?

@  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

von Peter D. (peda)


Lesenswert?

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

von R. M. (rmax)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

Also ich würd erstmal das Multiplexen soweit bringen, dass die Anzeige 
ordentlich ist. Danach erst mit der PWM rumfummeln.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Herta (Gast)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

> Schleifen sind generell tödlich fürs Multiplexen oder PWM.
> Das geht nur mit einem Timerinterrupt zufriedenstellend

[ ] Der Profi spricht.

von R. M. (rmax)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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.

von R. M. (rmax)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

"Ja, am Timing und deinen Augen. Die sehen die LEDs auch bei 0,1%
Helligkeit noch leuchten, siehe LED-Fading."

MFG
Falk

von Martin S. (sirnails)


Lesenswert?

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.

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.