Ansteuerung von 7-Segment-Anzeigen (Hardware)

dino03

Aktives Mitglied
27. Okt. 2008
6.760
20
38
Sprachen
  1. BascomAVR
  2. Assembler
Hallo zusammen,

mal wieder ne FAQ (weil es nötig wurde :rolleyes: ).
Diesmal geht es um den Anschluß und die hardwareseitige Ansteuerung von
7-Segment-Anzeigen an einem ATmega. Also zusammengefaßt ...

- Innenaufbau einer Anzeige
- Datenblätter
- Vorwiderstände
- Treiberbausteine
- Ansteuerlogik
- ...

Im Moment zeichne ich erst mal ein paar Schaltpläne um es besser und
anschaulicher erklären zu können. Laßt euch also mal überraschen :D

Gruß
Dino
 
Du bekommst langsam Spaß am FAQ schreiben was? :p Ich glaube, ich schreibe auch mal eins.
 
@Kani: Du willst ein Tutorial schreiben? Dann wohl aber nur darüber aus Anderen Code rauszukitzeln.:D
 
Hallo Nomis!

Naja, wenn Kani etwas dabei gelernt hat und dieses Wissen nun anderen Anfängern zur Verfügung stellen möchte, ist daran ja nichts auszusetzen. :)


Vielleicht solltet ihr das FAQ dann aber auch wieder gemeinsam schreiben. ;)


Ups... entschuldige Dino, wir möchten dein FAQ nicht missbrauchen.
Also bitte weiter im Text! :adore:

Gruß,
Cassio
 
7-Segment-Anzeigen mit einer LED pro Segment

Hallo zusammen,

Also bitte weiter im Text! :adore:
und so soll es geschehen ;)

In den folgenden zwei Schaltbildern habe ich mal 7-Segment-Anzeigen mit
einer LED pro Segment an den Ausgang eines TTL-/CMOS-ICs oder ATmegas
gehängt. Der Einfachheit halber habe ich die Ausgangsstufe mit bipolaren
Transistoren gezeichnet. Aber seht selbst mal ...
7Seg_FAQ_1a.gif

Im Bild 1 ist die Anschaltung von Anzeigen mit gemeinsamer Anode gezeichnet
und in Bild 2 ist es eine Anzeige mit gemeinsamer Kathode. Man kann sehr
schön erkennen welche Transistoren zum Einsatz kommen müssen, wenn
man die jeweiligen LEDs der Anzeigen zum leuchten bringen will.

Im Bild 1 ist bei der Anzeige mit gemeinsamer Anode eigentlich nur der
npn-Transistor nach GND in Gebrauch. Der pnp-Transistor wird zwar
für ein High-Signal am Ausgang durchgesteuert, er hat aber keine Last
zu schalten.

Im Bild 2 ist es genau umgedreht. Hier wird der pnp-Transistor für eine
1 (High) am Ausgang durchgeschaltet und versorgt die LED der Anzeige
mit Strom. Dafür schaltet der npn-Transistor zwar für den Low-Pegel
am Ausgang durch hat hier aber keinen Strom zu liefern.

So sieht es also im Inneren der Anzeigen und ICs aus, die für die
Ansteuerung einer 7-Segment-Anzeige zusammengeschaltet sind.

Dieses war der erste Schritt ...
 
Zuletzt bearbeitet:
Hallo Dino,

klasse, deine Idee mit den FAQ's. Zumindest ich weiß Deine Mühe zu schätzen, wollte ich doch das Rad neu erfinden...;)


Grüsse,

Michael
 
Wie man es nicht machen sollte (7Seg.-Anzeigen mit mehreren LEDs pro Segment)

und nun nöchte ich einmal zeigen wie es nicht funktioniert und warum es nicht
funktioniert. :eek: :D

Zuerst werde ich mal die Schhaltbilder zeigen, die ich dann erkläre. Und hier
sind sie schon ...
7Seg_FAQ_1b.gif
In den Schaltbildern sind mögliche Ströme mit gelben Pfeilen eingezeichnet.

Wie beim letzten mal einmal mit gemeinsamer Anode (Bild 3 - links) und mit
gemeinsamer Kathode (Bild 4 - rechts). Nur dieses mal wird eine große
Anzeige mit 60 oder 70mm Ziffernhöhe verwendet.

Zuerst Bild 3. Hier wurde die Anzeige mit 12V versorgt, da die 4 LEDs eines
Segmentes zusammen ja schon 8V (2Volt pro LED) benötigen. Das sieht
soweit ganz gut aus, wenn wir die LEDs über einen Low-Pegel am Ausgang
anschalten. Dadurch wird der npn-Transistor nach GND leitend und schaltet
den Strom von +12V, durch die LEDs nach GND durch. Die LEDs leuchten
und alles scheint gut zu sein. Wenn wir jetzt aber den Ausgang auf High
schalten um wie beim letzten mal die LEDs auszuschalten werden wir unser
blaues Wunder erleben. Jetzt schaltet der npn-Transistor den Strom von
+12V über die LEDs nach +5V durch. Es liegen also immer noch 7V über
den LEDs. Das mag bei den Segmenten mit den 4 LEDs eventuell gerade
noch gutgehen aber spätestens beim Dezimalpunkt, der bei diesen großen
Anzeigen nur 2 LEDs hat rumst es. Der Dezimalpunkt leuchtet einfach
weiter. 7V Spannungsdifferenz reichen ihm absolut aus. Ein weiteres Problem
hat der Ausgangsport und der pnp-Transistor. er wird in Gegenrichtung
betrieben. Was aber noch schlimmer ist. Ausgangsports haben meistens
Schutzdioden, um Über oder Unterspannungen vom Port fernzuhalten.
Diese Schutzdiode vom Ausgang nach +5V wird das wohl nicht allzu lange
mitmachen und der Chip wird gebraten. :eek: :eek:

Im Bild 4 ist die Version mit gemeinsamer Kathode zu sehen. Hier ist es
etwas harmloser ;) Hier leuchtet einfach keines der Segmente da die
Spannung von 5V nicht für vier in Reihe geschaltete LEDs ausreicht
(wir erinnern uns 4 * 2V => 8V ! ). Das einzige was hier zum leuchten
kommt ist wohl der Dezimalpunkt mit seinen 2 LEDs (4V). Dafür geht
aber wenigstens nichts kaputt :rolleyes:

Das war nun schon der zweite Schritt ...
 
Zuletzt bearbeitet:
7Seg.-Anzeigen mit mehreren LEDs pro Segment - so funktioniert es

und nun der dritte Teil (aller guten Dinge sind drei !) :D

Wie schon bekann vor der Erklärung der Schaltplan ...
7Seg_FAQ_1c.gif

wie schon üblich links wieder mit gemeinsamer Anode und rechts mit
gemeinsamer Kathode (für jeden Fall was dabei) :D

Zuerst wieder das linke Bild 5. Hier wurde für die Problemlösung ein ULN2803
als Treiber verwendet. Der geht übrigens wegen der Freilauf-/Schutz-Diode
zur positiven Versorgungsspannung auch super zur Ansteuerung von Motoren
oder Relais oder anderes Geraffel und hält 0,5A pro Ausgang aus :D Aber
zurück zu den Anzeigen. ... Mit einem High-Pegel am Ausgang des steuernden
ICs schaltet der Transistor im ULN2803 durch und damit fließt der Strom von
+12V durch die 4 Leuchtdioden des Anzeigen-Segments nach GND. So
einfach kann das Leben sein :D Und das schöne: beim Löten hat man weniger
zu tun als wenn man 8 Treiberstufen mit einzelnen Transistoren und
Widerständen aufbauen würde. Und billiger ist das IC auch noch :D

Jetzt zum rechten Bild 6. Hier ist es die Anzeige mit der gemeinsamen
Kathode. Und oh Wunder - es gibt ein Gegenstück zum ULN2803. Das
ist der UDN2981 (freu :) ). Da der Transistor, der die Last schaltet an der
positiven Versorgungsspannung hängt und zum sperren folglich die positive
Versorgungsspannung an der Basis benötigt (also hier +12V) haben uns
die Chip-Designer das Leben über den eingebauten npn-Transistor erleichtert.
Wenn wir also an dem steuernden IC wieder High an den Ausgang legen,
leitet der npn und schaltet über R63 die Basis des Last-Transistors nach
GND. Dieser schließt dadurch den Stromkreis von +12V über die 4 LEDs
nach GND und es leuchtet. Wenn der Ausgang jetzt auf Low geht, dann
sperrt der npn-Transistor T62 und der pnp-Last-Transistor Q62 bekommt
über den Widerstand R62 die positive Versorgungsspannung an die Basis
damit er sperren kann. Und es wird dunkel ;)

Und jetzt noch ein kleines Bonbon : Wenn man die Anzeige von gemeinsamer
Anode auf gemeinsame Kathode wechselt, dann muß an der Programmierung
nichts geändert werden, da beide Treiber-ICs mit High (+5V) am Eingang
durchschalten. Man muß also lediglich den ULN2803 gegen einen UDN2981
tauschen und den gemeinsamen Anschluß der Anzeige auf das andere
Potential (also GND statt +12V) legen. Das war es fast. Die beiden
Betriebsspannungs-Anschlüsse der ULN2803 und UDN2981 an Pin 9 und 10
sind auch noch gegeneinander zu tauschen.

Und als kleine Zugabe habe ich die Datenblätter der beiden Treiber-ICs
grangehängt. Das erspart für manche langes suchen ...

Anhang anzeigen ULN2803_Darlington-Array.pdf
Anhang anzeigen UDN2981_ALG_Sourcedriver.pdf

Und jetzt viel Spaß mit den großen Anzeigen :cool:

Gruß
Dino
 
Zuletzt bearbeitet:
Die Sparschweinschaltung - Pins am Prozessor sparen

und zum Abschluß eine kleine Schaltung die auch gerne zu Kopfzerbrechen
führt ... :D

Ich habe sie hier mit dem 74595 aus der guten alten 74er-Serie aufgebaut.
Mit einem 74HCT595 verkraftet die Schaltung immerhin locker über 30MHz.
Also hier erst einmal das Datenblatt ...
Anhang anzeigen 74_HCT_595_8Bit-SerInParOut-Latch.pdf
Ich mag dieses IC lieber als den vergleichbarfen Typ aus der
40/45er-CMOS-Reihe (siehe auch hier das Datenblatt) ...
Anhang anzeigen HEF4094B_BusRegister.pdf
da die Anschlüsse sehr gut sortiert sind. Wenn man einen ULN2803 oder
UDN2981 mit seinen Eingängen zu den Ausgängen des 74595 dreht dann
muß man die Pins nur noch einen nach dem anderen miteinander Verbinden
und hat im Layout keine Leiterbahnverknotungen :D

Aber zum besseren Verständnis des internen Aufbaus erst einmal zwei
Bilder aus dem Datenblatt ...
7Seg_FAQ_595func.gif 7Seg_FAQ_595log.gif

Wie man im linken Bild sieht, besteht der Baustein aus einem
8-Bit-Schieberegister, einem 8-Bit Latch (Zwischenspeicher) und einem
8-Bit Ausgangstreiber den man auch hochohmig (Tri-State) schalten kann.

