Forum: Mikrocontroller und Digitale Elektronik Probleme beim Multiplexen mit 7-Segmentanzeigen


von Michael K. (onkel_michi)


Lesenswert?

Guten Abend,

ich habe hier aus einer Industrieanzeige eine Platine mit 2 Zeilen
LED-7-Segmentanzeigen erbeutet.

Es sind 2 Zeilen a´ 4 7-Segmentanzeigen, die bereits für Multiplexen
mit Transistoren vorbeschaltet sind.

+5V gemeinsam für jede Stelle an einem Transistor und dann noch a - g
und DP

So, nun kommt mein Problem:

Hier im Forum stehen einige Schaltungen und Programme zum Thema
Multiplexen. Also zum Abschreiben ist genug Stoff da.

Wenn ich aber nun meinen ATmega8 nehme (3,6864 MHz) und an a-g ein
Bitmuster anlege und der entsprechenden Stelle in der nächsten
Programmzeile die 5V aufschalte, dann das Bitmuister für die nächste
Stelle, die 5V aufschalten, usw. dann wird das ein lustiges
durcheinanderblinken, aber nicht das, was ich eigentlich anzeigen
will.

Das Programm sieht dann etwa so aus:

PORTB=0x7F; Für die 8 in der Ste1le
PORTC=0x01; Für die erste Stelle einzuschalten
PORTB=0x30; Für eine 1 in der Stelle
PORTC=0x02; Für die zweite Stelle einzuschalten

usw...

Wie hoch muss / darf denn die Frequenz sein, das man das als
"stehende" Zahl sieht ? (25 Hz habe ich schon versucht, indem ich
_delay_ms(xx) (Wert fällt mir im Moment nicht mehr ein) dazwischen
gemacht habe, aber es flackert dann nur noch wilder.

Eine Simulation im AVRStudio habe ich auch schon probiert. Da sieht es
beim durchsteppen aber so aus, als ob die Wertepaare (PortB udn PortC)
immer nur an einer Stelle gleichzeitig anliegen.

Hat da jemand mal einen Tipp für mich, mit dem ich anfangen kann,
meinen Fehler zu finden und zu verstehen ?

Danke schon einmal.

Michael

von Detlev Tietjen (Gast)


Lesenswert?

Hi,

Du solltest immer zunächst die 5V für alle abschalten, bevor du das
nächste Bitmuster auf PORTB ausgibst.

von Michael K. (onkel_michi)


Lesenswert?

Nachtrag:

Ja, ich habe den ganzen Thread mit dem Drehzahlmesser in der
Codesammlung gelesen.

Leider ist das Programmbeispiel in Bascom und die 7 Segmente der
Anzeige sind dort auf 2 Ports verteilt.

von Dietmar (Gast)


Lesenswert?

7-Segment-Daten für Segment 1 ausgeben
Segment 1 einschalten
7-Segment-Daten für Segment 2 ausgeben
Segment 2 einschalten
usw.

Das ist doch eine ganz einfache Überlegung:

Um Flackern zu vermeiden, bitte über 40 Hz Multiplexfrequenz "je
Segment" gehen, aber nicht höher als 200 Hz, um Schaltverluste in den
Transistoren zu vermeiden, und weil es nicht nötig ist.

Letztendlich hängt die Multiplexfrequenz aber auch von der Anzahl der
gemultiplexten Kanäle ab, d.h., sie teilt sich durch die Anzahl der
angezeigten Ziffern:

Also, die Anzahl der Ziffern bestimmt die Umschaltfrequenz:

Z.B. 16 Siebensegmentziffern:

Die müssen alle durchlaufen, um nicht zu flimmern:

Also: Umschaltefrequenz = 40 Hz pro Ziffer (für das Auge nicht mehr
wahrnehmbar) mal 16, wären schon 640 Hz.

Je höher die Anzahl der Ziffern, desto höher die Multiplexfrequenzen,
aber auch die Impulsströme der Segmente, um auf die nötige mittlere
Leuchtdichte zu kommen. Daher begrenzt sich die Anzahl der angezeigten
Ziffern.

Gruß

Dietmar

von Dietmar (Gast)


Lesenswert?

Sorry, Druckfehler:

Natürlich teilt sich nicht, sondern erhöht sich die Multiplexfrequenz
mit der Anzahl der Ziffern.

Gruß

Dietmar

von Profi (Gast)


Lesenswert?

Wo hast Du die delays eingebaut?

PORTB=0x7F; Für die 8 in der Ste1le
PORTC=0x01; erste Stelle einschalten
delay
PORTC=0x00; erste Stelle ausschalten

PORTB=0x30; Für eine 1 in der Stelle
PORTC=0x02; zweite Stelle einschalten
delay
PORTC=0x00; zweite Stelle ausschalten

von peter dannegger (Gast)


Lesenswert?

40Hz ist doch arg knapp, ich nehme immer 100Hz ... 400Hz, also für 8
Anzeigen dann 800Hz ... 3,2kHz für den Multiplexinterrupt.


Mit Delays ist das alles ein Krampf, man hat immer unterschiedliche
Helligkeit je nachdem, wie das Main gerade beschäftigt ist.

Besser man machts gleich mit Interrupts, dann braucht das Main auf die
Ausgabe überhaupt keine Rücksicht zu nehmen.


Peter

von Michael K. (onkel_michi)


Lesenswert?

@Profi

Ja, genau so, wie Du das beschreibst, nur mit dem Unterschied, das ich
den Port nicht auf 0 gesetzt habe.

Wenn ich das richtig verstehe, dann ist das Problem wohl, das ich
langsamer mulitplexen muss. ABer nicht mit Delays, sondern irgendwie
mit Timerinterrupts. Im Moment habe ich mal versucht, eine for-next
Schleife zu schreiben und die Daten für sie einzelnen Stellen aus einem
Array auf PORTB auszugeben. Flimmert immer noch grausam, aber wenn ich
in den ATmega8 mit den internen 1 MHz laufen lasse, dann wird das für 4
Stellen besser, aber die 5. Stelle macht dann wieder Stress.

Auf eure Vorschläge hin, weder ich mich nun mal intensiv mit
Timerinterrupts beschaäftigen und dann mal versuchen das Ganze zu
lösen.

Wenn ich dann nicht weiterkomme, dann bleibe ich doch beim LCD.
Das habe ich, danke der Peter Fleury Bibliothek einigermaßen im Griff.

Werde mich morgen, nach der Arbeit, nochmal melden.

Michael

von Dietmar (Gast)


Lesenswert?

So eine 7-Segment-Multiplexung, läßt man sinnvollerweise automatisch
durch einen Timer-Interrupt abarbeiten, in dem man dort die nächste
Stelle und die dazu gehörenden Segment-Bitmuster ansteuert.

Gruß

Dietmar

von Michael K. (onkel_michi)


Lesenswert?

Ich habe nun damit angefangen, mir die Timer-Interrupt Sachen
durchzulesen.

Ist ja ganz schön kompliziert ...

Ich werde heute auf der Arbeit hoffentlich mal eine Stunde oder 2 Zeit
haben um mich mit dem Thema auseinander zu setzen.

Danke an alle, durch die vielen Versuche und die vielen Hinweise habe
ich wieder viel gelernt.

Michael

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.