Forum: Mikrocontroller und Digitale Elektronik 7 SEGMENT MULTIPLEX


von Fabian (Gast)


Lesenswert?

Hy Leute,

bin auf dies tolle forum gestossen wie ich mein problem gegoogelt hab. 
Hab gesehen das hier einigen bisschen weitergeholfen  wird wenn man wo 
steckt. Mein problem ist das multiplexen mit dem µC. Und zwar gebe ich 
Zahlen von 0 -9 schon aus,aber höherere zahlen wie zB 10 versuche ich 
schon seit 1,5h,und mir fällt nur diese idee ein.
OEB=0x01; Pin 1 am port b wird als Ausgang definert
OUTB=0x01; HIGH an diesem PIN
OUTC=EINS; Im define schon alles erledigt
OEB=0x00;Alles wieder abdrehen
OEB=0x02;Jetzt wird bur der zweite PIN als ausgang definiert

OUTB=0x02; Für die zweite Anzeige wird common anode auf 1
OUTC=NULL; Im define

7 Segment-Anzeigen sind common anode darum wird immer ein portpin auf 
masse gelegt (OUTB=0x00). Hat wer einen besseren Ansatz?  Danke im 
Vorhinein
 Ach ja und mein controller ist ein 805q1 von cypress
von Karl H. (kbuchegg)


Lesenswert?

Fabian schrieb:
> Hy Leute,
>
> bin auf dies tolle forum gestossen wie ich mein problem gegoogelt hab.
> Hab gesehen das hier einigen bisschen weitergeholfen  wird wenn man wo
> steckt. Mein problem ist das multiplexen mit dem µC. Und zwar gebe ich
> Zahlen von 0 -9 schon aus,aber höherere zahlen wie zB 10 versuche ich
> schon seit 1,5h,und mir fällt nur diese idee ein.

Das ist ok. Multiplexen ist hier durchaus eine vernünftige Lösung.

> OEB=0x01; Pin 1 am port b wird als Ausgang definert
> OUTB=0x01; HIGH an diesem PIN
> OUTC=EINS; Im define schon alles erledigt
> OEB=0x00;Alles wieder abdrehen
> OEB=0x02;Jetzt wird bur der zweite PIN als ausgang definiert
>
> OUTB=0x02; Für die zweite Anzeige wird common anode auf 1
> OUTC=NULL; Im define
>
> 7 Segment-Anzeigen sind common anode darum wird immer ein portpin auf
> masse gelegt (OUTB=0x00). Hat wer einen besseren Ansatz?

Na ja. Aus dem was du da zeisgt, kann man nicht wirklich etwas ablesen.

Multiplexen steht und fällt mit dem Einsatz von Timern.
Du brauchst einen Timer, der in regelmässigen Zeitabständen eine 
Funktion aufruft (eine ISR).

In dieser Funktion wird die aktuell gerade leuchtende Anzeige 
abgeschaltet, die Segmentleitungen für die nächste Anzeigestelle 
umgestellt und diese dann aktiviert. Das ist auch schon alles. Beim 
nächsten Aufruf der Funktion geht es dann wieder weiter: die jetzt eben 
leuchtende Anzeige abgeschaltet, die Segmentleitungen für die nächste 
Stelle eingestellt und diese aktiviert. Und so weiter und so weiter. 
Immer reihum eine Anzeige nach der nächsten. Jede darf so lange 
leuchten, bis die ISR die nächste Stelle aktiviert. Wenn das nur schnell 
genug passiert, sehen wir langsame Menschen alle Anzeigen gleichzeitig 
leuchten.

d.h. das Hauptprogramm selbst kümmert sich überhaupt nicht mehr um den 
Multiplex, das erledigt einer Timer mit der regelmässig aufgerufenen 
ISR-Funktion. Das Hauptprogramm hat lediglich ein paar globale 
Variablen, in die es das auszugebende Muster für jede Stelle 
reinschreibt und wenn die ISR dann diese Stelle bearbeitet, dann 
erscheint dieses Muster auch auf der Anzeige. Für das Hauptprogramm 
bedeutet das ganz einfach: Das auszugebende Muster in diese globalen 
Variablen zu schreiben und irgendwie 'magisch' erscheint diese Muster 
auf den 7-Segment. Solange der Timer läuft, natürlich, der diesen 
'magischen' Hintergrundmechanismus antreibt.
von Thorsten S (Gast)


Lesenswert?

