Hey Leute,
Euer Fachwissen ist mal wieder gefragt. Ich habe vor, mit nem ATtiny2313 drei sieben Segment Anzeigen anzusteuern. Um jedes Segment einzeln anzusteuern, bräuchte man 24 freie Pins (7 Segmente, 1Punkt). da der 2313 nur 18 verfügbare Pins hat, schließt sich diese Möglichkeit von selbst aus, außerdem wäre das ein ziemlicher Aufwand.
Nun habe ich mir Überlegt, jedes Segment mit einem einzigen Pin Anzusteuern und noch 3 Transistoren für die jeweilige Anzeige nachzuschalten:
mit der Lösung zeigen die Anzeigen aber alles das gleiche, man kann sie nur an und aus schalten. Ich bräuchte die Möglichkeit, auf jedem Segment die Zahlen 1-9 seperat anzusteuern. so.
Hat jemand einen anderen Vorschlag?
bin für jeden hilfreichen Vorschlag dankbar
mfG. Marv
7 Segmentanzeigen mit tiny 2313 Ansteuern
Moderator: T.Hoffmann
Hi,
Hab zwar noch kaum Ahnung von µControllern aber ich hab ne Idee.
Ich glaube hier lässt sich doch das Multipexing anwenden.
Um z. B. auf der ersten Anzeige "a"+"b" leuchten zu lassen wird der erste Transistor und a+b (Pin 26+9) geschaltet.
Dann halt für die 2te + 3te Anzeige den 2ten bzw. 3ten Transistor schalten.
Wenn man das ganze schnell genug hintereinander schaltet, sieht man nicht, das eigentlich immer nur eine Anzeige leuchtet.
Hab hier mal ein Beispiel rausgesucht, was du schon auf deine Schsltung angewendet hast: http://www.vig-wam.de/elektronik/projek ... rix_01.gif
Mfg Simse
Hoffe ich konnte helfen.
Hab zwar noch kaum Ahnung von µControllern aber ich hab ne Idee.
Ich glaube hier lässt sich doch das Multipexing anwenden.
Um z. B. auf der ersten Anzeige "a"+"b" leuchten zu lassen wird der erste Transistor und a+b (Pin 26+9) geschaltet.
Dann halt für die 2te + 3te Anzeige den 2ten bzw. 3ten Transistor schalten.
Wenn man das ganze schnell genug hintereinander schaltet, sieht man nicht, das eigentlich immer nur eine Anzeige leuchtet.
Hab hier mal ein Beispiel rausgesucht, was du schon auf deine Schsltung angewendet hast: http://www.vig-wam.de/elektronik/projek ... rix_01.gif
Schaltung kannst du denke ich so nehmen, musst es halt nur "richtig" programmieren, aber wie das geht weis ich (noch) nicht.Marvin hat geschrieben:Ich bräuchte die Möglichkeit, auf jedem Segment die Zahlen 1-9 seperat anzusteuern. so.
Hat jemand einen anderen Vorschlag?
Mfg Simse
Hoffe ich konnte helfen.
Simse hat geschrieben:Hi,
Schaltung kannst du denke ich so nehmen, musst es halt nur "richtig" programmieren, aber wie das geht weis ich (noch) nicht.
Mfg Simse
Hoffe ich konnte helfen.
1.Anzeige: a+b 2.Anzeige: d+g 3.Anzeige: f+e In der realität würden dann ja auf allen Anzeigen folgende Segmente leuchten: a,b,d,g,f,e da ja die jeweiligen Pins auch mit den anderen Anzeigen verbunden sind. Und wenn der Transistor der Anzeige geschaltet ist, dann leuchten auch diese segmente hier ein Bsp.: Aber das wird nach anteuerung der Pins angezeigt werden: Es ist also nicht so einfach wie es auf den ersten Blick aussieht
mfG. Marv
Edit: nur zum verständnis die Belegung der Anzeigen, die ich verwende.
- Beatbuzzer
- Auserwählter