Das ganze Funktionsprinzip eines Bausteins ist im Grunde recht einfach .. :rolleyes:
Man stelle sich eine Eimerketten-Manschaft von der Feuerwehr vor.
Jetzt reicht jemand abwechselnd leere (0) und volle (1) Eimer an diese
Mannschaft und die befördert die Eimer dann Schritt für Schritt weiter.
Das ist im Grunde das Prinzip eines Schieberegisters. Die leeren und vollen
Eimer wandern also als Bits (0/1) von einem Feuerwehrmann (FlipFlop im
Schieberegister) zum nächsten. Und wenn man das jetzt noch mit einer
Trommel (wie in einer Galeere) synchronisiert dann hat man ein
Schieberegister mit Takteingang :rolleyes: :D :D

Wenn man jetzt das Latch dazunimmt ist es auch nicht komplizierter.
Man stelle sich vor, man hat jetzt 8 Eimer in diese Manschaft eingeschoben.
Wenn man jetzt einen Impuls auf das Latch gibt, dann stellen alle
Feuerwehrmänner auf einmal Ihre Eimer vor sich auf einen Tisch.
Wenn man es genauso machen würde wie in dem Baustein müßten sie
eigentlich eine Kopie des Eimers auf den Tisch stellen (grins).
Nun sind also die Eimer auf dem Tisch (im Latch) gespeichert.

Wenn man jetzt weitere Eimer in die Manschaft einschiebt, dann ändert
sich an den Eimern auf dem Tisch (Latch) so lange nicht bis man wieder
den Speicher-Impuls gibt.

Der Ausgangstreiber gibt die Informationen aus dem Latch eigentlich nur
direkt weiter (wenn man in läßt). Sonst ist der Ausgang hochohmig.

Ich habe jetzt einfach mal zwei dieser Bausteine miteinander verbunden
und einen kleinen Schaltplan davon gekritzelt ...
7Seg_FAQ_2.gif

Beim ersten Baustein habe ich mal eine Anzeige mit gemeinsamer Kathode und
einer LED pro Segment angeschlossen. Beim zweiten Baustein habe ich wie
vorher schon erklärt eine ULN2803 als Treiber angeschlossen um auch eine
Anzeige mit 4 LEDs pro Segment zum leuchten zu bringen. Hier ist die
Anzeige mit gemeinsamer Anode.

Links oben sind die drei Leitungen zum Prozessor zu sehen. Die Steuerung
ist recht einfach über Software umzusetzen.

Man legt z.B. eine 0 bei den Daten an und erzeugt am Takt eine positive
Flanke. Damit ist die 0 in das erste FlipFlop des Schieberegisters gelangt
(der erste Feuerwehrmann hat den Eimer angenommen). Das geht natürlich
auch mit einer 1 am Datenanschluß. Die wird auch mit einer positiven Flanke
am Takt in das erste FlipFlop übernommen. Gleichzeitig wandert die vorher
übernommene 0 um eine Position weiter. Wie bei der Eimerkette. Wenn wir
jetzt auf diese Art genügend Einsen und Nullen bis zum letzten Baustein
eingeschoben haben (in unserem Fall sind es 16 Bit) dann geben wir auf
den Latch-Anschluß eine positive Flanke und schon haben unsere 16
Feuerwehrmänner die Eimer auf unseren Tisch (das Latch) kopiert :D
Entsprechend den vorher eingeschobenen Bits leuchten jetzt manche
LEDs und manche nicht.

Die Bits sind jetzt im Latch gespeichert und bleiben für die LEDs so lange dort
bis wir eine neue positive Flanke auf dem Latch-Anschluß erzeugen würden.
Wir können also im Hintergrund ohne das sich an den LEDs was ändert schon
die nächsten 16 Bit einschieben. Erst wenn wir nun wieder die Flanke für das
Latch erzeugen werden unsere eingeschobenen Bits durch die LEDs sichtbar.

So, das war es erst mal mit dieser FAQ. Ich hoffe mal, ich konnte einige
Sachen erklären und einige Leute verwirren :eek: :D

Gruß
Dino
 
Zuletzt bearbeitet:
Gut erklärt - ich denke, ich hab's begriffen....:)
 
Schade ist nur, daß Du Dich auch für die Zaungäste abmühst...aber lassen wir das. - - -

