Forum: Mikrocontroller und Digitale Elektronik Drei 7-Segment-Anzeigen über nur einen Port ansteuern


von Christian W. (christian_w)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte gerne drei 7-Segment-Anzeigen über einen ATMega8 und über 
einen 7-Segment-Treiber ansteuern. Wenn Beispielsweise der Port auf 
00000000 steht, soll in den 3 Anzeigen "000" stehen, und wenn der Port 
auf 11111111 steht, soll die Anzeige "255" wiedergeben.

Wie geht sowas? Ich finde nirgends einen Chip der sowas kann. Oder kann 
man 3 Chips, die die 7 Segment Anzeigen ansteuern, kombinieren?

Christian

von _Gast (Gast)


Lesenswert?

Max 7219 wäre für Dich geeignet! Jedoch nicht Parallel  sondern seriell 
mit  3 Leitungen
Gruß
Peter

von Achim M. (minifloat)


Lesenswert?

Nimm doch Charlieplexing, dann geht das alles ohne zweites IC.
mfg mf

von Peter D. (peda)


Lesenswert?

Das einfachste: nimm einen MC und programmier ihn dafür:
- 8 Pins als Eingang
- 7 Pins für die Segmente (mit Vorwiderstand)
- 3 Pins für die Digits (über Treibertransistoren)
Paßt z.B. ein ATtiny2313 oder ATmega48 (5 IOs frei).

Die paar Bytes Code sind schnell geschrieben (in C).


Peter

von Christian W. (christian_w)


Lesenswert?

Charlieplexing? Wie geht sowas vor sich?

Ein C-Codebeispiel wäre da sehr sehr hilfreich, wie ich die 8-Bit breite 
Portausgabe auf 3 unterschiedliche 7-Segment-Anzeigen verteile.

Ist das sowas wie Multiplexing mit 3 Transistoren zum zeitversetzten 
Ansteuern der Anzeigen?

EDIT: Danke Peter. Bitte C-Code Beispiele, wie ich 11111111 auf 3 
Displays aufteile! Danke :-)))))))))

von Michael H. (michael_h45)


Lesenswert?

Christian W. schrieb:
> Wie geht sowas? Ich finde nirgends einen Chip der sowas kann.
Naja, das geht schon. Ist aber ziemlich, ziemlich sinnlos, weil du viel 
Logik verbrätst, während sich dein Mikrocontroller langweilt.

Bau dir lieber eine ordentliche Routine in Software, die 3 Anzeigen an 
einem Port verwaltet.

Beispiel:
PC0-PC3: Daten, die an einem Segment angezeigt werden sollen.
PC4,5,6: Latch-Eingang für je ein Segment.

void dsp_char(unsigned char char2display)
{
   /* set MSB digit */
   PORTC = (PORTC & 0xf0) | (char2display / 100);
   /* latch to 7seg driver */
   PORTC |= (1<<PC4); PORTC &= ~(1<<PC4);

   /* set mid digit */
   PORTC = (PORTC & 0xf0) | ((char2display % 100)/10);
   /* latch to 7seg driver */
   PORTC |= (1<<PC5); PORTC &= ~(1<<PC5);

   /* set LSB digit */
   PORTC = (PORTC & 0xf0) | ((char2display % 10);
   /* latch to 7seg driver */
   PORTC |= (1<<PC6); PORTC &= ~(1<<PC6);
}

Als Treiber-IC: 74HC4543

von Christian W. (christian_w)


Lesenswert?

Danke, klingt perfekt.

Speziell an dem C-Code ist es noch gescheitert. War mir nicht klar, wie 
ich im AVR Studio eine 3 stellige int-Zahl so zersäge, dass sie auf 3 
Displays ausgegeben werden kann.

Also ich brauche praktisch dann 3 mal den 74HC4543?

Christian

von Michael H. (michael_h45)


Lesenswert?

Christian W. schrieb:
> Speziell an dem C-Code ist es noch gescheitert. War mir nicht klar, wie
> ich im AVR Studio eine 3 stellige int-Zahl so zersäge, dass sie auf 3
> Displays ausgegeben werden kann.
Verstehst du denn den Code oben?

> Also ich brauche praktisch dann 3 mal den 74HC4543?
Ja.

von Christian W. (christian_w)


Lesenswert?

Michael H. schrieb:
> Verstehst du denn den Code oben?
Zum Großteil ja ;)
Es wird aus der gelieferten Zahl zunächst die 100er oder 10er oder 1er 
Stelle errechnet, und dann je nachdem auf Display 1, 2 oder 3 
ausgegeben.
Stimmts so?
Aber warum ist der PIN nur sehr sehr kurz ein?