- Beiträge: 3177
- Registriert: Fr, 17.08.07, 11:02
- Wohnort: Alfeld / Niedersachsen
- Kontaktdaten:
Doch so einfach ist es und Simse hat es auch schon ganz richtig erklärt.Marvin hat geschrieben:mein problem ist, dass ich gleichzeitig verschiedene Werte auf den Anzeigen Schalten möchte also z.B.
Es ist also nicht so einfach wie es auf den ersten Blick aussieht![]()
Du hast es wohl nur noch nicht ganz verstanden.
Wenn wir von Multiplexing reden, reden wir von Schaltzeiten im unteren ms-Bereich. Da sieht keiner mehr die einzelnen Anzeigen blinken, und man kann von "gleichzeitig" sprechen.
Man gibt die Daten einfach nacheinander aus und schaltet im entsprechenden Moment die passende Anzeige ein. Einziger Nachteil ist, dass eine Anzeige dann nur noch 1/3 ihrer Helligkeit hat. Man kann den Strom aber dafür etwas großzügiger auslegen und den Effekt teilweise kompensieren.
Kurz gesagt, du kannst das so aufbauen wie es in deinem Plan aussieht, dann funktioniert das mit dem passenden Programm ohne weitere Probleme. Das können wir aber erst dann machen, wenn raus ist, was du genau anzeigen willst. Ein paar Widerstände wären aber noch ganz nett, es sei denn die sind schon in den Anzeigen...aber sowas gibts glaub ich nicht
Aso ok jez check ich des ihr meint dass des gewünschte Signal für z.B. 10ms anbleibt und dann des nexte für 10, usw. Wie groß müssten die Intervalle sein?
Das wirk dann so ähnlich wie ne PWM?
Die Anzeigen sind für 5V ausgelegt, und man kann sie (bei pulsung, was wir hier ja hätten) mit bis zu 75mA durchblasen, ich werde aber trotzdem kleine Schutzwiderstände verbauen. Das gaze soll am Schluss ein Timer geben, der von 2 min runterzählt. Bloß wenn ich das richtigsehe, verdreifacht diese Methode die Programmschreiberei. Hab mir über das programm jezt noch keine Gedanken gemacht, weil ich bisher ja noch nichtmal wusste wie ich die Anzeigen überhaupt ansteure
danke an euch
das gibt natürlich sterne
mfG. Marv
Das wirk dann so ähnlich wie ne PWM?
Die Anzeigen sind für 5V ausgelegt, und man kann sie (bei pulsung, was wir hier ja hätten) mit bis zu 75mA durchblasen, ich werde aber trotzdem kleine Schutzwiderstände verbauen. Das gaze soll am Schluss ein Timer geben, der von 2 min runterzählt. Bloß wenn ich das richtigsehe, verdreifacht diese Methode die Programmschreiberei. Hab mir über das programm jezt noch keine Gedanken gemacht, weil ich bisher ja noch nichtmal wusste wie ich die Anzeigen überhaupt ansteure
danke an euch
mfG. Marv
- Beatbuzzer
- Auserwählter

