7Segment-Anzeige im Multiplexbetrieb - Problem: "Mitleuchten" von anderen Segmenten

Gast #2907273
Lesenswert?

Hallo Leute!

Ich habe ein kleines Problemchen.

Im angehängten Bild seht ihr meine Schaltung. Das selbst erstellte 
Bauteil ist eine 4x 7-Segment-Anzeige, welche gemultiplext wird. Dazu 
kommen noch zwei LEDs und zwei Ausgänge. Die Ausgänge sind egal. Problem 
habe ich hauptsächlich mit den LEDs.

Die Anzeige und die LEDs werden 1/6 gemultiplext. 1/6, weil die Anzeige 
vier Stellen hat und dazu noch extra Punkte, welche z.B. ein ° 
darstellen können. Die Anzeige hat also insgesamt 5 Anoden, dazu noch 
die Anoden der LEDs.

Also schalte ich nacheinander durch: Stelle 1, 2, 3, 4, Punkte, LEDs.

Das Problem ist jetzt, dass die LEDs leicht mitzuleuchten scheinen. Das 
tun sie aber nur, wenn eben auch das entsprechende Segment, mit denen 
sie sich die Kathode teilen, an ist. Zeitgleich sind die Anoden aber 
nicht an! Es scheint vielmehr so, als wenn das umschalten der Anoden und 
Kathoden nicht zeitgleich erfolgt.

Vermutung: Segment (Kathode Stelle und LED) war bei Stelle an, jetzt 
wird auf LED umgeschaltet und die Anode der LED ist schon an, während 
die Kathode noch nicht vollständig umgeschaltet ist. Oder andersherum: 
Kathoden sind schon umgeschaltet, aber der Transistor schaltet nicht 
schnell genug aus.

Ähnlich ist es auch mit den Punkten, da aber nicht so stark.


Weiß jemand, ob es daran liegen könnte?
Angehängte Dateien:
#2907282
Lesenswert?

Ersan schrieb:

> Das Problem ist jetzt, dass die LEDs leicht mitzuleuchten scheinen. Das
> tun sie aber nur, wenn eben auch das entsprechende Segment, mit denen
> sie sich die Kathode teilen, an ist. Zeitgleich sind die Anoden aber
> nicht an! Es scheint vielmehr so, als wenn das umschalten der Anoden und
> Kathoden nicht zeitgleich erfolgt.

Das wird auch nie zeitgleich erfolgen.
Der Trick besteht darin, dass du im Multiplexcode als allererstes erst 
mal eine Anzeigestelle dunkel schaltest, in dem du alle 
Anodentransistoren sperrst.
Danach tust du alles was du brauchst um das Muster für das nächste 
Segment zu bestimmen und an die Kathoden auszugeben.
Und erst dann aktivierst du diese Stelle durch einschalten des richtigen 
Anoden Transistors.

> Weiß jemand, ob es daran liegen könnte?

Es liegt in deiner Programmierung. Es ist ein reines 
Reihenfolgenproblem, in welcher Reihenfolge du welche Aktionen machst 
und welche Aktionen du vermeintlich glaubtest einsparen zu können.
Gast #2907296
Lesenswert?

Karl Heinz Buchegger schrieb:
> Der Trick besteht darin, dass du im Multiplexcode als allererstes erst
> mal eine Anzeigestelle dunkel schaltest, in dem du alle
> Anodentransistoren sperrst.

OK, das kann ich natürlich machen. Heißt bei mir aber, dass ich extra 
nochmal 16 Bit reintakten muss, nur um die Anzeigen dunkel zu schalten. 
Sollte ich dass dann stets vor dem neuen Ausgeben der Daten machen? Also 
quasi stets 32 bit hinschicken?

Karl Heinz Buchegger schrieb:
> Es liegt in deiner Programmierung.

Das wäre natürlich prima, wenn es dadurch zu beheben ist. Ohne jetzt 
längere Dunkelphasen erzeugen zu müssen. Wenn ich beispielsweise immer 
eine Dunkelphase mit einbauen würde, dann würde sich die "Ein"-Zeit ja 
noch halbieren. Das ist ja auch nicht Sinn der Sache.