PORTC |= (1<<PC4); PORTC &= ~(1<<PC4);

von Michael H. (michael_h45)


Angehängte Dateien:

Lesenswert?

Christian W. schrieb:
> Stimmts so?
Ja.

> Aber warum ist der PIN nur sehr sehr kurz ein?
Anhang.
Das IC übernimmt und speichert (=latcht) die Daten an seinen 4 Datenbits 
D0-D4 genau dann, wenn an LD eine steigende Flanke kommt.
Sind die Daten übernommen und LD wieder low, kann an den Datenbits 
Beliebiges anliegen ohne dass es den 744543 oder die Anzeigen 
interessiert.

von MaWin (Gast)


Lesenswert?

> Ich finde nirgends einen Chip der sowas kann.

Erstes nachzählen sagt, daß er mindestens 31 Anschlüsse haben müsste.

Ein ispLSI2032 hat die und kann die Aufgabe übernehmen.

Da aber der Eine es so und der Andere es anders haben will, muß dieser 
ispLSI2032 vorher programmiert werden.

Das geht mit ein paar Leitungen vom Parallelport eines PCs aus recht 
einfach, aber man könnte dann auch gleich einen Microcontroller nehmen. 
Der ispLSI ist nämlich einfach rasend schnell, so schnell muß es in der 
Anwendung gar nicht sein.

Andere Leute zeigen die Zahl in hexadezimal an und nehmen 2 Anzeigen vom 
Typ HDSP-0772

von Christian W. (christian_w)


Lesenswert?

Danke für die Vorschläge.

Das mit dem zwischengeschaltenem 74HC4543 hört sich ganz gut an, ich 
denke, so werd ichs auch machen :-)

Ist das eigentlich mit einem ATMega8, 3x 74HC4543, und 3 7-Seg-Anzeigen 
möglich, dass ich von 3 Extra-Pins vom µC nochmal eine Verbindung zu den 
mittleren Balken der 3 Anzeigen lege, damit ich Bindestriche aufleuchten 
lassen kann?

Christian

von Michael H. (michael_h45)


Lesenswert?

Geht, falls du Dioden dazusetzt.

Aber dein Vorhaben geht auch einfacher: Lass eine 0 anzeigen und setz 
die PH-Leitung.

von Karl H. (kbuchegg)


Lesenswert?

Christian W. schrieb:

> Ist das eigentlich mit einem ATMega8, 3x 74HC4543, und 3 7-Seg-Anzeigen
> möglich, dass ich von 3 Extra-Pins vom µC nochmal eine Verbindung zu den
> mittleren Balken der 3 Anzeigen lege, damit ich Bindestriche aufleuchten
> lassen kann?

Wenn du sowieso noch 3 Piuns freihast, warum pfeifst du dann nicht auf 
die zusätzlichen Latches?

Bisher sind wahrscheinlich alle davon ausgegeangen, dass du nicht genug 
Pins übrig hast. Daher haben alle rund um das Problem rumgearbeitet.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige

von Christian W. (christian_w)


Lesenswert?

Pins habe ich tatsächlich noch frei, das stimmt. Aber ich wollte mir 
durch die Anzeigentreiber 4 Pins sparen, die ich dann anderswo verwenden 
kann. Meint ihr eine Anzeigenmatrix mit 3 Transistoren? Daran hab ich 
auch schon gedacht...

Was macht der "PH" am 74HC4543? Das Reichelt Datenblatt ist da sehr 
sparsam mit Infos.

Christian

von Michael H. (michael_h45)


Lesenswert?

