Drei 7-Segment-Anzeigen über nur einen Port ansteuern

OP #1967857
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
Angehängte Dateien:
#1967876
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
OP #1967881
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 :-)))))))))
#1967886
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
#1967948
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.
Angehängte Dateien:
Gast #1967972
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
OP #1968158
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
#1968287
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
#1968298
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...
#1968309
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.
OP #1968314
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...)
#1971083
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.
#1971085
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
Gast #1971130
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
#1971201
Lesenswert?

Gast #1971228
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren