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
Hi, Du solltest immer zunächst die 5V für alle abschalten, bevor du das nächste Bitmuster auf PORTB ausgibst.
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.
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
Sorry, Druckfehler: Natürlich teilt sich nicht, sondern erhöht sich die Multiplexfrequenz mit der Anzahl der Ziffern. Gruß Dietmar
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
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
@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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.