Probleme beim Multiplexen mit 7-Segmentanzeigen

OP #330630
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
Gast #330633
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
Gast #330635
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
Gast #330636
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
OP #330637
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
Gast #330638
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
OP #330639
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.