Forum: Mikrocontroller und Digitale Elektronik 7-Segmentanzeige Multiplexer Schaltung ok?


von Matthias K. (mklenk)


Angehängte Dateien:

Lesenswert?

Hallo liebe Leut,

ich baue mir eine 4 stellige 7-Segment-Anzeige und wollte noch eine 
Bestätigung, dass die Schaltung so funktioniert. Wenn also jemand die 
Zeit hat, bitte ich ihn, kurz drüber zu schauen. Wer keine Zeit hat, 
darf diesen Post gern ignorieren und braucht keinen "das gabs doch schon 
x-mal" Kommentar abgeben.

Die verwendete 7 Segment Anzeigen: (die im schaltplan ist einfach 
irgendeine aus der eagle lbr)

http://www.reichelt.de/Siebensegment-Anzeigen/SA-08-11-RT/3/index.html?&ACTION=3&LA=5&ARTICLE=31575&GROUPID=3002&artnr=SA+08-11+RT

Das Datenblatt sagt:
    DC Forward Current   30mA
    Peak Forward Current 155mA  (1ms Pulse Width, 1/10 Duty Cycle)
    Forward Voltage      1,85V

Daraus meine Widerstandsberechnung:

Ich hab gedacht, ich setzte 20mA als Betriebsstrom an. Ist das zu wenig?
Es soll schon hell sein, aber die absolut maximum ratings will ich auch 
nicht erreichen.
R=U/I   = (5V-1,85V)/(4*20mA) = 39 Ohm (gibts sogar :D)

die gemeinsame Anode der Anzeigen wird mit einem npn Transistor 
gesteuert. Ist das so richtig im Schaltplan?

Die Zahl, die Angezeigt werden soll bekommt der Controller von einem 
weiteren µC über die Jumper. Der 14bit Wert wird eingelesen und 1-3 
Zyklen angezeigt. Der Punkt der zweiten Stelle wird auch extern 
umgeschaltet. So kann die Anzeige kg (ohne Punkt) und Tonnen (mit einer 
Dezimalstelle) anzeigen.

Programm:
muss zwischen "Einzelnes Segment anschalten" und "Einzelnes Segment 
abschalten" ein delay? Wenn ja wie viel? Ich schätze mal nicht mehr als 
die 1ms aus dem Datenblatt.


Vielen Dank, wenn sich jemand die Mühe macht.

Gruß mklenk

von m.n. (Gast)


Lesenswert?

Matthias Klenk schrieb:
> Ich hab gedacht, ich setzte 20mA als Betriebsstrom an. Ist das zu wenig?
> Es soll schon hell sein, aber die absolut maximum ratings will ich auch
> nicht erreichen.

Warum liest Du nicht die Beiträge, denen zu entnehmen ist, dass das so 
nicht geht. Der µC hat auch ein Datenblatt!
Aber mehr darf ich Dir ja nicht schreiben :-(

von MaWin (Gast)


Lesenswert?

Matthias Klenk schrieb:
> R=U/I   = (5V-1,85V)/(4*20mA) = 39 Ohm (gibts sogar :D)

Du hast den Spannungsabfall am Emitterfolger vergessen, ca. 1V kostet 
der BC337. Die 1k Vorwiderstände kannst du dir in der Schaltung sparen.

Mehr also 20mA bringt der AVR Ausgang auch nicht, also ist der Wunsch, 
die volle Helligkeit aus den Anzeigen rauszuholen in dem man IM MITTEL 
20mA durchschickt, also 80mA 1/4 der Zeit, eh nicht ohne weitere 7 
Treibertransistoren erreichbar.

> die gemeinsame Anode der Anzeigen wird mit einem npn Transistor
> gesteuert. Ist das so richtig im Schaltplan?

Es ist ungewöhnlich, aber bei LEDs die nur 1.85V benötigen möglich. 
Meist verwendet man sättigend schaltende PNP wie BC327, die dann 140mA 
schalten müssten, also auch gerne 7-14mA Basistrom über einen 270-510 
Ohm Vorwiderstand bei active low sehen wollen, aber das ist nicht nötig 
und die UBE(reverse) überschreitest du bei deinen Emitterfolgern an 5V 
auch nicht. Deine Schaltung spart also Widerstände, wenn du es richtig 
machst (siehe oben) denn 140mA*1V=0.14W steht der BC338 durch, zumal 1/4 
der Zeit.

> Die Zahl, die Angezeigt werden soll bekommt der Controller von einem
> weiteren µC über die Jumper.

Bist du ernsthaft der Meinung, daß der ATMega32 mit dem Multiplexen von 
4 Ziffern vollständig ausgelastet ist ? Warum bekommen das andere so 
hin, daß es wnur 0.1% der Auslastung bringt ?

von Paul Baumann (Gast)


Lesenswert?

Bau es doch erst mal so auf, damit Du siehst, daß es nicht geht.
;-)
Dann lötest Du die Transistoren aus und ersetzt sie gegen BC327,
die Du allerdings um 180 Grad verdreht einsetzen mußt, damit deren
Emitter an +5 Volt zu liegen kommt.