1) Hardware abbilden

Versuche jede LED eines deiner Zifferndisplays ein Bit in einer 
Variablen deines Controller zuzuweisen, idealerweise in 8Bit ein 
7-Segmentdisplay:

bsp.:

Display 0 Segment a = Byte 0 Bit 0
Display 0 Segment b = Byte 0 Bit 1
Display 0 Segment c = Byte 0 Bit 2
Display 0 Segment d = Byte 0 Bit 3
Display 0 Segment e = Byte 0 Bit 4
Display 0 Segment f = Byte 0 Bit 5
Display 0 Segment g = Byte 0 Bit 6
Display 0 Dotpoint  = Byte 0 Bit 7

Das und nur dass sollte deine Anzeigenmultiplexroutine als ISR oder 
zyklisch aufgerufene Funktion machen.

2) Set funktion

Deine Set funktion bekommt die nummer des Displays und den Inhalt 
übergeben.

Set_Funktion (display0,wertx)
Set_Funktion (display1,werty)

Sie wandelt den in wert_ stehenden Inhalt in 7-Segment info um und 
schreibt ihn in die 8Bit Variablen aus deiner Zyklischen Routine.

3) Stellenübergreifend

Binärvariable in Dezimalstellen wandeln.
Stellen separieren
Inhalte an entsprechende Stellen der Set funktion übergeben.

Fertig.
T.
von "Gast" (Gast)


Lesenswert?

Wäre es nicht am einfachsten Decoder wie den HEF5411 zu verwenden?
Ich kenn mich mit dem µC programmieren noch nicht so aus aber der HEF 
hat so einen Pin, mit dem man den Input "schließen" kann, so dass man 
nicht bei den LEDs mit diesen mega Frequenzen rumspielen muss...
dann braucht für 6 7 Segment Anzeigen NUR 10 Pins und die 6 Kontroll 
Pins lassen sich auch noch zu 3 Pins codieren.

Der Link vom Datenblatt: 
http://pdf1.alldatasheet.com/datasheet-pdf/view/17747/PHILIPS/HEF4511BD.html

der Pin den ich meine ist EL

hoffe mein Beitrag vereinfacht das Multiplexen ein bisschen
von Karl H. (kbuchegg)


Lesenswert?

"Gast" schrieb:
> Wäre es nicht am einfachsten Decoder wie den HEF5411 zu verwenden?

Warum sollte es?

Versuch mal mit diesem Decoder Hex-Zahlen auszugeben :-)
oder negative Zahlen (in unseren Breiten soll es des Nachts auch schon 
mal Minusgrade haben, so dass eine Temperaturanzeige auch ein '-' 
braucht)

Der springende Punkt: In Software kann ich jede beliebige Anzeige 
realisieren, solange sie sich nur mit den vorhandenen Segmenten 
realisieren lässt. Mit so einem Decoder bin ich immer darauf angewiesen, 
was mir der Hersteller als "Zeichensatz" gibt.

> Ich kenn mich mit dem µC programmieren noch nicht so aus aber der HEF
> hat so einen Pin, mit dem man den Input "schließen" kann, so dass man
> nicht bei den LEDs mit diesen mega Frequenzen rumspielen muss...

Übertreib nicht.
7 Segment Multiplex hat doch nix mit Mega-Frequenzen zu tun.

> dann braucht für 6 7 Segment Anzeigen NUR 10 Pins

Ist aber jetzt wirklich kein Thema.
Wenn es sein muss, kann ich mit einem Schiebregister auch mit 3 Pins 
komplett durchkommen.

> hoffe mein Beitrag vereinfacht das Multiplexen ein bisschen

Nicht wirklich.
7-Segment-Multiplexen in Software ist ein 10-Zeiler. (OK, Ich hab nicht 
nachgezählt. können in Summe auch 12 oder 15 Zeilen sein


Edit: Hab ich das jetzt richtig gesehen? Dieser Decoder unterstützt noch 
nicht mal die Ansteuerung des Dezimalpunktes? Wie willst du denn da dann 
bei zb einem Messgerät so Dinge wie Bereichsumschaltung machen, wenn du 
den Dezimalpunkt nicht visualisieren kannst.
von Jens B. (nixiefreak)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn es sein muss, kann ich mit einem Schiebregister auch mit 3 Pins
> komplett durchkommen.

Dann brauchst du aber eigentlich auch kein Multiplex mehr ;-)
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.