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.
>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.
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
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.
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
Habe gerade zwei andere Netzteile ansprobiert, u.a. ein Labornetzteil - das Ergebnis ist immer dasselbe. Das Foto zeigt mein Problem, bzw. frage.
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.
>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..
>* 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!
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
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.
Alles in EINEM interruptAUFRUF???? Das kann dann ja nicht richtig gehen!!! Du musst mit JEDEM Interrupt nur EIN digit aufleuchten lassen! Frage: Warum ??
>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!
Übrigens, das Problem kann auch an den Transistoren liegen, die bei höherem Strom (mehr Segmente an) einen höheren Spannungs-Drop haben.
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; }
- 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.
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..
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
Ü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?
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.
Tue mir mal die genaue Dekl. von dig geben und die Anschlussbelegung von PortA !
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.
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.
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.
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.
Ü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.
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 | }
|
>Ü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.
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.
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?
>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!
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?
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?
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
>? 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.
@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
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.