MfG Paul

von Karl H. (kbuchegg)


Lesenswert?

Wenn das ein eigenständiges ANzeige-Modul werden soll, was ja möglich 
ist, dann würde ich noch etwas modifizieren.
PB0 ist noch frei, PC0 ist noch frei.
Der Jumper, mit dem du den Dezimalpunkt steuerst kommt an den µC, an 
PB0. Dafür werden die Dezimalpunkte alle Anzeigen genau wie alle anderen 
Segmente an den µC angeschlossen - PC0 würde sich dafür anbieten.

Denn: Wenn schon ein entsprechendes MOdul, dann soll das auch universell 
verwendbar sein. Egal wo der Dezimalpunkt dann letzten Endes hin muss. 
Das steuert die ansteurende Schaltung und die will ich mir nicht von 
vorne herein einschränken, wenn es nicht sein muss.

Dann kannst du irgendwann dieses Modul zb auch per UART ansteuern und 
Zahlen in einem weiten Bereich anzeigen lassen.

Wenn das aber sowieso kein general purpose modul werden soll, frage ich 
mich, was der Mega32 da soll. 4 Stück 7-Segment Anzeigen im Multiplex 
verbrauchen so wenig Rechenzeit, dass dir die ganze Kommunikation 
zwischen dem eigentlich steuernden Rechner und dem Anzeige-µC mehr Zeit 
kostet als das ganze Multiplexen. Das durch die Kommunikationsschicht 
die Programme dann auch noch komplizierter werden, erwähne ich dann auch 
nur nebenbei.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Paul Baumann schrieb:
> Bau es doch erst mal so auf, damit Du siehst, daß es nicht geht.
> ;-)

Sie geht ja!

Nur die Segmentwiderstände muß man vergrößern, um die Grenzwerte des MC 
einzuhalten.
Und die Basiswiderstände kann man weglassen.

von Karl H. (kbuchegg)


Lesenswert?

> muss zwischen "Einzelnes Segment anschalten" und
> "Einzelnes Segment abschalten" ein delay?

Ja, aber ...

> Wenn ja wie viel? Ich schätze mal nicht mehr als die 1ms aus
> dem Datenblatt.

Weniger. Weit weniger.

Wenn du dich an die Reihenfolge hältst
1
   zuletzt leuchtende Stelle an PORTA abschalten
2
   (meist ist 'alle abschalten' einfacher zu realisieren)
3
4
   nächste Stelle bestimmen
5
6
   neues Muster für die nächste Stelle an PORTC ausgeben
7
8
   diese Stelle über PORTA aktivieren

dann hast du automatisch einen kleinen Zeitraum in dem nichts leuchtet 
und das reicht dann auch schon.

Das das ganze über Timer und entsprechender Timer Interrupt Routine 
gemultipext wird, brauchen wir hier hoffentlich nicht diskutieren.

: Bearbeitet durch User
von Matthias K. (mklenk)


Angehängte Dateien:

Lesenswert?

Die Idee mit dem extra Controller für die Anzeige kommt daher: Im 
Hauptprogramm kann es zu längeren Unterbrechungen kommen und mit den 
gewünschten 80mA würde die Anzeige dann kaputt gehen. Desshalb ein extra 
Ic der nur das macht.

Wie aber schon mehrfach bemerkt (und wirklich ein grober fehler :D) 
lässt der Controller gar nicht so viel Strom zu.

Ich erhöhe den Widerstand auf 150 Ohm.
I(LED) = (5V-1,85V)/150 Ohm = 21 Ohm. für die Anzeige also auch 
dauerhaft unkritisch.
8*21 = 168mA das dürfte ok sein, oder?   (200mA max für µC)
Also kann ich alles in einem Controller machen.
Mit durchschnittlich 1/6 des max. LED Stroms muss ich dann mal schaun, 
ob die Helligkeit noch ausreicht.

Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat. 
Müssen die 1k Widerstände bei den BC327 jetzt rein oder nicht?

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Matthias Klenk schrieb:
> Die Idee mit dem extra Controller für die Anzeige kommt daher: Im
> Hauptprogramm kann es zu längeren Unterbrechungen kommen und mit den
> gewünschten 80mA würde die Anzeige dann kaputt gehen. Desshalb ein extra
> Ic der nur das macht.

Mit anderen Worten: Du kannst nicht programmieren. Sogar dein PC hört 
auf Tastendrücke obwohl er mit dem Internet redet, eine WebSeite 
Aufbaut, auf der Platte sucht, und Dateien kopiert.


Matthias Klenk schrieb:
> Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat.

Was aber gar nicht nötig war, wie ich geschrieben hatte.

> Müssen die 1k Widerstände bei den BC327 jetzt rein oder nicht?

Sie müssen dann rein, und sie müssen niederohmiger sein, so 270-470 Ohm.

von Detlef K. (deka65)


Lesenswert?

ich denke, die Berechnung der Segmentwiderstände stimmt so nicht.

Matthias Klenk schrieb
> R=U/I   = (5V-1,85V)/(4*20mA) = 39 Ohm (gibts sogar :D)

Beim multiplexen ist doch immer nur eine Anzeige in Betrieb.
Ich weiß nicht, was die 4* bedeuten soll. Ich hätte es so gerechnet.

R=U/I  = (5V-1,85-0,7)/20mA  = 122,5 Ohm

dann könnte die Schaltung so funktionieren.

deka65

von Peter D. (peda)


Lesenswert?

Matthias Klenk schrieb:
> Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat.

Und warum?
Nur weil jemand die Kollektorschaltung nicht kennt?

von Karl H. (kbuchegg)


Lesenswert?

Matthias Klenk schrieb:
> Die Idee mit dem extra Controller für die Anzeige kommt daher: Im
> Hauptprogramm kann es zu längeren Unterbrechungen kommen

Und?

Der Timer läuft weiter und löst dauern Interrupts aus, die das 
Multiplexing treiben.

Du tauscht gerade eine relativ einfache Basistechnik gegen mehr 
Hardware-Aufwand aus. Meiner Meinung nach ist das nicht zielführend.

Denn. Mit Timern musst du sowieso irgendwann umgehen lernen. Also warum 
nicht jetzt, zumal Multiplexing mit einem Timer absolut keine Hexerei 
ist. Das eigentliche Multiplexing funktioniert so wie immer, nur das 
anstelle von der Hauptschleife der Muliplexcode in einer Timer-ISR 
sitzt, die regelmässig aufgerufen wird. Es geht also nur darum, den 
Timer zu aktivieren, eine ISR zu schreiben und zu aktivieren und dort 
den Multiplex-Code - ein 5 Zeiler - reinzuschreiben.