Also immer 32 bit senden scheint mir da sinnvoller. Die Anoden kann ich 
so ja nicht abschalten.
Gast #2907300
Lesenswert?

Die Transistoren schalten zu langsam ab, das ist richtig.

Probiere doch mal den Spannungsteiler mit 10k gegen +5V. Das reduziert 
auch die verbleibende Ladung auf der Basis und führt zu einem 
schnelleren Abschalten.

Joe
#2907301
Lesenswert?

Ersan schrieb:

> OK, das kann ich natürlich machen. Heißt bei mir aber, dass ich extra
> nochmal 16 Bit reintakten muss, nur um die Anzeigen dunkel zu schalten.
> Sollte ich dass dann stets vor dem neuen Ausgeben der Daten machen? Also
> quasi stets 32 bit hinschicken?

Darauf läufts bei deinem Hardwrae aufbau hinaus.


>> Es liegt in deiner Programmierung.
>
> Das wäre natürlich prima, wenn es dadurch zu beheben ist.

Da habe ich jetzt allerdings dein Oszi Bild noch nicht gesehen. Die 
fallenden Flanken sind in der Tat sehr lang.
Gast #2907306
Lesenswert?

Peter Dannegger schrieb:
> Nimm für T1..6 NPNs in Kollektorschaltung.

OK, einen Basiswiderstand brauche ich dann nicht? Stellt der Strom 
dadurch dann automatisch ein? Dann hätte ich ca. 4,3V am Emitter 
anliegen, richtig? Ist der Basisstrom dann automatisch genau so hoch, 
wie der Strom im Kollektor-Emitter-Zweig / Verstärkungsfaktor?
Gast #2907387
Lesenswert?

So, also ich werde jetzt 32Bit senden. Neues Problem...was ist an meinem 
Quelltext falsch?
1
void sr_bitbang_data_out( void )
2
{
3
  uint8_t  bit_counter;
4
  uint8_t  mode_counter = 0;
5
  uint16_t output_data;
6

7
  do
8
  {
9
    if( mode_counter == 0 )
10
    {
11
      output_data = ( sr_control.next_display_data | ANODE_MATRIX );
12
    }
13
    else
14
    {
15
      output_data = sr_control.next_display_data;
16
    }
17

18
    for( bit_counter = 0; bit_counter < 16; bit_counter++ )
19
    {
20
      if( output_data & 0x8000 )
21
      {
22
        SHIFT_REG_DATA_PORT |= SHIFT_REG_DATA_PIN;
23
      }
24
      else
25
      {
26
        SHIFT_REG_DATA_PORT &= ~SHIFT_REG_DATA_PIN;
27
      }
28

29
      SHIFT_REG_CLOCK_PORT |=  SHIFT_REG_CLOCK_PIN;
30
      SHIFT_REG_CLOCK_PORT &= ~SHIFT_REG_CLOCK_PIN;
31

32
      output_data <<= 1;
33
    }
34

35
    SHIFT_REG_LATCH_PORT |=  SHIFT_REG_LATCH_PIN;
36
    SHIFT_REG_LATCH_PORT &= ~SHIFT_REG_LATCH_PIN;
37

38
    mode_counter++;
39
  } while( mode_counter < 2 );
40
}

Ich wollte mit mode_counter == 0 erstmal alle Anoden im SR ausschalten 
und dann im zweiten Druchgang, wo mode_counter dann 1 ist, die richtigen 
Daten.

Aber der Compiler geht zweimal in den else-Zweig bei 
mode_counter-Abfrage. Compiler ist CCS.
#2907411
Lesenswert?

Im übrigen hätte ich das gar nicht so gemacht
1
void sr_bitbang( uint16_t output_data )
2
{
3
  uint8_t  bit_counter;
4

5
  for( bit_counter = 0; bit_counter < 16; bit_counter++ )
6
  {
7
    if( output_data & 0x8000 )
8
    {
9
      SHIFT_REG_DATA_PORT |= SHIFT_REG_DATA_PIN;
10
    }
11
    else
12
    {
13
      SHIFT_REG_DATA_PORT &= ~SHIFT_REG_DATA_PIN;
14
    }
15

16
    SHIFT_REG_CLOCK_PORT |=  SHIFT_REG_CLOCK_PIN;
17
    SHIFT_REG_CLOCK_PORT &= ~SHIFT_REG_CLOCK_PIN;
18

19
    output_data <<= 1;
20
  }
21

22
  SHIFT_REG_LATCH_PORT |=  SHIFT_REG_LATCH_PIN;
23
  SHIFT_REG_LATCH_PORT &= ~SHIFT_REG_LATCH_PIN;
24
}
25

