mikrocontroller.net

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


Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlev Tietjen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, Druckfehler:

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

Gruß

Dietmar

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Kirsten (onkel_michi)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.