- Beiträge: 3177
- Registriert: Fr, 17.08.07, 11:02
- Wohnort: Alfeld / Niedersachsen
- Kontaktdaten:
Eine Durchlaufzeit so gewählt, dass man am Ende eine Wiederholfrequenz von min. 50-60Hz hat, würde ich schon nehmen.
Das wären dann max. 20ms gesamt, also bei drei Anzeigen am besten 6ms / 7ms / 7ms, dann sinds 20ms, was dann 50Hz macht.
Über das Programm müsste ich auch erstmal kurz grübeln, so topfit bin ich auch noch nicht.
Auf jeden Fall sollte man sich Gedanken über ein Quarz machen.
Wenn die Uhr mehr nur Show sein soll, geht auch der interne Takt. Sollen die 2min, aber auch möglichst genau eingehalten werden, empfiehlt sich schon auf externen Takt per Quarz umzusteigen.
Habe selbst schonmal Versuche mit dem internen Takt angestellt. Bei meinen Umgebungsbedingungen (18°C / 5V Ub) lief der Takt bei einer Minute um etwa 1 sec. aus dem Ruder.
Du musst also schon mit 2sec. Differenz bei 2min. rechnen, evtl. mehr.
Zum Programm hab ich mittlerweile auch nen Ansatz:
Man könnte erstmal zentral die zu setzenden Ausgänge für eine Anzeige von 9 runter bis 0 schreiben. Dann schreibt man einen Dreierblock, welcher in den 6ms / 7ms / 7ms Abstand alle drei Anzeigen ansteuert. Durchlaufzeit ist 20ms. Das ganze läuft also 50mal durch, dann ist 1sec. vergangen. Dann wird der Dreierblock mit neuen Daten bestückt, über Variablen die man dann entsprechend der als nächstes anzuzeigenden Zahlen ändert. Das Schema dazu ist ja bereits am Anfang geschrieben worden.
Zusätzlich baut man noch einen Zähler ein, welcher nach 120sec. (2 min.) das ganze beendet, oder z.B. die Anzeige blinken lässt, oder wie auch immer...
Das wären dann max. 20ms gesamt, also bei drei Anzeigen am besten 6ms / 7ms / 7ms, dann sinds 20ms, was dann 50Hz macht.
Über das Programm müsste ich auch erstmal kurz grübeln, so topfit bin ich auch noch nicht.
Auf jeden Fall sollte man sich Gedanken über ein Quarz machen.
Wenn die Uhr mehr nur Show sein soll, geht auch der interne Takt. Sollen die 2min, aber auch möglichst genau eingehalten werden, empfiehlt sich schon auf externen Takt per Quarz umzusteigen.
Habe selbst schonmal Versuche mit dem internen Takt angestellt. Bei meinen Umgebungsbedingungen (18°C / 5V Ub) lief der Takt bei einer Minute um etwa 1 sec. aus dem Ruder.
Du musst also schon mit 2sec. Differenz bei 2min. rechnen, evtl. mehr.
Zum Programm hab ich mittlerweile auch nen Ansatz:
Man könnte erstmal zentral die zu setzenden Ausgänge für eine Anzeige von 9 runter bis 0 schreiben. Dann schreibt man einen Dreierblock, welcher in den 6ms / 7ms / 7ms Abstand alle drei Anzeigen ansteuert. Durchlaufzeit ist 20ms. Das ganze läuft also 50mal durch, dann ist 1sec. vergangen. Dann wird der Dreierblock mit neuen Daten bestückt, über Variablen die man dann entsprechend der als nächstes anzuzeigenden Zahlen ändert. Das Schema dazu ist ja bereits am Anfang geschrieben worden.
Zusätzlich baut man noch einen Zähler ein, welcher nach 120sec. (2 min.) das ganze beendet, oder z.B. die Anzeige blinken lässt, oder wie auch immer...
- CRI 93+ / Ra 93+
- Auserwählter