Das war's für heute. Ich will wenigstens noch das Grundgerüst zur Ansteuerung der Segment-Anzeigen schreiben.


Michael
 
Schade ist nur, daß Du Dich auch für die Zaungäste abmühst...aber lassen wir das. - - -
Ich gebe mein Wissen gerne weiter. Auf der Arbeit habe ich auch schon
Schulungen gegeben. Ist irgendwie ne Angewohnheit. Und die Anhänge
können im Endeffekt ja nur die angemeldeten sehen :D Eventuell hilft es
dem einen oder anderen Anfänger ja weiter und er wirft nicht frustriert
das Handtuch und hört mit dem Hobby auf.

Gruß
Dino
 
Hi Dino,

ist doch ein feiner Zug von Dir:). So wie es aussieht, hast Du ja viel Spass beim "Lehren".


Grüsse,

Michael
 
Hallo Zusammen,

hier ist meine Version der Ansteuerung von 7-Segmenten. Anfänglich nur zum Üben gedacht, viel habe ich ja noch nicht mit Bascom zustandegebracht. Dann habe ich einfach mal (fast) alle möglichen, darstellbaren Zeichen in den DATA-Bereich geschrieben, um mir die Nullen und Einsen der Segmente zu verinnerlichen. Diese werden dann in einer Schleife endlos angezeigt.

Ich verwende Segmente mit gemeinsamer Kathode, Kingbright SC39-11 und Register 74HC595, dazwischen 1K-Widerstände. Die Anzeige wird recht schnell angesteuert, bei 8MHz.
Wird der Pin "G" des 595 nicht mit 0V verbunden, reduziert sich der Stromverbrauch auf die Hälfte, ca. 1.6mA/Led und damit der Verbrauch des 595 auf ca. 13.5mA. Und die Led's sind immer noch hell genug. Über den Pin SCL des 595 am ATmega8 kann die Anzeige abgeschaltet bzw. das Register gelöscht werden, mit Pin G kann sie ein- oder ausgeschaltet werden.
Über die endgültige Version bin ich mir noch nicht klar. In dieser Fassung brauche ich vier Pins am Atmel: SI, SCK, RCK und SCL, ohne G. Auf SCL und G könnte verzichtet werden, dann wird SCL an +5V und G an 0V (je nach gewünschter Helligkeit) angelegt. Macht drei Pins für sechs 7-Segmente...

Merkwürdigerweise funktioniert der Debounce-Befehl plötzlich nicht mehr. Wer würde sich mein Programm ansehen und versuchen, den vermutlichen Programmierfehler zu finden?


Grüsse,

Michael
 

Anhänge

  • 7-Seg_test2_mega8.BAS
    4,8 KB · Aufrufe: 116
Hi Michael,

Wird der Pin "G" des 595 nicht mit 0V verbunden, reduziert sich der Stromverbrauch auf die Hälfte, ca. 1.6mA/Led und damit der Verbrauch des 595 auf ca. 13.5mA. Und die Led's sind immer noch hell genug.
Mit "G" wird der Ausgangstreiber aktiviert (Low-Aktiv). Wenn du ihn offen läßt,
fängt er sich Umgebungsschmutz ein und der 74595 schaltet ab und zu mal
durch (je nach Schmutz-Signal). Darum der kleinere Stromverbrauch. Er
benötigt einen definierten Pegel. also entweder GND oder +5V aber bitte nicht
offen lassen.

Über den Pin SCL des 595 am ATmega8 kann die Anzeige abgeschaltet bzw. das Register gelöscht werden, mit Pin G kann sie ein- oder ausgeschaltet werden.
SCL ist der Master-Reset. Bei Low wird alles auf Null gesetzt.
Pin G (oder OE = OutputEnable) schaltet bei Low den Ausgang ein wie schon
oben beschrieben.