FAQ: Timer

Dafür sparst du dir dann den ganzen Code, den du zur Kommunikation der 
beiden µC gebraucht hättest.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Detlef Kahrmann schrieb:

> Beim multiplexen ist doch immer nur eine Anzeige in Betrieb.
> Ich weiß nicht, was die 4* bedeuten soll. Ich hätte es so gerechnet.
>
> R=U/I  = (5V-1,85-0,7)/20mA  = 122,5 Ohm
>
> dann könnte die Schaltung so funktionieren.

Ja. Wäre aber auch sehr dunkel.
Denn die LEDs einer Stelle sind ja nicht die ganze Zeit an, sondern nur 
1/4 der Zeit. Eine bei 20mA normal helle LED ist dann ca nur mehr 1/4 so 
hell (weil sie ja nur 1/4 der Zeit leuchtet). Als Ausgleich macht man 
die LED in dieser Zeit heller, indem man den 4-fachen Strom durchjagt.
Jetzt weißt du auch warum da eine Multiplikation mit 4 drinnen war.

: Bearbeitet durch User
von Matthias K. (mklenk)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:
> Nur weil jemand die Kollektorschaltung nicht kennt?

Ich hab jetzt die Schaltung, wie du sie beschrieben hast, aufgebaut. 
(Kollektorschaltung)

Der Widerstand an den LEDs ist 120 Ohm
(5V-1,85V-1V)/18mA = 120 Ohm
8*18mA = 145mA

Der Widerstand am der Basis ist weg.

Müsste jetzt stimmen?

Sowohl das segment als auch die Stelle lassen sich dann mit Ausgang auf 
Low setzten anschalten, oder?

EDIT: den atmega8 da unten kann man sich wegdenken :D

: Bearbeitet durch User
von Detlef K. (deka65)


Lesenswert?

Karl Heinz schrieb :
> indem man den 4-fachen Strom durchjagt.

Ja aber bitte nicht 4*20 mA aus einem Portpin.
Wenn schon 80 mA dann aber aus einem Treiber.
In dem aktuellen Schaltplan finde ich solchen aber
nicht. Ergo : so funktioniert die Schaltung nicht.

deka65

von Paul Baumann (Gast)


Lesenswert?

Peter schrieb:
>> Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat.

>Und warum?
>Nur weil jemand die Kollektorschaltung nicht kennt?

Kannst Du mal kurz erläutern, wer JEMAND ist?

Falls Du mich damit meinst, ich weiß es! Ich weiß aber auch, daß es
so, wie in der Ursprungsschaltung nicht funktioniert. Deshalb schlug
ich vor, PNP-Transitoren hineinzusetzen, weil das den geringsten Aufwand
in der (evtl. schon bestehenden) Schaltung bedeutet hätte.

MfG Paul

von Matthias K. (mklenk)


Lesenswert?

Matthias Klenk schrieb:
> Sowohl das segment als auch die Stelle lassen sich dann mit Ausgang auf
> Low setzten anschalten, oder?

 Der Pin für die Stelle muss auf high gezogen werden.

von MaWin (Gast)


Lesenswert?

Paul Baumann schrieb:
> Ich weiß aber auch, daß es
> so, wie in der Ursprungsschaltung nicht funktioniert

Na dann warten wir mal, wie Matthias das unmögliche Möglich macht:

Matthias Klenk schrieb:
> Ich hab jetzt die Schaltung, wie du sie beschrieben hast, aufgebaut.
> (Kollektorschaltung)

von Matthias K. (mklenk)


Angehängte Dateien:

Lesenswert?

Also es funktioniert jetzt bestens mit der letzten Schaltung die ich 
gepostet hab.(hab nur PORT C auf B getauscht und PORTA auf PORTC)
Die Helligkeit ist ausreichend.
Die Lötarbeiten waren ein bisschen schwierig, weil mein Werkzeug 
teilweise Schrott ist :(

Software schreiben war auch kein Problem, nur hatte ich am Anfang ein 
paar "unerklärliche Probleme". Da es mein erstes Projekt mit AtMega32 
ist (sonst nur Mega8) wusste ich nicht, dass PortC (Stellen-Steuerung) 
auch noch irgendwas mit JTAG macht und dass ich das in den Fuses 
ausschalten muss. Da rätselt man erst mal warum der Ausgang macht, was 
er eingentlich nicht darf :D

https://www.youtube.com/watch?v=Alec3yego3Q&feature=youtu.be  ich hoffe, 
damit ist meine Ehre wieder hergestellt :D

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Matthias Klenk schrieb:

> https://www.youtube.com/watch?v=Alec3yego3Q&feature=youtu.be  ich hoffe,
> damit ist meine Ehre wieder hergestellt :D

So wie das Video aussieht, hast du ghosting drauf. Ist aber 
zugegebenermassen auf dem Video etwas schwer zu entscheiden. (ghosting: 
die Segmente, die bei einer Ziffer an einer Stelle eigentlich nicht 
leuchten sollen, glimmen leicht. Die sollten komplett dunkel sein - ist 
ein Software Fehler)

Und mit einem extra Prozessor nur für das Display wird das sowieso eher 
nichts mit der wiederhergestellten Ehre.

: Bearbeitet durch User
von Matthias K. (mklenk)


Lesenswert?

Ist doch jetzt ein Controller für alles

von Karl H. (kbuchegg)


Lesenswert?

Matthias Klenk schrieb:
> Ist doch jetzt ein Controller für alles

OK. Das hab ich nicht so mitbekommen. In dem Fall wirds wieder was mit 
der Ehre :-)


Im Ernst. Hast du da Ghosting drauf oder nicht?
Am besten siehst du es, wenn du eine statische ANzeige machst, in der 
pro Stelle unterschiedliche Ziffern angezeigt werden. Also zb
"1811"

Die eingeschalteten Segmente der '8' scheinen bei den '1'-en durch. 
Entweder bei der Stelle davor oder bei der Stelle danach. Je nachdem in 
welcher Richtung gemultiplext wird. Im Idealfall leuchten bei den '1' 
jeweils nur die beiden Segmente, die die '1' bilden und die restlichen 
sind allesamt rabenschwarz.
Es gibt allerdings auch 7-Segment-Anzeigen, bei denen die optische 
Trennung physikalisch zwischen den Segmenten etwas durchscheint. D.h. 
hier muss man zwischen 'bedingt durch die billige Anzeige' und 
'tatsächlichem Programmfehler' unterscheiden.
Wichtig ist die Reihenfolge, indem zuerst alle Anzeigen abgeschaltet 
werden und erst danach die Segmentleitungen neu bestückt werden. Nicht 
umgekehrt! Sonst kommt es zum Ghosting.

von Matthias K. (mklenk)


Angehängte Dateien:

Lesenswert?

Also ich kann da kein Ghosting erkennen.

Das ist der Code:
1
ISR (TIMER0_OVF_vect){
2
  PORTB = 0xFF;              // LEDs ausschalten
3
  PORTC &= ~((1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)); // alle Ziffern abschalten
4
  PORTB = ziffer[digits[z]];  // LEDs einschalten
5
            // ziffern beinhaltet die LED-Beschaltung für die einzelnen Ziffern
6
            // digits enhält die Ziffern (1-5) der angezeigten Zahl
7
  PORTC |= (1<<(z+2));      // Ziffer einschalten
8
  z++;            
9
  if (z>4) z=0;        
10
}

von Karl H. (kbuchegg)


Lesenswert?

Matthias Klenk schrieb:
> Also ich kann da kein Ghosting erkennen.

Alles klar. Dann hat das am Video nur so ausgesehen. Wollte nur sicher 
gehen, weil es sonst unschön aussieht. Der Code an sich ist in dieser 
Hinsicht in Ordnung.

: Bearbeitet durch User
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.