- Beiträge: 2801
- Registriert: So, 19.10.08, 23:56
- Wohnort: Hannover
Die Einschaltdauer kann man der LEDs wegen durchaus auf 1 ms und weniger setzen, allerdings will man ja noch etwas Prozessorzeit für andere Dinge nutzen, unter 1 ms sollte man deshalb nicht unbedingt gehen (für 1 bis 8 MHz Takt des AVR). Das Beste wäre, das Umschalten in einem Timer-Interrupt zu erledigen. Im Main-Loop geht zwar auch, führt aber sehr schnell zu einem umgleichmäßigen Flackern der Anzeige. Je nachdem ob andere Oprationen nach einem kompletten Druchlauf aller Stellen erfolgen (dann flackern alle Stellen gleich und es fällt weniger auf, ist aber wahrnehmbar) oder ob man andere Operationen zwischen jedem Stellenwechsel durchführt, dann schwankt die Helligkeit der einzelnen Stellen.
Das ganze ist nicht weltbewegend kompliziert aber für Anfänger u.U. nicht geeignet. Man sollte sich zumindest schonmal mit Arrays befasst haben (obwohl man bei so wenigen Stellen notfalls auch mit einzelnen Variablen pro Stelle arbeiten kann, davon rate ich jedoch dringend ab).
Immer pro Stelle 1 Byte vorsehen ()also ein Array mit 4 Bytes), welches pro 1 Byte die aktiven Segmente der jeweiligen Stelle enthält. Wenn man die Schaltung dann noch so verdrahtet, dass alle 8 Segmente an einem Port (A, B, C, D usw.) hängen, muss man in der Multiplexing-Routine nur noch dieses eine Byte auf den Port kopieren.
Der Schaltplan berücksichtigt dies derzeit nicht. PORTC ist nicht dafür geignet, da ADC6 und ADC7 nur als Analogeingang genutzt werden können. Um evtl. den PC per RS232 anschließen zu können, sollte man sich außerdem TxD und RxD frei halten.
Wesentlich aufwändiger als das Multiplexing selbst, aber ebenfalls kein Hexenwerk, ist es die anzuzeigenden Zahlen in die passenden Bitmuster umzuwandeln. Das macht man mit einem Array mit 10 Einträgen: 0...9 und an jeder Stelle ist dann das Bitmuster der Zahl 0 bis 9 abgelegt. Immer wenn der anzuzeigende Wert geändert wird, wird er neu ins Array mit den durch die Multiplexing-Routine ausgelesenen Bytes kopiert. Die Dezimalpunkte sollte man separat behandeln.
So ungefähr muss das Multiplexing aussehen:
1. alle Stellen ausschalten
2. Segmente für Stelle n aktiveren
3. Stelle n einschalten
4. Wenn n < 2, dann n = n + 1, sonst n=0 [ich gehe von Zählweise 0, 1, 2 aus, Zählweise 1, 2, 3 geht aber ebenfalls]
5. ggf. 3..5 ms warten (oder wir befinden uns ohnehin in einem Interrupt, dann gibt der das Timing vor. *)
6. weiter bei 1.
*) Eine Delay-Routine ist dann nicht mehr notwendig. Delays in Interrupts sind in 99,9% der Fälle Blödsinn, meist fatal und sollten vermieden werden, da sie schnell dazu führen, dass der Prozessor zu gar nichts anderem mehr kommt und das Programm dann hängt. Wenn man diesen Zusammenhang nicht kennt sucht man u.U. auch noch an einer völlig anderen Stelle den Fehler.
Je nach Farbe der LEDs (und je nach Atmel-Typ) kann man entweder den Atmel mit der LED-Spannung versorgen oder aber man sollte in die 8 IO-Leitungen, die zu den Segmenten gehen noch Widerstände einfügen.
Widerstände nach den Transitoren gehen auch, führen dann aber dazu, dass jede Stelle in der Helligkeit schwankt, je nachdem wie viele Segmente für diese Stelle gerade aktiv sind, da sich der LED-Strom auf alle eingeschalteten Segmente aufteilt.
Ja nachdem ob man Löt-faule oder Programmier-fauler ist, kann man das aber in Software kompensieren, indem man die Einschaltdauer der jeweiligen Stelle von der Anzahl ihrer aktiven Segmente abhängig macht. Dann muss man allerdings die Einschaltdauer im Mikrosekunden-Bereich variieren und das ganze geht nur vernünftig mit einem Timer-Interrupt (der dann je nach gewünschter Einschaltdauer bei jedem Weiterschalten einer Stelle mit einem neuen Wert initialisiert wird).
Wenn der Atmel die Zeit zählen soll, dann wird es ohne Quarz mehrere Minuten Abweichung pro Tag geben und selbst wenn man das ganze kalibriert wird es sicher noch mindestens 1 Minute schwanken und je nach Temperatur und Spannung des Controller variiert der interne RC-Oszillator ebenfalls.
Einige Atmels erlauben einen Uhrenquarz separat zum Prozessortakt, der lässt dann nur einen Zähler laufen, der Prozessor selbst kann mit voller Geschwindigkeit laufen. Ich empfehle hier den ATmega88, ATmega168 oder ATmega328 (alles die gleiche Familie nur mit 8, 16 oder 32 kB Programmspeicher). Die laufen auch schon ab 1,8V (dann allerdings sollte man den Takt auf 4 MHz runterteilen) , damit kann man die ganze Schaltung mit 2V (bei roten LEDs) betreiben und ohne Vvorwiderstände auskommen. Eine gewisse Strombegrenzung bieten die IO-Ports des Atmel selbst (je niedriger die Versorgungsspannung, desto niedriger der maximal mögliche Ausgangsstrom)
Der Mega8 ist veraltet und sollte nicht mehr eingesetzt werden!
Das ganze ist nicht weltbewegend kompliziert aber für Anfänger u.U. nicht geeignet. Man sollte sich zumindest schonmal mit Arrays befasst haben (obwohl man bei so wenigen Stellen notfalls auch mit einzelnen Variablen pro Stelle arbeiten kann, davon rate ich jedoch dringend ab).
Immer pro Stelle 1 Byte vorsehen ()also ein Array mit 4 Bytes), welches pro 1 Byte die aktiven Segmente der jeweiligen Stelle enthält. Wenn man die Schaltung dann noch so verdrahtet, dass alle 8 Segmente an einem Port (A, B, C, D usw.) hängen, muss man in der Multiplexing-Routine nur noch dieses eine Byte auf den Port kopieren.
Der Schaltplan berücksichtigt dies derzeit nicht. PORTC ist nicht dafür geignet, da ADC6 und ADC7 nur als Analogeingang genutzt werden können. Um evtl. den PC per RS232 anschließen zu können, sollte man sich außerdem TxD und RxD frei halten.
Wesentlich aufwändiger als das Multiplexing selbst, aber ebenfalls kein Hexenwerk, ist es die anzuzeigenden Zahlen in die passenden Bitmuster umzuwandeln. Das macht man mit einem Array mit 10 Einträgen: 0...9 und an jeder Stelle ist dann das Bitmuster der Zahl 0 bis 9 abgelegt. Immer wenn der anzuzeigende Wert geändert wird, wird er neu ins Array mit den durch die Multiplexing-Routine ausgelesenen Bytes kopiert. Die Dezimalpunkte sollte man separat behandeln.
So ungefähr muss das Multiplexing aussehen:
1. alle Stellen ausschalten
2. Segmente für Stelle n aktiveren
3. Stelle n einschalten
4. Wenn n < 2, dann n = n + 1, sonst n=0 [ich gehe von Zählweise 0, 1, 2 aus, Zählweise 1, 2, 3 geht aber ebenfalls]
5. ggf. 3..5 ms warten (oder wir befinden uns ohnehin in einem Interrupt, dann gibt der das Timing vor. *)
6. weiter bei 1.
*) Eine Delay-Routine ist dann nicht mehr notwendig. Delays in Interrupts sind in 99,9% der Fälle Blödsinn, meist fatal und sollten vermieden werden, da sie schnell dazu führen, dass der Prozessor zu gar nichts anderem mehr kommt und das Programm dann hängt. Wenn man diesen Zusammenhang nicht kennt sucht man u.U. auch noch an einer völlig anderen Stelle den Fehler.
Je nach Farbe der LEDs (und je nach Atmel-Typ) kann man entweder den Atmel mit der LED-Spannung versorgen oder aber man sollte in die 8 IO-Leitungen, die zu den Segmenten gehen noch Widerstände einfügen.
Widerstände nach den Transitoren gehen auch, führen dann aber dazu, dass jede Stelle in der Helligkeit schwankt, je nachdem wie viele Segmente für diese Stelle gerade aktiv sind, da sich der LED-Strom auf alle eingeschalteten Segmente aufteilt.
Ja nachdem ob man Löt-faule oder Programmier-fauler ist, kann man das aber in Software kompensieren, indem man die Einschaltdauer der jeweiligen Stelle von der Anzahl ihrer aktiven Segmente abhängig macht. Dann muss man allerdings die Einschaltdauer im Mikrosekunden-Bereich variieren und das ganze geht nur vernünftig mit einem Timer-Interrupt (der dann je nach gewünschter Einschaltdauer bei jedem Weiterschalten einer Stelle mit einem neuen Wert initialisiert wird).
Wenn der Atmel die Zeit zählen soll, dann wird es ohne Quarz mehrere Minuten Abweichung pro Tag geben und selbst wenn man das ganze kalibriert wird es sicher noch mindestens 1 Minute schwanken und je nach Temperatur und Spannung des Controller variiert der interne RC-Oszillator ebenfalls.
Einige Atmels erlauben einen Uhrenquarz separat zum Prozessortakt, der lässt dann nur einen Zähler laufen, der Prozessor selbst kann mit voller Geschwindigkeit laufen. Ich empfehle hier den ATmega88, ATmega168 oder ATmega328 (alles die gleiche Familie nur mit 8, 16 oder 32 kB Programmspeicher). Die laufen auch schon ab 1,8V (dann allerdings sollte man den Takt auf 4 MHz runterteilen) , damit kann man die ganze Schaltung mit 2V (bei roten LEDs) betreiben und ohne Vvorwiderstände auskommen. Eine gewisse Strombegrenzung bieten die IO-Ports des Atmel selbst (je niedriger die Versorgungsspannung, desto niedriger der maximal mögliche Ausgangsstrom)
Der Mega8 ist veraltet und sollte nicht mehr eingesetzt werden!