Über die endgültige Version bin ich mir noch nicht klar. In dieser Fassung brauche ich vier Pins am Atmel: SI, SCK, RCK und SCL, ohne G. Auf SCL und G könnte verzichtet werden, dann wird SCL an +5V und G an 0V (je nach gewünschter Helligkeit) angelegt. Macht drei Pins für sechs 7-Segmente...
Die Anzeige kannst Du auch abschalten, in dem du nur Nullen einschiebst.
Dann kannst Du dir den SCL (MR = MasterReset) sparen und den G auch.

Merkwürdigerweise funktioniert der Debounce-Befehl plötzlich nicht mehr. Wer würde sich mein Programm ansehen und versuchen, den vermutlichen Programmierfehler zu finden.
Da werde ich wohl leider nicht helfen können. Wie das intern in BASCOM
aussieht mit den Voreinstellungen der Befehle und den internen Abläufen ??
Da muß ein anderer ran ... ;)

Sieht aber schon mal ganz gut aus ...

Gruß
Dino
 
Hi Dino,
Mit "G" wird der Ausgangstreiber aktiviert (Low-Aktiv). Wenn du ihn offen läßt,
fängt er sich Umgebungsschmutz ein und der 74595 schaltet ab und zu mal
durch (je nach Schmutz-Signal). Darum der kleinere Stromverbrauch. Er
benötigt einen definierten Pegel. also entweder GND oder +5V aber bitte nicht
offen lassen.
Gut, daran habe ich nicht gedacht. Also an 0V.
SCL ist der Master-Reset. Bei Low wird alles auf Null gesetzt.
Pin G (oder OE = OutputEnable) schaltet bei Low den Ausgang ein wie schon
oben beschrieben.
Das war schon klar. Ob "man" das macht, SCL=0 am Programmanfang, weiss ich allerdings nicht. War eine Idee.


Die Anzeige kannst Du auch abschalten, in dem du nur Nullen einschiebst.
Dann kannst Du dir den SCL (MR = MasterReset) sparen und den G auch.
Da stellt sich die Frage, ob die Anzeigen überhaupt abgeschaltet werden müssen. Gut, ein DATA mehr macht ja nix.

Da werde ich wohl leider nicht helfen können. Wie das intern in BASCOM
aussieht mit den Voreinstellungen der Befehle und den internen Abläufen ??
Da muß ein anderer ran ... ;)
Macht nichts, ich werde alles noch mal überprüfen, vielleicht war's ja ein Kabelbruch am BB. Aber heute ist es zu spät geworden.

Sieht aber schon mal ganz gut aus ...
Danke. Ich habe vor vielen Jaheren das GfA-Basic beiseitegelegt. So langsam komme ich wieder "rein" und macht wieder viel Spass...:DIch habe noch eine Version mit Terminal Ein- Und Ausgaben. Vielleicht mix ich die Beiden.

Danke für den Hinweis zu G.:)


Grüsse,

Michael
 
Hi,

Hab grad eben noch ein zweites Segment drangehängt. Funktioniert alles prima.

Ich sage Euch, die Steckerei am BB ist eine Katastrophe. Ich werde mir eine Erweiterung zu meinem Programmierboard anfertigen. 7-Segmente, LCD, Taster, etc.
Das hört wohl nie auf. Die Rennbahnsteuerung wird wohl mein Urenkel fertigstellen...


Grüsse und gute Nacht,

Michael
 
Schnell noch einen Nachtrag: Ich habe gerade bemerkt, daß die Anzeigen auch OHNE den RCK-Pin laufen, nur SI und SCK. Heisst das, daß RCK nur für SPI-Betrieb gebraucht wird? jetzt bin ich doch etwas verwirrt. RCK abgeklemmt und im Programm ausgeblendet. Also nur 2 Pins für endlos Segmente?


Michael
 
Heisst das, daß RCK nur für SPI-Betrieb gebraucht wird?
Ist ja eigentlich Blödsinn, aber es funktioniert ohne.....:(


Michael
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)