26
void sr_bitbang_data_out( void )
27
{
28
  sr_bitbang( sr_control.next_display_data | ANODE_MATRIX );
29
  sr_bitbang( sr_control.next_display_data );
30
}


Aber hör auf Peter. Der hat von Hardware mehr Ahnung als ich.
Gast #2907412
Lesenswert?

Karl Heinz Buchegger schrieb:
> Da wird dir wohl der Optimizer einen Streich gespielt haben und die
> beiden Zweige weitgehend zusammengezogen haben.

Ok, hab grad mal die Optimierungen ausgeschaltet, dann geht er rein.

Karl Heinz Buchegger schrieb:
> Sind ja auch weitgehed
> gleich, lediglich im einen Fall wird noch ANODE_MATRIX eingeodert

Aber dann sind sie doch nicht gleich. Wenn der sowas wegoptimiert, dann 
funktioniert doch mein Programm nicht mehr??!!
#2907413
Lesenswert?

Ersan schrieb:

> Aber dann sind sie doch nicht gleich. Wenn der sowas wegoptimiert, dann
> funktioniert doch mein Programm nicht mehr??!!


Der optimiert es ja nicht 'weg'!

Der optimiert es nur so, dass der entstehende Code eben keine 1:1 
Entsprechung mehr mit deinem C-Code hat. Funktional kommt dasselbe raus. 
Heisst: Dein Programm macht schon noch das, was du hingeschrieben hast. 
Nur macht es das eben ein wenig anders (schneller) als so wie du das 
hingeschrieben hast. Sonst bräuchte man ja keinen Optimizer, wenn dann 
sowieso wieder dasselbe rauskommen soll, wie du das hingeschrieben hast.
Gast #2907426
Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber hör auf Peter. Der hat von Hardware mehr Ahnung als ich.

Ja, ich nehme mir das auf jeden Fall auch zu Herzen. Kann mir denn dann 
nochmal jemand das hier erklären:

Ersan schrieb:
> OK, einen Basiswiderstand brauche ich dann nicht? Stellt der Strom
> dadurch dann automatisch ein? Dann hätte ich ca. 4,3V am Emitter
> anliegen, richtig? Ist der Basisstrom dann automatisch genau so hoch,
> wie der Strom im Kollektor-Emitter-Zweig / Verstärkungsfaktor?
Gast #2907556
Lesenswert?

Klaus 2m5 schrieb:
> Dein Scope-Bild sagt aber 440µs, also etwas über 2 kHz.

Das stimmt. Aber da ist auch kein Programm am laufen, sondern in der 
main wird nur ständig die Anzeige aktualisiert. Aber es macht auch 
keinen Unterschied, ob es (wie jetzt gerade) mit Timer läuft, oder eben 
nur in der main. Das ungewünschte Leuchten bleibt.

Die LEDs glimmen nicht, wenn das Segment bei der vorherigen Stelle nicht 
an gewesen ist. Es liegt also auf jeden Fall daran. Nur es ändert leider 
auch nichts, wenn ich beispielsweise mehrere male hintereinander alles 
lösche um die Zeit zu verzögern.
#2907723
Lesenswert?

Ersan schrieb:
> Hat jemand von euch vielleicht die Nerven, mir kurz zu erklären, warum
> das so ist? Also weshalb NPN und PNP sich so anders verhalten?

Das liegt vielleicht daran, dass in Kollektorschaltung der Transistor 
nicht in die Sättigung kommt, in Emitterschaltung aber schon.

Wenn das Scopebild also nicht den "echten" Betrieb darstellt, hat es 
auch keinerlei Aussagekraft. Wahrscheinlich war auch keins der Segmente 
von der anderen Seite angesteuert? Wie soll sich da die parasitäre 
Kapazität entladen?

Wer misst, misst Mist, so auch hier.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren