Forum: Mikrocontroller und Digitale Elektronik 7 Segment LED Anzeige ohne Vorwiderstand und Transistor


von Johannes Jörg S. (johannesjrg_s)


Lesenswert?

Hallo!

Ich möchte eine Uhr mit vier 7 Segment LED Anzeigen und einem ATTiny2313 
realisieren. Dazu habe ich das Tutorial durchgelesen 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
(vielen Dank!).

Jetzt habe ich folgendes gefunden:
http://www.avr-tutorials.com/projects/atmega16-based-digital-clock

Hier werden keine Vorwiderstände und auch keine Transistoren verwendet, 
was ich ziemlich elegant finde.
Was sagt Ihr dazu? Unter welchen Umständen ist dieser Weg gangbar?

Es freut sich der mikrocontroller.net-Forenneuling
Johannes

von TBI (Gast)


Lesenswert?

Datenblattkonform ist das bestimmt nicht...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

TBI schrieb:
> Datenblattkonform ist das bestimmt nicht...

Ist die Frage, welche Flussspannung die LEDs in den Displays haben.

Prinzipiell ist die Ausgangsstufe eines AVR natürlich einigermaßen
eine Konstantstromquelle.

von Uwe (de0508)


Lesenswert?

Hallo,

ich habe das Thema schon "durch" und diese kleine serielle LED-Anzeige 
und mehr fach in Betrieb.

Die Beiträge waren sehr hilfreich, so dass die aktuelle Schaltung in 
einem HF-Umfeld - mit HF Messköpfen nur sehr geringe Störungen 
verursachen.
~ -80dBm

Beitrag "4 stellige 7 Segment im Multiplexing"

Im Gegensatz zum Schaltbild verwende ich nun als Vorwiderstände jeweils 
270 Ohm.

Die Behauptung, dass eine serielle Kommunikation mit 9600 bit/s nicht 
funktioniert, kann ich nicht bestätigen !

Die Bitzeit beträgt ja gut 104µs das reicht für so einen Hardwareuart 
aus.
Im Atmel AVR Datenblatt ist etwas mehr zum Sampeln des RX Pin 
nachzulesen.

: Bearbeitet durch User
von TBI (Gast)


Lesenswert?

Uwe S. schrieb:
> Die Beiträge waren sehr hilfreich, so dass die aktuelle Schaltung in
> einem HF-Umfeld - mit HF Messköpfen nur sehr geringe Störungen
> verursachen.
> ~ -80dBm

Wer hat danach gefragt?

Uwe S. schrieb:
> Im Gegensatz zum Schaltbild verwende ich nun als Vorwiderstände jeweils
> 270 Ohm.

Das ist vernünftig.

Uwe S. schrieb:
> Die Behauptung, dass eine serielle Kommunikation mit 9600 bit/s nicht
> funktioniert, kann ich nicht bestätigen !

Hat wer behauptet?

Uwe S. schrieb:
> Die Bitzeit beträgt ja gut 104µs das reicht für so einen Hardwareuart
> aus.
> Im Atmel AVR Datenblatt ist etwas mehr zum Sampeln des RX Pin
> nachzulesen.

Hä? Völlig offtopic. Mag es sein, dass du das falsche Fenster erwischt 
hast?

von batman (Gast)


Lesenswert?

Woher kommt das mit den 20mA? In meinem Datenblatt vom Tiny2313 lese ich 
da 40mA/Pin max. Desweiteren der max. Gesamtausgangsstrom des t2313: 
60mA vs. 7Segx20mA=140mA. Paßt irgendwie nix.
Das mit der Konstantstromquelle hab ich auch nicht verstanden. Hängt der 
Strom nicht von Spannung und Last ab?

von batman (Gast)


Lesenswert?

Kleine Korrektur: Gesamtstromlimit t2313 liegt bei 200mA, da man auf die 
Pegel pfeift.

von c-hater (Gast)


Lesenswert?

Johannes Jörg S. schrieb:

> Hier werden keine Vorwiderstände und auch keine Transistoren verwendet,
> was ich ziemlich elegant finde.
> Was sagt Ihr dazu? Unter welchen Umständen ist dieser Weg gangbar?

Gangbar ist er unter folgenden Bedingungen:

1) Die Displays sind sehr eng toleriert bezüglich der Flussspannungen 
der einzelnen LEDs und auch bezüglich der Helligkeitsabweichungen bei 
gleichem Strom.

2) Die Versorgungsspannung der ganzen Sache wird passend zur 
Flussspannung der LEDs so gewählt, dass sich für den AVR Ausgangsströme 
im erlaubten Bereich ergeben.

Schlecht ist die Lösung aber auch dann noch.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wenn Du Dein Programm so schreibst, dass immer nur 1 LED pro Zeiteinheit 
eingeschaltet ist, dann fließt immer nur der Strom durch Controller und 
Pin, der sich aus Versorgungsspannung minus LED-Flussspannung, dividiert 
durch den Kanalwiderstand des Ausgangs (etwa 80 Ohm bei 3V Versorgung) 
ergibt. Damit bist Du immer im Limit. Allerdings könnte Deine Anzeige 
durch den geringeren Tastgrad der einzelnen LEDs (also durch das 
Multiplexing) recht dunkel werden. Wenn die Anzeige aber eine hohe 
Effizienz besitzt, könnte das schon klappen.

von Radler (Gast)


Lesenswert?

Schaut doch mal in den Schaltplan vom 2. Link. Da hängt in der 
Versorgungsleitung schon ein 1k Widerstand der den Strom begrenzt.

Jetzt hätte ich gerne nur noch eine Erklärung warum man das macht, da 
der µC ja so keine konstante Versorgungsspannung je nach Schaltzustand 
hat.

von Michael U. (amiga)


Lesenswert?

Hallo,

um zu zeigen, daß man mit einem Mega16 eine Uhr bauen könnte, so wie es 
der Schaltplan zeigt, kann man die Schaltung nehmen.

"Uhr bauen könnte" weil
- der AVR wird im Prinzip mit der Flußspannung der LEDs betrieben.
bei grünen LEDs also wohl irgendwo um 3V rum, weil der Spannungsabfall 
der Ausgangstreiber des Ports dazukommt.
Gut möglich, daß er damit stabil läuft, due AVR sind recht großzügig.
- 4MHz interner Oszillator und Uhr mit Sekundenanzeige ist zumindest ein 
Garant dafür, die Zhr oft geneu zu stellen, die Sekudnen hätte ich da 
leiber weggelassen.
- 1k bei vermutlich ca. 2V Spannungsabfall sind 2mA LED-Strom für die 
komplette Anzeige, es müssen also wohl sehr helle Anzigen sein.

Daß der Mega16 selbst ohne Abblockkondensator an Vcc und nicht 
angeschlossener AVcc spielt, halte ich durchaus für möglich.
Er wird so auch keinen Schaden nehmen, die Ströme sind gering genug.

Es wird eben alles ins Netz gestellt, was irgendwie mal gespielt hat.
Die Entscheidung, es so zu nutzen, wie man es finden, blebt letztlich 
immer bei dem, der es nachbaut.

Gruß aus Berlin
Michael

von m.n. (Gast)


Lesenswert?

Johannes Jörg S. schrieb:
> Jetzt habe ich folgendes gefunden:
> http://www.avr-tutorials.com/projects/atmega16-based-digital-clock
>
> Hier werden keine Vorwiderstände und auch keine Transistoren verwendet,
> was ich ziemlich elegant finde.

Nicht einmal ein Abblockkondensator wurde verschwendet. Offensichtlich 
ein Projekt für sehr hohe Stückzahlen :-)

> Was sagt Ihr dazu? Unter welchen Umständen ist dieser Weg gangbar?

Diese Schaltung taugt nichts, nimm die aus dem Tutorial mit 
Digit-Treibern und Vorwiderständen und einem Abblockkondensator mit >= 
47 µF + 100 nF.
Wenn es dann noch eine Uhr werden soll, ist ein stabiler Quarztakt 
erforderlich.

Jörg W. schrieb:
> Prinzipiell ist die Ausgangsstufe eines AVR natürlich einigermaßen
> eine Konstantstromquelle.

Nur liegen diese Ströme im 'destruktiven' Bereich, weil sie viel zu hoch 
sind.

von MaWin (Gast)


Lesenswert?

Johannes Jörg S. schrieb:
> Hier werden keine Vorwiderstände und auch keine Transistoren verwendet,
> was ich ziemlich elegant finde.

Ungefähr so elegant, wie ein Auto ohne Gummireifen das nur auf der Felge 
fährt, schon braucht man keine Sommer- und Winterreifen mehr.

Man hat was gespart, aber die schlechteste Qualität und irgendwann geht 
was kaputt.

Da der Digit-Ausgang zwischen 20 und 40 mA am Strom begrenzen ist, 
teilen sich die mA auf die Anzahl der Segmente auf, eine 1 hat 2 hellere 
Segmente als die 7 Segmente einer 8, und den Murks sieht man. Ausserdem 
wird der uC heiss.

Es gab hier im Form mal ein Bild von so einem Pfusch.

von 6a66 (Gast)


Lesenswert?

Radler schrieb:
> Schaut doch mal in den Schaltplan vom 2. Link. Da hängt in der
> Versorgungsleitung schon ein 1k Widerstand der den Strom begrenzt.
>
> Jetzt hätte ich gerne nur noch eine Erklärung warum man das macht, da
> der µC ja so keine konstante Versorgungsspannung je nach Schaltzustand
> hat.

Ist der größte "Mist" den ich je gesehen habe.
Bei 2mA durch die LEDs fallen an dem Widerstand schon 2V ab. Und das 
dann auch noch multiplexen .... vom 20mA wollen wir da garnicht reden. 
Wird hat eine Nachtuhr für Neumondmächte :)

Die Webpage gibt schon kein Impressum an wer dafür zuständig ist. Warum 
wohl ...

von Peter D. (peda)


Lesenswert?

Hier mal ein Bild:

https://www.mikrocontroller.net/attachment/93262/224-2405_IMG.JPG

Man sieht sehr schön, wie der '-' völlig überstrahlt und die '8' 
deutlich dunkler ist, als die '7'.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

m.n. schrieb:
>> Prinzipiell ist die Ausgangsstufe eines AVR natürlich einigermaßen
>> eine Konstantstromquelle.
>
> Nur liegen diese Ströme im 'destruktiven' Bereich, weil sie viel zu hoch
> sind.

Hängt von der Betriebsspannung ab.  Bei 5 V gebe ich dir Recht, bei
2,7 V gibt es Kurven im Datenblatt, da sättigt ein ATmega16 schon
bei ca. 25 mA.

Mit seinem Nachfolger ATmega164 sollte man das jedoch nicht mehr
machen. ;-)

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Deswegen der Vorschlag, zu einer Zeit nur eine LED leuchten zu lassen. 
Das Tastverhältnis ist in dem Fall 1/Anzahl der LEDs. Macht die Anzeige 
zwar nicht heller, aber die Ungleichmäßigkeiten wie im o.g. Bild gibt es 
dann nicht, da alle LEDs immer den gleichen Kanalwiderstand sehen und 
die gleiche "Ein"-Zeit haben. Funktioniert aber nur mit superhellen / 
effizienten LED-Anzeigen. Hat man die nicht, sind Transistoren und 
Vorwiderstände zwingend.

von m.n. (Gast)


Lesenswert?

Jörg W. schrieb:
> Hängt von der Betriebsspannung ab.  Bei 5 V gebe ich dir Recht, bei
> 2,7 V gibt es Kurven im Datenblatt, da sättigt ein ATmega16 schon
> bei ca. 25 mA.

Mag so sein. Mein letztes Datenblatt vom ATmega16 ist von 2003 und da 
stehen noch keine typischen Kurven. Ein neueres Datenblatt brauche ich 
nicht mehr ;-)

Mit dem ATtiny2313 sind ja schon modernere Zeiten angebrochen, da nimmt 
man dann halt acht Widerstände, auch wenn diese ein kleines Vermögen 
kosten ;-)
Abweichend zu der im Tutorial gezeigten Schaltung, ist es besser, BC327 
in Emitterschaltung zu verwenden. Man spart dadurch die vier 1 kOhm 
Widerstände (so wird man Millionär!) und fährt die Transistoren nicht in 
die Sättigung.

Als Erfahrungswert ergibt das über den Segmentwiderständen einen 
Spannungsabfall von ca. 1,7 V bei 5 V Versorgungsspannung. Bei 100 Ohm 
und 4-fach Multiplex erhält man einen Segmentstrom von 4,3 mA, was bei 
aktuellen 7-Segmentanzeigen schon fast zu hell ist. Aber gut, dunkler 
bekommt man die Anzeigen immer. (Dies nur als Hinweis für Neulinge.)

von batman (Gast)


Lesenswert?

Knut B. schrieb:
> Deswegen der Vorschlag, zu einer Zeit nur eine LED leuchten zu
> lassen.
> Das Tastverhältnis ist in dem Fall 1/Anzahl der LEDs. Macht die Anzeige
> zwar nicht heller, aber die Ungleichmäßigkeiten wie im o.g. Bild gibt es
> dann nicht, da alle LEDs immer den gleichen Kanalwiderstand sehen und
> die gleiche "Ein"-Zeit haben. Funktioniert aber nur mit superhellen /
> effizienten LED-Anzeigen. Hat man die nicht, sind Transistoren und
> Vorwiderstände zwingend.

Heller wirds und trotzdem gleichmäßig, wenn man je eine ganze Ziffer 
schaltet und deren Leuchtzeit nach der Anzahl der jeweils aktiven 
Segmente bestimmt. Also z.B. eine "8" leuchtet 7x so lange wie ein "-". 
Das wär was für die Billig-Chinesen. :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> Also z.B. eine "8" leuchtet 7x so lange wie ein "-".

Wird nicht funktionieren, denn die Sache ist nichtlinear.  Wenn du
acht Segmente einschaltest, leuchten die nicht mit 1/8 der Stärke
eines einzelnen Segments.  Aber was in der Art könnte man machen,
wenn man denn partout die Widerstände einsparen will. ;-)

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Wird nicht funktionieren, denn die Sache ist nichtlinear.

Richtig. Das geht nur, wenn eine LED leuchtet, da die Stromaufnahme 
einer LED im System immer (annähernd) gleich ist und einen AVR-Ausgang 
nicht überlastet.

von batman (Gast)


Lesenswert?

Muß ja auch nicht linear sein, war nur ein Bsp. aber es gibt sicher eine 
feste Beziehung zwischen Segmentzahl und Leuchtdauer, die man simpel in 
einer Ziffern-Tabelle ablegen und damit den Multiplexer timen könnte.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das Problem ist nicht die Nichtlinearität an sich, sondern die 
Überlastung der Ausgänge, weswegen die LEDs in der Leuchthelligkeit 
einbrechen. Damit heizt Du den AVR.

von batman (Gast)


Lesenswert?

Ja, entweder warm oder dunkel. Wie es beliebt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Knut B. schrieb:
> Damit heizt Du den AVR.

Naja, sonst heizt du die Umwelt halt direkt über die Vorwiderstände,
bleibt sich einigermaßen gleich.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Den Widerständen ist es aber relativ egal ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Knut B. schrieb:
> Den Widerständen ist es aber relativ egal ;-)

Der Controller brennt da auch nicht gleich ab.  Wie gesagt, bei den
alten AVRs, die sind nicht so sehr stromergiebig.  Mit einem neueren
würde ich es nicht tun.

Aber um mal den alten Spruch zu zitieren: „Klar kannste das so machen,
aber dann isses eben Kacke.“

: Bearbeitet durch Moderator
von Thomas E. (picalic)


Lesenswert?

Echt grausig, welcher Mist im Netz als "Tutorial" verkauft wird - und 
dem unbedarften Neuling, der sich an von vermeintlichen Fachkundigen 
veröffentlichten Anleitungen orientieren will, erscheint es "elegant", 
weil so schön minimalistisch!

von Hannes L. (hannes)


Lesenswert?

m.n. schrieb:
> Abweichend zu der im Tutorial gezeigten Schaltung, ist es besser, BC327
> in Emitterschaltung zu verwenden. Man spart dadurch die vier 1 kOhm
> Widerstände

Sicher?

Meinst Du nicht Kollektorschaltung bzw. Emitterfolger?

...

von batman (Gast)


Lesenswert?

jo, und statt BC327 meint er sicher einen NPN, so rum wird ein Schuh 
draus

von m.n. (Gast)


Lesenswert?

Hannes L. schrieb:
> Sicher?
>
> Meinst Du nicht Kollektorschaltung bzw. Emitterfolger?

Flascher Irrtum - natürlich Emitterfolger!

von m.n. (Gast)


Lesenswert?

batman schrieb:
> jo, und statt BC327 meint er sicher einen NPN, so rum wird ein Schuh
> draus

Und natürlich auch das: BC337
Heute war wohl Fön.

von Noch einer (Gast)


Lesenswert?

Er nutzt die unterschiedlichen Programmlaufzeiten für das Multiplexing.

SegDataPort = DigitTo7SegEncoder(seconds%10,1);
SegCntrlPort = ~0x01;
SegDataPort = DigitTo7SegEncoder(seconds/10,1);
SegCntrlPort = ~0x02;
SegDataPort = DigitTo7SegEncoder(minutes%10,1);
SegCntrlPort = ~0x04;
...

seconds%10 geht schneller als seconds/10 . Eigentlich müsste damit die 
erste Ziffer heller erscheinen als die Zweite?

Und der Compiler sollte doch minutes%10 und die (Inline)Funktion so weit 
optimieren, dass man die paar Takte zwischen SegDataPort= und 
SegCntrlPort= nicht ignorieren darf.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Noch einer schrieb:
> seconds%10 geht schneller als seconds/10

Wie kommst du darauf?

Sowohl Quotient als auch Rest sind beides die Ergebnisse einer
Divisionsoperation.  Daher gibt es ja auch eine Funktion div(),
mit der man sich beide Teilergebnisse auf einmal zurückgeben lassen
kann.

von Johannes Jörg S. (johannesjrg_s)


Lesenswert?

Liebe Diskussionsteilnehmer,

einen großen Dank für Eure zahlreichen und fundierten Antworten!

Ich habe jetzt verstanden, dass eine solche Schaltung grundsätzlich 
möglich ist, aber gravierende Nachteile hat. Hierbei wird der 
Mikrocontroller mit der Flussspannung der LEDs betrieben (zB. 1.8V) und 
der Strom über einen gemeinsamen Widerstand begrenzt. Es gibt eine 
Beschränkung in der Belastbarkeit der einzelnen Ausgänge des atTiny2313 
(40mA), wie auch ein Gesamtstromlimit (200mA). Das ist für viele 
Anzeigen zu wenig. Die gemeinsame Strombegrenzung hat zudem eine 
ungleichmäßige Helligkeit der Ziffern zur Folge, je nachdem, wie viele 
Segmente zur Darstellung der Ziffer benötigt werden (eine Eins strahlt 
heller als eine Acht). Das kann durch einen geeigneten Algorithmus 
korrigiert werden, der die Leuchtdauer variiert.

In meinem konkreten Fall werde ich die Transistoren und separate 
Widerstände verwenden, weil ich eine größtmögliche Helligkeit brauche 
und mir Spielraum bei der Wahl der Anzeigen erhalten möchte. Auch wird 
die Verminderung der Komplexität im Schaltungsdesign durch den 
Mehraufwand auf der Softwareseite zunichte gemacht, was die Lösung mit 
gemeinsamer Stromversorgung zumindest bei geringen Stückzahlen 
unwirtschaftlich macht.

Eine ergiebige Diskussion!

Viele Grüße von
Johannes

von Thomas E. (picalic)


Lesenswert?

Johannes Jörg S. schrieb:
> weil ich eine größtmögliche Helligkeit brauche

Dann wäre zu überlegen, ob Du die LEDs nicht besser mit DC betreibst, 
also nicht multiplexen, sondern mit jweils 100% Einschaltdauer. Denn 
beim Multiplexen wird jede LED mit x-fachem Strom bei 1/x Einschaltdauer 
betrieben, wodurch die Effizienz der LED sinkt. Statt einfacher 
Transistoren könnte man je ein 8-Bit Latch pro Anzeigestelle verwenden, 
so daß man nicht so viele IOs am Controller braucht.

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.