Karl heinz Buchegger schrieb:
> Bisher sind wahrscheinlich alle davon ausgegeangen, dass du nicht genug
> Pins übrig hast. Daher haben alle rund um das Problem rumgearbeitet.
Hm, nein.
Ich sehe den Vorteil von zusätzlicher Hardware darin, dass die 3 Latches 
einem C-Neuling das Multiplexen "per Hand" in Code ersparen.
Wenn schon die Zerlegung eines (falsch gewählten) Datentyps zum Problem 
wird, ist das nur eine zusätzliche Hürde. Bitte Nichts für Ungut.

Aber ja, mit den Bindestrichen hat deine Lösung dann natürlich ihren 
Charme...

von Christian W. (christian_w)


Lesenswert?

> Karl heinz Buchegger schrieb:
> Aber ja, mit den Bindestrichen hat deine Lösung dann natürlich ihren
> Charme...
Wie? Ich verstehe grad nicht... :-)

von Karl H. (kbuchegg)


Lesenswert?

Michael H. schrieb:

> Wenn schon die Zerlegung eines (falsch gewählten) Datentyps zum Problem
> wird, ist das nur eine zusätzliche Hürde. Bitte Nichts für Ungut.

Nein, nein
Ist schon ok.
Wir haben nun mal alle andere Ansichten.
Multiplexen ist zwar nicht sooo einfach, aber so schwer auch wieder 
nicht.
Meine 5 Cent :-)

> Aber ja, mit den Bindestrichen hat deine Lösung dann natürlich ihren
> Charme...

Auch bei Buchstaben oder 'coolen' Einschaltmustern.

von Christian W. (christian_w)


Lesenswert?

Also wenn ichs mir recht überlege, bin ich mit einem gemultiplexten 
System dann doch besser dran, wenn ich richtig rechne, gehen da 11 PINs 
hops, 8 für die 7-Segment Anzeigen plus Punkt, und 3 für die 
Transistoren zum Displays schalten. Da gehn ja dann auch in 
eingeschränkter Weise Buchstaben, was ja mit dem 74HC4543 nun wieder 
überhaupt nicht geht.

Mit meiner zusammengerechnet mehrmonatigen C-Erfahrung krieg ich das 
schon zum Laufen :-)))

(grübel...)

von Karl H. (kbuchegg)


Lesenswert?

Christian W. schrieb:

> Mit meiner zusammengerechnet mehrmonatigen C-Erfahrung krieg ich das
> schon zum Laufen :-)))

Wenn nicht:
Die Grundlagen stehen im AVR-Tutorial. Auch wenn das Assembler ist, 
sollte es verständlich sein. Zumindest das Prinzip müsstest du 
rauskriegen.

Und wenn nicht ... du weißt wo du uns findest

von Christian W. (christian_w)


Lesenswert?

Danke :-)

von Peter D. (peda)


Lesenswert?

Christian W. schrieb:
> Also wenn ichs mir recht überlege, bin ich mit einem gemultiplexten
> System dann doch besser dran

Gute Entscheidung.

Decoder-ICs wird es auch nicht mehr lange geben.
Man braucht sie nicht mehr, bzw. nur noch als Ersatzteil für ältere 
Geräte.


Peter

von Christian W. (christian_w)


Lesenswert?

Wie verhält es sich da eigentlich mit dem Strom der durch jedes Segment 
fließt, wenn man 3 Anzeigen per Multiplex ansteuert? Gibts da eine 
Faustregel, um wieviel der Strom je Segment erhöht werden muss, damit 
alles wieder in Originalhelligkeit leuchtet?

von Karl H. (kbuchegg)


Lesenswert?

Christian W. schrieb:
> Wie verhält es sich da eigentlich mit dem Strom der durch jedes Segment
> fließt, wenn man 3 Anzeigen per Multiplex ansteuert? Gibts da eine
> Faustregel, um wieviel der Strom je Segment erhöht werden muss, damit
> alles wieder in Originalhelligkeit leuchtet?

