X-8 - 3/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
Mikrocontroller-Systeme leisten schon seit langem die
unterschiedlichsten Dienste. Wenn Daten und Meldungen
in einer für den Menschen verständlichen Form
ausgegeben werden müssen, greift man zu Displays, die
dem beabsichtigten Zweck angepasst sind. Die hier
beschriebene numerische Anzeigeeinheit ist kontrastreich
und leicht ablesbar, der Aufwand hält sich in Grenzen.
Entwurf: I. Gerlach
R1
270
Ω
R2
270
Ω
R3
270
Ω
R4
270
Ω
R5
270
Ω
R6
270
Ω
R7
270
Ω
C3
R8
270
Ω
R9
270
Ω
R10
270
Ω
R11
270
Ω
R12
270
Ω
R13
270
Ω
R14
270
Ω
5V
R15
270
Ω
R16
270
Ω
R17
270
Ω
R18
270
Ω
R19
270
Ω
R20
270
Ω
R21
270
Ω
R22
270
Ω
R23
270
Ω
R24
270
Ω
R25
270
Ω
R26
270
Ω
R27
270
Ω
R28
270
Ω
R29
270
Ω
R30
270
Ω
R31
270
Ω
R32
270
Ω
R33
270
Ω
R34
270
Ω
R35
270
Ω
R36
270
Ω
R37
270
Ω
R38
270
Ω
R39
270
Ω
R40
270
Ω
R41
270
Ω
R42
270
Ω
R43
270
Ω
1
2
3
4
5
6
7
8
9
10
JP1
BCD/7SEG
4543
IC2
9D,1
9D,2
9D,4
9D,8
N10
[T]
14
15
13
12
11
10
C9
EN
a
b
c
d
e
f
g
1
5
4
6
7
9
3
2
BCD/7SEG
4543
IC3
9D,1
9D,2
9D,4
9D,8
N10
[T]
14
15
13
12
11
10
C9
EN
a
b
c
d
e
f
g
1
5
4
6
7
9
3
2
BCD/7SEG
4543
IC4
9D,1
9D,2
9D,4
9D,8
N10
[T]
14
15
13
12
11
10
C9
EN
a
b
c
d
e
f
g
1
5
4
6
7
9
3
2
BCD/7SEG
4543
IC5
9D,1
9D,2
9D,4
9D,8
N10
[T]
14
15
13
12
11
10
C9
EN
a
b
c
d
e
f
g
1
5
4
6
7
9
3
2
BCD/7SEG
4543
IC6
9D,1
9D,2
9D,4
9D,8
N10
[T]
14
15
13
12
11
10
C9
EN
a
b
c
d
e
f
g
1
5
4
6
7
9
3
2
BCD/7SEG
4543
IC7
9D,1
9D,2
9D,4
9D,8
N10
[T]
14
15
13
12
11
10
C9
EN
a
b
c
d
e
f
g
1
5
4
6
7
9
3
2
HA1143
D1
dp
a
b
c
d
e
f
g
C
C
HA1143
D2
dp
a
b
c
d
e
f
g
C
C
HA1143
D3
dp
a
b
c
d
e
f
g
C
C
HA1143
D4
dp
a
b
c
d
e
f
g
C
C
HA1143
D5
dp
a
b
c
d
e
f
g
C
C
HA1143
D6
dp
a
b
c
d
e
f
g
C
C
BCD/DEC
4028
IC1
14
11
12
13
10
15
8
3
2
6
7
4
5
9
1
0
1
2
3
4
5
6
7
8
9
1
4
2
IC1
16
8
IC2
16
8
C4
IC3
16
8
C5
IC4
16
8
C6
IC5
16
8
C7
IC6
16
8
C8
IC7
16
8
5V
5V
GND
5V
002009 - 11
C3 ... C8 = 100n
Numerisches LED-Display
Vielseitig kombinierbar und flexibel
Bild 1. Schaltung der LED-Anzeige-Einheit. Alle ICs gehören der Standard-CMOS-Familie an. Stärken des Konzepts sind die Flexibilität und
die geringe Prozessorbelastung.
Zahlreiche Anwendungen von
Mikroprozessoren und -controllern sind
nur sinnvoll, wenn an der Schnittstelle
zwischen Mensch und ”Maschine” eine
visuelle Ausgabe von Daten und
Systemmeldungen steht. So wäre zum
Beispiel ein mit höchster Präzision
arbeitendes Frequenz-Messgerät
nutzlos, wenn die Messergebnisse im
Verborgenen blieben. Eine Aufzug-
steuerung könnte ihren Zweck zwar
auch ohne Stockwerk-Anzeige erfüllen,
doch die laufende Information über die
Etagen-Nummern ist für die Orien-
tierung mehr als hilfreich. Für die
numerische und alphanumerische
Anzeige von Daten aller Art werden auf
breiter Front LC-Displays eingesetzt,
denn sie bieten bestimmte Vorteile:
➧ LC-Displays können prinzipiell Zahlen,
Texte und beliebig gestaltbare
Symbole anzeigen,
➧ größere LC-Displays werden meistens
von speziellen Controllern gesteuert,
die im Display integriert sind; das
steuernde System wird von dieser
Aufgabe entlastet,
➧ LC-Displays haben einen niedrigen
Energiebedarf, sie eignen sich
deshalb besonders für den Einsatz in
batteriebetriebenen Geräten,
➧ LC-Displays sind in zahlreichen
Bauformen auf dem Markt, für viele
Einsatzzwecke findet man leicht das
Passende.
Diesen Vorteilen stehen, wie könnte es
anders sein, auch einige Nachteile
gegenüber:
➧ LC-Displays sind keine aktiven
Lichterzeuger, bei schlechten
Beleuchtungsverhältnissen ist eine
Hintergrundbeleuchtung notwendig,
➧ der Ablesewinkel ist eingeschränkt,
die Position des Betrachters ist nicht
beliebig,
➧ der Arbeitstemperatur-Bereich ist
relativ eng begrenzt,
➧ der Anzeige-Kontrast ist
vergleichsweise niedrig, das Ablesen
aus größerer Entfernung wird
dadurch erschwert,
➧ LC-Displays mit integriertem Controller
sind verhältnismäßig teuer,
➧ die steuernde Software muss an den
Display-Typ angepasst sein,
➧ aus herstellungstechnischen Gründen
sind der Display-Größe nach oben
Grenzen gesetzt,
➧ die Lebensdauer ist relativ gering.
Die Alternative, insbesondere für die
Anzeige von Ziffern, sind die nach völlig
anderen physikalischen Gesetzmäßig-
keiten arbeitenden LED-Displays. Die
sechsstellige LED-Anzeige-Einheit, die
nachfolgend beschrieben wird, lässt
sich kostengünstig und ohne besondere
Schwierigkeiten aufbauen. Bei ihrem
Entwurf wurde auf folgende Eigen-
schaften besonderes Gewicht gelegt:
➧ Belegung möglichst weniger System-
I/O-Leitungen,
➧ geringe Belastung des steuernden
Prozessors,
➧ flexibel und erweiterbar,
➧ kombinationsfähig mit allen
gängigen Systemen,
➧ geringer Aufwand und niedrige
Kosten.
Schaltung
Die Schaltung der LED-Anzeige-Einheit
ist in Bild 1 wiedergegeben. Insgesamt
kommen nur zwei leicht erhältliche IC-
Typen aus der Standard-CMOS-Familie
zum Einsatz. IC1, ein 4028, ist ein
1-aus-10-Demultiplexer, bei den
übrigen sechs ICs, Typenbezeichnung
4543, handelt es sich um BCD-nach-
Siebensegment-Decoder mit
integriertem Latch und Display-Treiber-
Ausgängen. Die verwendeten
Siebensegment-Displays sind
Ausführungen mit gemeinsamer
Kathode; die Kathoden-Anschlüsse
liegen, wie aus Bild 1 hervorgeht, direkt
an Masse. Die Segment-Anschlüsse
(a...g) sind über Strombegrenzungs-
Widerstände mit den Decoder-
Ausgängen verbunden. In Bild 1 liegt
der Dezimalpunkt-Anschluss (dp) von
Siebensegment-Display 3 über
Widerstand R43 an +5 V, so dass der
Dezimalpunkt zwischen der dritten und
vierten Ziffer aufleuchtet. Wenn der
Punkt an anderer Stelle erscheinen soll,
lässt sich dies durch Versetzen von R43
leicht erreichen.
PC-P
LUS
——————————————————
Elektor
EXTRA
X-9 - 3/2000
Pin 4 (9D,8)
4543
Pin 2 (9D,4)
4543
Pin 3 (9D,2)
4543
Pin 5 (9D,1)
4543
Pin 11 (8)
4028
Pin 12 (4)
4028
Pin 13 (2)
4028
Pin 10 (1)
4028
angezeigter Wert
LED-Selektion
nächstes Byte
002009 - 12
Bild 2. Das Diagramm zeigt den zeitlichen Ablauf der Anzeigesteuerung. Als Beispiel wird
hier die Ziffer ”9” auf Siebensegment-Display 5 gesetzt.
Die Anzeige-Einheit wird über einen
Pfostenverbinder (2 x 5 Pins) mit dem
steuernden System verbunden. Acht
Leitungen stellen die Verbindung mit
ebenso vielen I/O-Anschlüssen her,
während die neunte Leitung nach
Masse führt. Über die Leitungen 1...4
selektiert das steuernde System das
Display, auf dem die nächste Ziffer
erscheinen soll. Vom Bitmuster auf
diesen Leitungen hängt ab, welcher
Ausgang von IC1 auf hohe Spannung
geht. Falls alle vier Leitungen auf Null
liegen, wird kein Display aktiviert, denn
Ausgang ”0” von IC1 ist unbenutzt. Den
BCD-Code der Ziffer legt das System
über die Leitungen 5...8 an die
gemeinsamen Decoder-Eingänge.
Diese Information wird vom selektierten
Decoder-IC mit der Rückflanke des
Selektionssignals (Eingang LD, Pin 1)
übernommen. Das Decoder-IC setzt
die Information so um, dass sie als
lesbare Ziffer auf dem Siebensegment-
Display erscheint.
Der zeitliche Ablauf der Signale ist in
dem Diagramm in Bild 2 dargestellt.
Dort wurde als Beispiel angenommen,
dass die Ziffer ”9” auf Display 5
erscheinen soll. Das steuernde System
legt zuerst das Bitmuster 0101 (dez. 5)
an die Eingänge des Demultiplexers
(IC1) und anschließend das Bitmuster
1001 (dez. 9) an die parallel-
geschalteten Eingänge der
Siebensegment-Decoder (IC2...IC7).
Die Ziffer, in diesem Fall die ”9”, wird
mit den Rückflanken der am
Demultiplexer liegenden Signale in
das Latch des Decoders
übernommen, der zu Siebensegment-
Display 5 gehört.
Für den Anwender hat dieses Verfahren
zwei wichtige Vorteile: Solange eine
angezeigte Ziffer nicht verändert
werden muss, braucht sich das
steuernde System nicht um sie zu
kümmern. Ferner kann jedes
Siebensegment-Display unabhängig
von den übrigen gesteuert werden, so
dass der Programmieraufwand gering
ist und der Prozessor nur minimal
belastet wird.
Die Schaltung arbeitet mit einer
Betriebsspannung von +5 V, für jedes
IC ist ein Entkoppelkondensator
vorgesehen. Die Werte der
S t r o m b e g r e n z u n g s -W i d e r s t ä n d e
(R1...R43) sind an diese Spannung
angepasst. Wenn die Helligkeit der
X-10 - 3/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
Bild 3. Platinen-Layout und Bestückungsplan für die LED-Anzeige-Einheit. Die Platine gehört nicht zum Elektor-Programm.
Displays nicht ausreicht, können sie
zum Beispiel auf 180
Ω herabgesetzt
werden. Höhere Werte haben eine
geringere Helligkeit zur Folge,
gleichzeitig ist aber auch der
Energiebedarf niedriger.
Platine
Der Aufbau der LED-Anzeige-Einheit
wird durch die dafür entworfene Platine
erheblich vereinfacht; Bild 3 zeigt das
Layout und den Bestückungsplan.
Allerdings gehört die Platine nicht zum
Elektor-Programm, so dass sie in
Eigenarbeit angefertigt werden muss.
Wenn das geschehen ist, werden zuerst
die Drahtbrücken montiert. Die ICs
sollten in Fassungen montiert werden,
während die Siebensegment-Displays
direkt auf die Platine gelötet werden
können. Im Bestückungsplan fehlen die
Bezeichnungen bei den Widerstands-
Symbolen, die zu den Dezimalpunkten
der Displays gehören. Der Grund ist,
dass Widerstand R43 bei dem Display
eingelötet werden muss, auf dem der
Dezimalpunkt erscheinen soll.
Programm-Beispiel
Ein Mikrocontroller-System, das die
Anzeige-Einheit steuern soll, braucht
dazu eine Routine, die diese Aufgabe
übernimmt. Als Beispiel ist in Listing 1
eine Assembler-Routine für die Atmel-
Prozessoren AT90S1200...8515
abgedruckt. Die Routine hat die Form
eines eigenständigen Treibers, so dass
sie leicht in die unterschiedlichsten
Controller-Programme implementiert
werden kann. Da die Routine linear
programmiert ist, lassen sich die
einzelnen Schritte auch von weniger
PC-P
LUS
——————————————————
Elektor
EXTRA
X-11 - 3/2000
;***************************************************
;* File Name
:LEDDisp.inc
;* Title
:Driver for LED Display
;* Date
:Ingo Gerlach / 10.10.99
;* Version
:1.0 / 11.10.99
;* Version
:
;* µC
:AT90S1200...8515
;* :
;* Changes
:
;*
;***************************************************
;
;
; Main program register variables
;—————————————————————————————————————-
;.def temp =
r16
; Registers / LED
;—————————————————————————————————————-
;.def
cntr
= r20
; counter
;.def
dly
= r21
; delay loop variable
;.def
pos
= r23
; position
;.def
byte
= r24
; byte
; Equates
;—————————————————————————————————————-
;.equ
LED_qty = 6
; number of LEDs
;.equ
LED_Del = 45
; delay
;.equ
OutPort = PortB
; Functions
; LED_Blank
: switch display on
; LED_Null
: reset display 0 ( Null)
; LED_Show
: show bytes , transport byte (R24),
position (R23)
; **** Switch display off
;**************************
LED_Blank:
ldi
cntr,LED_QTY
LedLoop1:
ldi
temp,192
add
temp,cntr
out
OutPort,temp
Rcall
Led_Delay
dec
cntr
brne
LedLoop1
Ret
;**************************
; **** Reset display
;**************************
LED_Null: ldi
cntr,LED_QTY
; load number of LEDs
LedLoop2: out
OutPort,cntr
Rcall
Led_Delay
dec
cntr
brne
LedLoop2
Out
OutPort,cntr
Ret
;**************************
; **** Show byte
;**************************
LED_Show:
mov
temp,pos ; position in register
out
OutPort,temp ; activate BCD-
to-decimal decoder, LD 4543
Rcall
Led_Delay ; short delay
mov
temp,byte ; value in
register
swap
temp
; value high
nibble
add
temp,pos
; goto position
out
OutPort,temp ; 4028 / 4543
move value to display
Rcall
Led_Delay ; short delay
sub
temp,pos
out
OutPort,temp ; LD signal
off, store value
Rcall
Led_Delay
Ret
;**************************
; * Internal functions !!!
; *** Delay LED display
;**************************
LED_Delay:
ldi dly,LED_Del
LedLoop:
dec dly
brne LEDLoop
ret
Listing 1. In Assembler geschriebene Treiber-Routine für die Prozessoren AT90S1200...8515 von Atmel. Sie lässt sich leicht auf andere
Prozessor-Familien übertragen.
geübten Programmierern leicht
nachvollziehen.
Ein kurzes Demo-Programm, mit dem
sich auch der Schaltungsaufbau testen
lässt, ist in Listing 2 zu finden. Nach
Löschen der Anzeige schreibt das
Programm die Zahl ”145675” dorthin;
abhängig von der Einstellung des
Dezimalpunkts kann die Zahl dort auch
als ”145.675” erscheinen.
Wenn die Hardware wunschgemäß
arbeitet, steht Experimenten mit der
Software nichts mehr im Weg. Auf
andere Prozessor- oder Controller-
Familien lassen sich die Treiber- und
Demo-Routine leicht übertragen, die
Kommentare in den Listings geben
dazu zusätzliche Hilfestellung.
(002009)gd
X-12 - 3/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
;***************************************************
;* File Name
:LED.asm
;* Title
:Test program for LED display
;* Date
:Ingo Gerlach / 10.10.99
;* Version
:1.0 / 10.10.99
;* Version
:
;* µC
:AT90S1200...8515
;* :
;* Changes :
;*
;***************************************************
;
;***** Directives
.device AT90S1200
;device type
.NOLIST
.include ”1200def.inc”
.list
.listmac
; Show data
; Structure of data
;
MSB
LSB
;
7 6 5 4
3 2 1 0
;
0 0 0 0
0 0 0 0
;
;
Select position 1 = 1. 2 = 2. etc
;
Number in BCD code
;
;e.g.
10010010b = 146d = pos. 2, value 9
;
; Main program register variables
;—————————————————————————————————————-
.def temp
=
r16
; Registers / LED
;—————————————————————————————————————-
.def
cntr
= r20
; counter
.def
dly
= r21
; delay loop variable
.def
pos
= r23
; position
.def
byte
= r24
; byte
; Equates
;—————————————————————————————————————-
.equ
LED_qty = 6
; number of LEDs
.equ
LED_Del = 40
; delay
.equ
OutPort = PortB
;***** Interrupt vector table
reset:
rjmp
main
; main routine
reti
; external interrupt0 handle
reti
; T/C0 overflow interrupt handle
reti
; analogue comparator interrupt handle
;***** Functions ***************************
;*******************************************
;***** Main ********************************
main:
;
ldi
temp, LOW(RAMEND)
; setup StackPointer
for > 90S1200
;
out
SPL, temp
; initialize SPL
;
ldi
temp, HIGH(RAMEND)
;
out
SPH, temp
; initialize SPH
ldi
temp,255
; temp = 255
out
ddrb,temp
; port B output
Rcall LED_Null
; reset display
mainloop:
; Show
145.675
ldi
Pos,1
ldi
Byte,1
Rcall
Led_Show
ldi
Pos,2
ldi
Byte,4
Rcall
Led_Show
ldi
Pos,3
ldi
Byte,5
Rcall
Led_Show
ldi
Pos,4
ldi
Byte,6
Rcall
Led_Show
ldi
Pos,5
ldi
Byte,7
Rcall
Led_Show
ldi
Pos,6
ldi
Byte,5
Rcall
Led_Show
forever:
rjmp forever
; ***** End of main program *******************
; ***
Include Files ***
.include ”LEDDisp.inc”
Listing 2. Dieses Programm-Beispiel zeigt, dass die Treiber-Routine leicht in Anwender-Programme implementiert werden kann.