Forum: Mikrocontroller und Digitale Elektronik Helligkeit LED Multiplexing


von Sven (Gast)


Lesenswert?

Hallo,

ich habe mich in der vergangenen Woche eine Schaltung aufgebaut wo vier 
7-Segmentanzeigen mittels Multiplexing durch einen ATmega16 angesteuert 
werden. Die Schaltung ist der übliche Standard, die Kathoden der 
Segmente sind über einem 150 Ohm Widerstand an einen Port angeschlossen. 
Ein anderer Port steuert die Transistoren welche wiederum die Anode 
schalten. Das Display hat jeweils für ein Digit eine Gemeinsame Anode. 
In vielen Beispielschaltungen habe ich gesehen das die Basis der 
Transitoren über einen Vorwiederstand angesteuert werden, bei mir wird 
dann das Display nicht hellt genug. Also steuere ich die Transitoren 
ohne Vorwiederstand an - was bestimmt nicht richtig ist.

Meine eigentliche Frage, bzw. Problem, ist allerdings das je nach der 
Anzahl der leuchtenden Segmente die Ziffern unterschiedlich hell 
leuchten. Eine 1 (zwei angesteuerte Segmente) leuchtet heller als eine 8 
(mit 7 angesteuerten Segmenten). Warum ist das so und wie kann man dies 
ändern.

Vielen Dank schon mal im vorraus für einen hilfreichen Betrag.

von Dummy (Gast)


Lesenswert?

>Eine 1 (zwei angesteuerte Segmente) leuchtet heller als eine 8
>(mit 7 angesteuerten Segmenten). Warum ist das so und wie kann man dies
>ändern.

Nimm ein dickeres Netzteil.

von Rolle (Gast)


Lesenswert?

Was für Transistoren verwendest du an den Anoden? Ich hoffe doch PNP 
oder?

Ansonsten mal Messen ob das Netzteil in der Spannung einbricht wenn 
viele Segmente leuchten.

Rolle

von Sven (Gast)


Lesenswert?

Hallo,

als Transistoren verwende ich BC557B, also PNP. Ich glaube nicht, dass 
es an der Stromversorgung liegt. Ich habe mittels eines 7805 (max 1 A) 
12 Volt auf 5 Volt gebracht. das eigentliche Netzteil schmeisst 12V und 
max. 4A.

von Rolle (Gast)


Lesenswert?

Hi,

hast du nach dem spannungsregler einen großen elko? Auf schnelle 
Lastsprünge wie diese beim Multiplexen entstehen reagieren Linearregler 
ohne ausreichend dimensionierten ELko am Ausgang zu Pufferung unter 
Umständen etwas träge.

Poste doch mal am besten den Schaltplan dann kann ich vielleicht mehr 
dazu sagen.

Rolle

von Sven (Gast)


Lesenswert?

Habe gerade zwei andere Netzteile ansprobiert, u.a. ein Labornetzteil - 
das Ergebnis ist immer dasselbe. Das Foto zeigt mein Problem, bzw. 
frage.

von Sven (Gast)


Angehängte Dateien:

Lesenswert?

hier nochmal das Foto.

von zweiäugig (Gast)


Lesenswert?

Evtl. sind die wenigen Segmente länger an?

von Sven (Gast)


Lesenswert?

Daran hab ich auch schon gedacht, der Ablauf der Ansteuerung ist wie 
folgt:

* alle Digits sind aus
* x-mal in der Sekunde wird ein Interrupt ausgelöst.
* die anzuzeigenden Segmente werden über PORT C angesteuert, bzw. nicht 
angesteuert (negative Logik)
* dann wird das 1. Digit über PORT A (also der Trasistor) angesteuert
* es wird eine gewisse Zeit gewartet (nop' s) damit das digit eine zeiti 
aufleuchtet
* dann wird das Digit wieder ausgeschaltet

usw. bis alle Digits durchgeschaltet sind. Die Zeit in der das jeweilige 
Digit leuchtet müsste also immer gleicht sein.

von Ralf (Gast)


Lesenswert?

Wie sind die Transistoren angesteuert? Streuung der Transistoren?

von Matthias L. (Gast)


Lesenswert?

>t du an den Anoden? Ich hoffe doch PNP oder?

Ich würde lieber NPN nehmen, um die Anoden anzusteuern..


Poste mal einen Schaltplan, dann kann ich dir weiterhelfen.
Aber deine Schaltungsbeschreibung ist zu dürftig..

von Matthias L. (Gast)


Lesenswert?

>* alle Digits sind aus
>* x-mal in der Sekunde wird ein Interrupt ausgelöst.
>* die anzuzeigenden Segmente werden über PORT C angesteuert, bzw. nicht
>angesteuert (negative Logik)
>* dann wird das 1. Digit über PORT A (also der Trasistor) angesteuert
>* es wird eine gewisse Zeit gewartet (nop' s) damit das digit eine zeiti
>aufleuchtet
>* dann wird das Digit wieder ausgeschaltet

Alles in EINEM interruptAUFRUF????

Das kann dann ja nicht richtig gehen!!!
Du musst mit JEDEM Interrupt nur EIN digit aufleuchten lassen!

von Sven (Gast)


Angehängte Dateien:

Lesenswert?

Hier mein Schaltplan, nich besonders schön da auf die schnelle gemacht. 
Die Vorwiderstände an der Basis der Transitoren verwende ich derzeit 
nicht da sonst die gesamte Anzeige sehr dunkel ist.

Danke

von Matthias L. (Gast)


Lesenswert?

Die Schaltung ist in Ordnung. Evtl sind die 150Ohm etwas viel.
Aber die Basiswiderstande müssen ZWINGEND rein, sonst nimmt dir das dein 
PORTA übel!

Dann wirds an der Software liegen. SO wie ich im letzten Post 
beschrieben habe.
Poste Sie mal bitte.

von Sven (Gast)


Lesenswert?

Alles in EINEM interruptAUFRUF????

Das kann dann ja nicht richtig gehen!!!
Du musst mit JEDEM Interrupt nur EIN digit aufleuchten lassen!

Frage: Warum ??

von Matthias L. (Gast)


Lesenswert?

>Frage: Warum ??

Ganz einfach:

Interrupt kommt:
 - Ausgabe 1.Stelle.
 - mit nops warten (also paar MIKROsekunden)
 - Ausgabe 2.Stelle.
...
 - Ausgabe 4.Stelle.

LANGE warten, bis neuer Interrupt.

FOLGE: 4.Stelle leuchtet VIEL länger! => und erscheint viel heller!

Poste mal den Code!

von Simon K. (simon) Benutzerseite


Lesenswert?

Übrigens, das Problem kann auch an den Transistoren liegen, die bei 
höherem Strom (mehr Segmente an) einen höheren Spannungs-Drop haben.

von Sven (Gast)


Lesenswert?

der code, ohne kommentare.

ISR (TIMER2_COMP_vect)
  {
  uint8_t tmp_sreg;
  tmp_sreg=SREG;
  cli();

  uint8_t b0, b1, b2=60, b3=1;

  // digits anzeigen 8 stueck
  for(b0=1; b0<9; b0++)
    {
    PORTC = dig[b0];
    PORTA &= ~(1<<(b0-1)); // an
    for(b1=0; b1<b2; b1++)
      {
      asm volatile("nop");
      }
    PORTA |= (1<<(b0-1)); // aus
    }

  SREG=tmp_sreg;
  }

von Sven (Gast)


Lesenswert?

- Ausgabe 4.Stelle.

LANGE warten, bis neuer Interrupt.

FOLGE: 4.Stelle leuchtet VIEL länger! => und erscheint viel heller!

Ne, nachdem die 4. stelle aufgeleucht hat geht sie ja wieder aus, bis 
zum nächsten Interrupt.

von Matthias L. (Gast)


Lesenswert?

Gibt mir mal die Deklaration von dig, also ist das ein
uint8_t dig[4] ??

und dann bitte die exakten Portpins von PortA,

Also:
Segment1 an PortA1
Segment2 an PortA3
..

dann änder ich dir den Code so, dass er geht..

von Sven (Gast)


Lesenswert?

Hallo Matthias,

dig[n] enthält die Segmente die leuchten sollen. dig[n] wird ausserhalb 
der Interruptroutine definiert damit die Interroutroutine nicht zu lange 
dauert.
Die Interruptroutine läuft also wie folgt durch: dig[n] an PORT C legen, 
dann Digit 1 an, also Trasistor ansteuern. das ganze dann eben 4 oder 8 
mal.

Danke

von Ralf (Gast)


Lesenswert?

Über die Art wie du das machst, kann man sicher streiten, aber ich glaub 
nicht das es ein Software-Problem ist. Ich würde an deiner Stelle mal 
jeden Transistor einzeln ansteuern und die Uce Restspannung messen.

Leuchtet die 1 auch heller wenn sie an der letzten Stelle leuchtet?

von Sven (Gast)


Lesenswert?

Ja es ist völlig egal wo ich die 1 plazieren sie leuchtet immer heller, 
demnach liegt es nicht an den Transistoren. Die 1 leuchtet auch dann 
heller wenn ich sie permanent ansteuere, also ohne Multiplexing. Das 
habe ich schon Ausprobiert.

von Matthias L. (Gast)


Lesenswert?

Tue mir mal die genaue Dekl. von dig geben und die Anschlussbelegung von 
PortA !

von Chrisi (Gast)


Lesenswert?

Nein, nein, das ist ja Wahnsinn. Die Schaltzeiten der PNP sind ja viel 
langsamer wie die Multiplexfrequenz, die hier Zustande kommt... Die 
"Bildwiederholfrequenz" sollte bei 100-200 Hz liegen und ist ja 
eigentlich unkritisch, aber bitte nicht 100kHz.

Und zwischen den Timerinterrupts sind die Anzeigen wohl aus? So hat sich 
das der Herr Multiplex aber nicht gedacht.

von Simon K. (simon) Benutzerseite


Lesenswert?

Sven wrote:
> Die 1 leuchtet auch dann
> heller wenn ich sie permanent ansteuere, also ohne Multiplexing. Das
> habe ich schon Ausprobiert.

Gerade DANN liegt doch die Vermutung nahe. Mal davon abgesehen, dass du 
die Transistoren überlastest (7*20mA = 140mA. 40mA über dem 
Maximalstrom).

Lies dir meinen oberen Beitrag nochmal durch.

von Sven (Gast)


Lesenswert?

Hallo Matthias,

PORT A (Transistoransteuerung)

PA0 = Digit1
PA1 = Digit2
PA2 = Digit3
PA3 = Digit4


PORT C (Segmentansteuerung)

dp (dezimalpunkt) = PC0
Segment g = PC1
Segment f = PC2
Segment e = PC3
Segment d = PC4
Segment c = PC5
Segment b = PC6
Segment a = PC7

dig[n] enthält die Dezimalzahl für die leuchtenden Segmente, also dig[1] 
enthält die Segmente die am 1. Digit leuchten sollen. dig[2] die am 
zweiten usw.

von Matthias L. (Gast)


Lesenswert?

1
//                       seg0   seg1   seg2   seg3  (Pinzuordnung)
2
const uint8_t   tab = { ~0x01, ~0x02, ~0x04, ~0x08 };   // könnte noch in den PROGMEM als Konstante rein
3
...
4
uint8_t    dig[4];
5
...
6
dig[0] = 0b01001111;     // Anzeigedaten für Stelle0
7
dig[1] = 0b01001111;
8
dig[2] = 0b01001111;
9
dig[3] = 0b01001111;     // Anzeigedaten für Stelle3
10
...
11
ISR (TIMER2_COMP_vect)
12
  {
13
    //-- local var
14
    static uint8_t   coloumn;
15
    //-- nächste Spalte
16
    coloumn++;
17
    coloumn  &=  0x03;
18
    //-- Ausgabe aktuelle Spalte
19
    PORTC = dig[coloumn];
20
    PORTA = tab[coloumn];
21
  }

Das geht, falls der Timer-Interrupt in gleichmäßigen Abständen auftritt.
(Man nimmt dafür aber eher den Overflow als den Compare-Int)

PS: beim Einsprung in ISR's wird automatisch ein cli durchgeführt.
Und um das Retten von Registern (sreg zB) kümmert sich der Compiler 
selbst.

von Sven (Gast)


Lesenswert?

Über das Timing habe ich mir noch keine Gedanken gemacht, auf jeden Fall 
mehr als 50, 100 oder 200 Hz. Auf jeden Fall flimmert es nicht. Aber mal 
im ernst, die Transistoren müssen doch im "null komma nichts" 
durchschalten. Ok die 140 mA sind zuviel (laut Datenblatt max. 100 mA), 
aber wie wird es dann gemacht.

von Matthias L. (Gast)


Lesenswert?

Hier müssen die Anzeigedaten in dig[] schon aufbereitet sein, also die 
Umwandlung Zahl=>7Segment muss gemacht worden sein,
sonst geht auch:
1
//                       seg0   seg1   seg2   seg3  (Pinzuordnung)
2
const uint8_t   tab = { ~0x01, ~0x02, ~0x04, ~0x08 };
3
const uint8_t   segment = {  0b00100100, 0b01010011,  // 0, 1
4
                             0b00100100, 0b01010011,  // 2, 3
5
                             0b00100100, 0b01010011,  // 4, 5
6
                             0b00100100, 0b01010011,  // 6, 7
7
                             0b00100100, 0b01010011,  // 8, 9
8
                           }; // Binärwerte müssen angepasst werden!
9
...
10
uint8_t    dig[4];
11
...
12
dig[0] = 1;     // Zahl für Stelle0
13
dig[1] = 2;
14
dig[2] = 3;
15
dig[3] = 4;     // Zahlfür Stelle3
16
...
17
ISR (TIMER2_COMP_vect)
18
  {
19
    //-- local var
20
    static uint8_t   coloumn;
21
    //-- nächste Spalte
22
    coloumn++;
23
    coloumn  &=  0x03;
24
    //-- Ausgabe aktuelle Spalte
25
    PORTC = segment [ dig[coloumn] ];
26
    PORTA = tab[coloumn];
27
  }

von Matthias L. (Gast)


Lesenswert?

>Über das Timing habe ich mir no..

Die schaltung ist MIT basisvorwiderständen VOLLKOMMEN korrekt!!!!

Lass die So!!

Auch die 140mA passen, solange die 100mA-Angabe des Transisotr  nicht 
grade die ABSOLUTE MAXIMUM RATINGS sind.

von Sven (Gast)


Lesenswert?

Danke Matthias,

ich werde gleich morgen Deinen Code ausprobieren, heute schaff ich das 
nicht mehr - bin zu müde. Aber auf jeden Fall sieht Dein Code besser aus 
als meiner, ich habe nämlich die Angewohnheit meinen eigenen Code nur an 
dem Tag zu verstehen wo ich ihn geschrieben habe. Ich schreibe dann 
morgen obs geklappt hat.

Vielen Dank für Deine Tipps und Hilfe, das mit dem Overflow war mir 
schon immer lieber, dachte aber der Comprare Match ist moderner.

von Simon K. (simon) Benutzerseite


Lesenswert?

Matthias L. wrote:
>>Über das Timing habe ich mir no..
>
> Die schaltung ist MIT basisvorwiderständen VOLLKOMMEN korrekt!!!!
>
> Lass die So!!
>
> Auch die 140mA passen, solange die 100mA-Angabe des Transisotr  nicht
> grade die ABSOLUTE MAXIMUM RATINGS sind.

Sorry Leute aber was macht ihr hier? Das Problem ist doch KLAR und von 
mir öfters benannt hier.

http://www.nxp.com/acrobat_download/datasheets/BC556_557_4.pdf

ABSOLUTE MAXIMUM RATINGS:
COLLECTOR CURRENT (DC) 100mA

(Und das gilt, wenn du den Transistor "testweise" mal dauer-an stellst. 
Im Multiplex-betrieb fließt natürlich gemittelt ein niedriger Wert. Da 
sollte das (so gerade) ok sein)

Das Problem ist:
Der Drop an dem Transistor verändert sich je nachdem wieviele Segmente 
leuchten, deshalb die unterschiedliche Leuchtstärke. Was ist da dran 
denn nicht zu verstehen?

von Matthias L. (Gast)


Lesenswert?

>Was ist da dran denn nicht zu verstehen?

Ganz einfach:

Eine Zeile drunter steht:
>>peak collector current - -200 mA

Also passt das im Multiplexbetrieb!


Ein 1k Basiswiderstand lässt etwa 4,4mA Basisstrom fließen, da wir 140mA 
Kollektorstrom brauchen, muss die Stromverstärkung größer als 32 sein..

Das ist lt deinem Datenblatt, Fig3, für Kollektorströme kleiner 250mA 
gegeben.
Da die Stromverstärkung (weit) größer als diese 32 ist, ist der 
Transistor in der Sättigung, und da sagt das Datenblatt ca 0,94V 
Sättigungsspannung..

Na und? Die Schwankt nicht so stark. Das ist verkraftbar...

Aber um sowas vorzubeugen, mein erster Einwand (01:29):
>>Ich würde lieber NPN nehmen, um die Anoden anzusteuern..

FAZIT: Softwareproblem!

von Ralf (Gast)


Lesenswert?

Fehlendes Verständnis für Halbleiter...

von Simon K. (simon) Benutzerseite


Lesenswert?

Matthias L. wrote:
> FAZIT: Softwareproblem!

Du bist auch n Profi oder? Wenn er ohne Multiplex eine 1 anzeigen lässt, 
ist die immernoch heller als eine 8. Hat er oben geschrieben.

Aber klaar: Softwareproblem da, wo keine Software ist?

von Matthias L. (Gast)


Lesenswert?

Ihr müsst meine Beiträge KOMPLETT lesen!

Ich habe immer geschrieben, die Schaltung ist in Ordnung MIT DEN 
BASISVORWIDERSTÄNDEN !!

@Sven:
Aber die Ports A und C hast du schon auf Ausgang geschalten?

von Roland Z. (r-zimmermann)


Lesenswert?

Hi zusammen,

ich würde folgendes machen: Der AVR ist spezifiziert daß maximal 20mA 
pro Portpin gesourced oder gesinkt werden kann. insgesamt liegt das 
absolute maximum laut Datenblatt bei 200mA die durch die VCC oder die 
GND Pins fließen dürfen. Erreicht hat ist das zugegebenermaßen noch 
nicht, aber kontrollier mal die Versorgungsleitungen zum uC. Ich weiß 
daß hört sich blöd an ist mir aber schon passiert, Leiterplatte gemacht, 
ich war der Meinung ich hab an alles gedacht und nach dem Aufbau hatt 
ich an den Verbindungsbahnen zum uC da ich die recht dünn ausgelegt 
hatte je nach fließendem Strom einen relativ großen Spannungsabfall. Es 
war glaube ich auch eine Schaltung mit 7-Segment-Anzeigen wenn ich mich 
recht erinnere. Ich hatte vergessen außer dem Strom des uC den Strom der 
Anzeigen (und die schlucken im verhältnis ja um einiges mehr) 
einzubeziehen...

Was ich vielleicht auch machen würde, die PNPs an den Anoden würde ich 
vom Strom her etwas größer wählen. Wenn der uC mal Abstürzt und das 
Multiplexing einstellt fließt durch den PNP ja kein Pulsförmiger Strom 
mehr sondern ein Dauerstrom. Das quittiert der dann unter Umständen mit 
dem Siliziumtod...
Ich würde einen BC327 als PNP verwenden, der kann 500mA damit bist du 
auf der Sicheren Seite.

@Matthias L., weshalb die Anoden mit NPN Ansteuern? Damit verschenkst du 
den Vorteil einer hohen Transistorverstärkung, besonders wenn das Teil 
in Kollektorschaltung betrieben wird. Um das Auszugleichen mußt du mehr 
Strom in die Basis einbringen. Da die meisten Controller eh besser 
sinken als sourcen können ist der PNP meiner Meinung nach besser, 
Vorausgesetzt die Anzeigen werden nicht mit mehr Spannung als der uC 
Betrieben. Falls das der Fall ist hilft ein "Levelshifter" mit einem NPN 
der bei Ansteuerung mit positiver Logik dem PNP die Basis "runterzieht" 
und ihn dadurch öffnet, in Emitterschaltung weiter.
Die Anoden jedoch nur mit einem NPN Anzusteuern ist von der 
Schaltungsauslegung her etwas unprofessionell, allein schon weil man 
sich damit einige Probleme einhandelt.

So jetzt warte ich auf haue :D

Rolle

von Matthias L. (Gast)


Lesenswert?

>? Damit verschenkst du
>den Vorteil einer hohen Transistorverstärkung, besonders wenn das Teil
>in Kollektorschaltung betrieben wird. Um das Ausz

Wieso?

Die Kollektorschaltung hat folgende VOrteile (zumindest seh ich das als 
VOrteil)

- Kein Basiswiderstand notwendig.
- schnelleres Umschalten, da keine Transistorsättigung
- Basisstrom nur so groß, wie für Laststrom nötig!


>Um das Auszugleichen mußt du mehr
>Strom in die Basis einbringen

Nein, weniger! Und der regelt sich noch von allein!

> einer hohen Transistorverstärkung
Nein. Kollektor und Emitterschaltung haben ähnlich (hohe) 
Stromverstärkungen, dieser ist in beiden Fällen ~b.

von Roland Z. (r-zimmermann)


Lesenswert?

@Matthias L.,

Sorry, das kommt raus wenn man in zu vielen Threads gleichzeitig 
mitliest, bitte entschuldige du hast natürlich recht ich habe da einiges 
durcheinandergeworfen... furchtbarschämundrotwerd

Heute ist definitiv nicht mein tag....... :/

MfG
Rolle

von Matthias L. (Gast)


Lesenswert?

Jaja, wir Männer sind halt nicht multitasking-fähig

;-)

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.