Bei 3 Anzeigen, kannst du einfach den 3-fachen Strom durchjagen.
Irgendwann geht das natürlich nicht mehr. Bei 15 Anzeigen kann man nicht 
einfach anstelle von 20mA deren 300mA durchjagen. Da machen dann die LED 
sicher nicht mehr mit, auch wenn man im Impulsbetrieb mit dem Strom 
höher als im Dauerbetrieb gehen kann. Details weiß das jeweilige 
Datenblatt.

von Michael H. (michael_h45)


Lesenswert?

Siehe:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige#Mehrere_7-Segment_Anzeigen_.28Multiplexen.29

Mehrere 7-Segment Anzeigen (Multiplexen):
1
Bei genauerer Betrachtung fällt auch auf, dass die vier Anzeigen nicht mehr
2
ganz so hell leuchten wie die eine einzelne Anzeige ohne Multiplexen. Bei
3
wenigen Anzeigen ist dies praktisch kaum sichtbar, erst bei mehreren
4
Anzeigen wird es deutlich. Um dem entgegen zu wirken lässt man pro Segment
5
einfach mehr Strom fließen, bei LEDs dürfen dann 20mA überschritten werden.
6
Als Faustregel gilt, dass der n-fache Strom für die (1/n)-fache Zeit
7
fließen darf. Details finden sich im Datenblatt unter dem Punkt Peak-
8
Current (Spitzenstrom) und Duty-Cycle

von Christian W. (christian_w)


Lesenswert?

Aha, wären dann also rein theoretisch 60mA. Ich probiers mal aus. Wollte 
nur sichergehen dass da nix kaputtgeht...

von Thorsten S. (Gast)


Lesenswert?

Hi,

es gibt natürlich 1000 Möglichkeiten. Eine noch:

du könntest 3 74HC595 nehmen:
http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf

alle hintereinander schalten, und an jeden chip eine Anzeige. Du hast 
mehrere Vortiele:

Wenn du Anzeigen hinzufügst musst du nur die funktion ein weiteres Mal 
aufrufen die du dafür schreibst.

Du kannst alle Segmente einzeln ansteuern.

Du benötigst nur 3 4 Pins am Prozessor.

Man kommt schnell an Ziehl.

Im gegensatz zum 4543 bei dem du auch eine ganze Menge Vorwiderstände 
brauchst, hättest du einiges mehr an freiheiten... und der Chip kann 
auch noch mal für andere Aufgaben genutzt werden, wenn man mal eine 
Matrix bauen will o.ä.

Ablauf ist dann so:

Mit Clock und Data die Daten in die Registerreihe klappern. Mit einer 
Funktion die aus 4 Bit 7 Segmente macht, und einer Funktion die diese 7 
Segmente plus den Punkt in eine 8 Bit Variable verknispelt um sie dann 
in die 595 zu schieben. Diese Funktion 3 mal aufrufen, immer mit 
entsprechnd zerlegtem Ineger Wert und dann den Strobe einschalten, schon 
stehts auf dem Display...

Gruß,
Thorsten

von Michael H. (michael_h45)


Lesenswert?

Thorsten S. schrieb:
> Im gegensatz zum 4543 bei dem du auch eine ganze Menge Vorwiderstände
> brauchst, hättest du einiges mehr an freiheiten... und der Chip kann
Da würde ich gerne einen Grund zu den Vorwiderständen bekommen.

von Thorsten S. (whitejack)


Lesenswert?


von MBP-Bayern (Gast)


Lesenswert?

Eine weitere Möglichkeit für Bastler ist der Baustein SAA1064.

Eingang:    I2C
Versorgung: 5-12V
Ausgang:    16 Leitungen für 2x 7-Segment + Punkt,
Multiplex:  Kann mit 2 Externen NPN-Transistoren 4 Segmente.
Vorteile:   Keine Vorwiderstände für die LED's nötig - Strom-Ausgänge.
            Kann die Helligkeit in einigen Stufen Einstellen.
Nachteil:   Braucht etwas Platz auf der Leiterplatte - DIL24 Wide.

I2C kann an nur 2 Pins über Software in C sehr simpel implementiert 
werden.
Es gibt dafür auch fertige Vorlagen.

MFG:MBP
Markus

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.