Hallo liebe Leut, ich baue mir eine 4 stellige 7-Segment-Anzeige und wollte noch eine Bestätigung, dass die Schaltung so funktioniert. Wenn also jemand die Zeit hat, bitte ich ihn, kurz drüber zu schauen. Wer keine Zeit hat, darf diesen Post gern ignorieren und braucht keinen "das gabs doch schon x-mal" Kommentar abgeben. Die verwendete 7 Segment Anzeigen: (die im schaltplan ist einfach irgendeine aus der eagle lbr) http://www.reichelt.de/Siebensegment-Anzeigen/SA-08-11-RT/3/index.html?&ACTION=3&LA=5&ARTICLE=31575&GROUPID=3002&artnr=SA+08-11+RT Das Datenblatt sagt: DC Forward Current 30mA Peak Forward Current 155mA (1ms Pulse Width, 1/10 Duty Cycle) Forward Voltage 1,85V Daraus meine Widerstandsberechnung: Ich hab gedacht, ich setzte 20mA als Betriebsstrom an. Ist das zu wenig? Es soll schon hell sein, aber die absolut maximum ratings will ich auch nicht erreichen. R=U/I = (5V-1,85V)/(4*20mA) = 39 Ohm (gibts sogar :D) die gemeinsame Anode der Anzeigen wird mit einem npn Transistor gesteuert. Ist das so richtig im Schaltplan? Die Zahl, die Angezeigt werden soll bekommt der Controller von einem weiteren µC über die Jumper. Der 14bit Wert wird eingelesen und 1-3 Zyklen angezeigt. Der Punkt der zweiten Stelle wird auch extern umgeschaltet. So kann die Anzeige kg (ohne Punkt) und Tonnen (mit einer Dezimalstelle) anzeigen. Programm: muss zwischen "Einzelnes Segment anschalten" und "Einzelnes Segment abschalten" ein delay? Wenn ja wie viel? Ich schätze mal nicht mehr als die 1ms aus dem Datenblatt. Vielen Dank, wenn sich jemand die Mühe macht. Gruß mklenk
Matthias Klenk schrieb: > Ich hab gedacht, ich setzte 20mA als Betriebsstrom an. Ist das zu wenig? > Es soll schon hell sein, aber die absolut maximum ratings will ich auch > nicht erreichen. Warum liest Du nicht die Beiträge, denen zu entnehmen ist, dass das so nicht geht. Der µC hat auch ein Datenblatt! Aber mehr darf ich Dir ja nicht schreiben :-(
Matthias Klenk schrieb: > R=U/I = (5V-1,85V)/(4*20mA) = 39 Ohm (gibts sogar :D) Du hast den Spannungsabfall am Emitterfolger vergessen, ca. 1V kostet der BC337. Die 1k Vorwiderstände kannst du dir in der Schaltung sparen. Mehr also 20mA bringt der AVR Ausgang auch nicht, also ist der Wunsch, die volle Helligkeit aus den Anzeigen rauszuholen in dem man IM MITTEL 20mA durchschickt, also 80mA 1/4 der Zeit, eh nicht ohne weitere 7 Treibertransistoren erreichbar. > die gemeinsame Anode der Anzeigen wird mit einem npn Transistor > gesteuert. Ist das so richtig im Schaltplan? Es ist ungewöhnlich, aber bei LEDs die nur 1.85V benötigen möglich. Meist verwendet man sättigend schaltende PNP wie BC327, die dann 140mA schalten müssten, also auch gerne 7-14mA Basistrom über einen 270-510 Ohm Vorwiderstand bei active low sehen wollen, aber das ist nicht nötig und die UBE(reverse) überschreitest du bei deinen Emitterfolgern an 5V auch nicht. Deine Schaltung spart also Widerstände, wenn du es richtig machst (siehe oben) denn 140mA*1V=0.14W steht der BC338 durch, zumal 1/4 der Zeit. > Die Zahl, die Angezeigt werden soll bekommt der Controller von einem > weiteren µC über die Jumper. Bist du ernsthaft der Meinung, daß der ATMega32 mit dem Multiplexen von 4 Ziffern vollständig ausgelastet ist ? Warum bekommen das andere so hin, daß es wnur 0.1% der Auslastung bringt ?
Bau es doch erst mal so auf, damit Du siehst, daß es nicht geht. ;-) Dann lötest Du die Transistoren aus und ersetzt sie gegen BC327, die Du allerdings um 180 Grad verdreht einsetzen mußt, damit deren Emitter an +5 Volt zu liegen kommt. MfG Paul
Wenn das ein eigenständiges ANzeige-Modul werden soll, was ja möglich ist, dann würde ich noch etwas modifizieren. PB0 ist noch frei, PC0 ist noch frei. Der Jumper, mit dem du den Dezimalpunkt steuerst kommt an den µC, an PB0. Dafür werden die Dezimalpunkte alle Anzeigen genau wie alle anderen Segmente an den µC angeschlossen - PC0 würde sich dafür anbieten. Denn: Wenn schon ein entsprechendes MOdul, dann soll das auch universell verwendbar sein. Egal wo der Dezimalpunkt dann letzten Endes hin muss. Das steuert die ansteurende Schaltung und die will ich mir nicht von vorne herein einschränken, wenn es nicht sein muss. Dann kannst du irgendwann dieses Modul zb auch per UART ansteuern und Zahlen in einem weiten Bereich anzeigen lassen. Wenn das aber sowieso kein general purpose modul werden soll, frage ich mich, was der Mega32 da soll. 4 Stück 7-Segment Anzeigen im Multiplex verbrauchen so wenig Rechenzeit, dass dir die ganze Kommunikation zwischen dem eigentlich steuernden Rechner und dem Anzeige-µC mehr Zeit kostet als das ganze Multiplexen. Das durch die Kommunikationsschicht die Programme dann auch noch komplizierter werden, erwähne ich dann auch nur nebenbei.
:
Bearbeitet durch User
Paul Baumann schrieb: > Bau es doch erst mal so auf, damit Du siehst, daß es nicht geht. > ;-) Sie geht ja! Nur die Segmentwiderstände muß man vergrößern, um die Grenzwerte des MC einzuhalten. Und die Basiswiderstände kann man weglassen.
> muss zwischen "Einzelnes Segment anschalten" und > "Einzelnes Segment abschalten" ein delay? Ja, aber ... > Wenn ja wie viel? Ich schätze mal nicht mehr als die 1ms aus > dem Datenblatt. Weniger. Weit weniger. Wenn du dich an die Reihenfolge hältst
1 | zuletzt leuchtende Stelle an PORTA abschalten |
2 | (meist ist 'alle abschalten' einfacher zu realisieren) |
3 | |
4 | nächste Stelle bestimmen |
5 | |
6 | neues Muster für die nächste Stelle an PORTC ausgeben |
7 | |
8 | diese Stelle über PORTA aktivieren |
dann hast du automatisch einen kleinen Zeitraum in dem nichts leuchtet und das reicht dann auch schon. Das das ganze über Timer und entsprechender Timer Interrupt Routine gemultipext wird, brauchen wir hier hoffentlich nicht diskutieren.
:
Bearbeitet durch User
Die Idee mit dem extra Controller für die Anzeige kommt daher: Im Hauptprogramm kann es zu längeren Unterbrechungen kommen und mit den gewünschten 80mA würde die Anzeige dann kaputt gehen. Desshalb ein extra Ic der nur das macht. Wie aber schon mehrfach bemerkt (und wirklich ein grober fehler :D) lässt der Controller gar nicht so viel Strom zu. Ich erhöhe den Widerstand auf 150 Ohm. I(LED) = (5V-1,85V)/150 Ohm = 21 Ohm. für die Anzeige also auch dauerhaft unkritisch. 8*21 = 168mA das dürfte ok sein, oder? (200mA max für µC) Also kann ich alles in einem Controller machen. Mit durchschnittlich 1/6 des max. LED Stroms muss ich dann mal schaun, ob die Helligkeit noch ausreicht. Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat. Müssen die 1k Widerstände bei den BC327 jetzt rein oder nicht?
:
Bearbeitet durch User
Matthias Klenk schrieb: > Die Idee mit dem extra Controller für die Anzeige kommt daher: Im > Hauptprogramm kann es zu längeren Unterbrechungen kommen und mit den > gewünschten 80mA würde die Anzeige dann kaputt gehen. Desshalb ein extra > Ic der nur das macht. Mit anderen Worten: Du kannst nicht programmieren. Sogar dein PC hört auf Tastendrücke obwohl er mit dem Internet redet, eine WebSeite Aufbaut, auf der Platte sucht, und Dateien kopiert. Matthias Klenk schrieb: > Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat. Was aber gar nicht nötig war, wie ich geschrieben hatte. > Müssen die 1k Widerstände bei den BC327 jetzt rein oder nicht? Sie müssen dann rein, und sie müssen niederohmiger sein, so 270-470 Ohm.
ich denke, die Berechnung der Segmentwiderstände stimmt so nicht.
Matthias Klenk schrieb
> R=U/I = (5V-1,85V)/(4*20mA) = 39 Ohm (gibts sogar :D)
Beim multiplexen ist doch immer nur eine Anzeige in Betrieb.
Ich weiß nicht, was die 4* bedeuten soll. Ich hätte es so gerechnet.
R=U/I = (5V-1,85-0,7)/20mA = 122,5 Ohm
dann könnte die Schaltung so funktionieren.
deka65
Matthias Klenk schrieb: > Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat. Und warum? Nur weil jemand die Kollektorschaltung nicht kennt?
Matthias Klenk schrieb: > Die Idee mit dem extra Controller für die Anzeige kommt daher: Im > Hauptprogramm kann es zu längeren Unterbrechungen kommen Und? Der Timer läuft weiter und löst dauern Interrupts aus, die das Multiplexing treiben. Du tauscht gerade eine relativ einfache Basistechnik gegen mehr Hardware-Aufwand aus. Meiner Meinung nach ist das nicht zielführend. Denn. Mit Timern musst du sowieso irgendwann umgehen lernen. Also warum nicht jetzt, zumal Multiplexing mit einem Timer absolut keine Hexerei ist. Das eigentliche Multiplexing funktioniert so wie immer, nur das anstelle von der Hauptschleife der Muliplexcode in einer Timer-ISR sitzt, die regelmässig aufgerufen wird. Es geht also nur darum, den Timer zu aktivieren, eine ISR zu schreiben und zu aktivieren und dort den Multiplex-Code - ein 5 Zeiler - reinzuschreiben. FAQ: Timer Dafür sparst du dir dann den ganzen Code, den du zur Kommunikation der beiden µC gebraucht hättest.
:
Bearbeitet durch User
Detlef Kahrmann schrieb: > Beim multiplexen ist doch immer nur eine Anzeige in Betrieb. > Ich weiß nicht, was die 4* bedeuten soll. Ich hätte es so gerechnet. > > R=U/I = (5V-1,85-0,7)/20mA = 122,5 Ohm > > dann könnte die Schaltung so funktionieren. Ja. Wäre aber auch sehr dunkel. Denn die LEDs einer Stelle sind ja nicht die ganze Zeit an, sondern nur 1/4 der Zeit. Eine bei 20mA normal helle LED ist dann ca nur mehr 1/4 so hell (weil sie ja nur 1/4 der Zeit leuchtet). Als Ausgleich macht man die LED in dieser Zeit heller, indem man den 4-fachen Strom durchjagt. Jetzt weißt du auch warum da eine Multiplikation mit 4 drinnen war.
:
Bearbeitet durch User
Peter Dannegger schrieb: > Nur weil jemand die Kollektorschaltung nicht kennt? Ich hab jetzt die Schaltung, wie du sie beschrieben hast, aufgebaut. (Kollektorschaltung) Der Widerstand an den LEDs ist 120 Ohm (5V-1,85V-1V)/18mA = 120 Ohm 8*18mA = 145mA Der Widerstand am der Basis ist weg. Müsste jetzt stimmen? Sowohl das segment als auch die Stelle lassen sich dann mit Ausgang auf Low setzten anschalten, oder? EDIT: den atmega8 da unten kann man sich wegdenken :D
:
Bearbeitet durch User
Karl Heinz schrieb :
> indem man den 4-fachen Strom durchjagt.
Ja aber bitte nicht 4*20 mA aus einem Portpin.
Wenn schon 80 mA dann aber aus einem Treiber.
In dem aktuellen Schaltplan finde ich solchen aber
nicht. Ergo : so funktioniert die Schaltung nicht.
deka65
Peter schrieb: >> Die Transistoren hab ich getauscht, wie Paul Baumann geschrieben hat. >Und warum? >Nur weil jemand die Kollektorschaltung nicht kennt? Kannst Du mal kurz erläutern, wer JEMAND ist? Falls Du mich damit meinst, ich weiß es! Ich weiß aber auch, daß es so, wie in der Ursprungsschaltung nicht funktioniert. Deshalb schlug ich vor, PNP-Transitoren hineinzusetzen, weil das den geringsten Aufwand in der (evtl. schon bestehenden) Schaltung bedeutet hätte. MfG Paul
Matthias Klenk schrieb: > Sowohl das segment als auch die Stelle lassen sich dann mit Ausgang auf > Low setzten anschalten, oder? Der Pin für die Stelle muss auf high gezogen werden.
Paul Baumann schrieb: > Ich weiß aber auch, daß es > so, wie in der Ursprungsschaltung nicht funktioniert Na dann warten wir mal, wie Matthias das unmögliche Möglich macht: Matthias Klenk schrieb: > Ich hab jetzt die Schaltung, wie du sie beschrieben hast, aufgebaut. > (Kollektorschaltung)
Also es funktioniert jetzt bestens mit der letzten Schaltung die ich gepostet hab.(hab nur PORT C auf B getauscht und PORTA auf PORTC) Die Helligkeit ist ausreichend. Die Lötarbeiten waren ein bisschen schwierig, weil mein Werkzeug teilweise Schrott ist :( Software schreiben war auch kein Problem, nur hatte ich am Anfang ein paar "unerklärliche Probleme". Da es mein erstes Projekt mit AtMega32 ist (sonst nur Mega8) wusste ich nicht, dass PortC (Stellen-Steuerung) auch noch irgendwas mit JTAG macht und dass ich das in den Fuses ausschalten muss. Da rätselt man erst mal warum der Ausgang macht, was er eingentlich nicht darf :D https://www.youtube.com/watch?v=Alec3yego3Q&feature=youtu.be ich hoffe, damit ist meine Ehre wieder hergestellt :D
:
Bearbeitet durch User
Matthias Klenk schrieb: > https://www.youtube.com/watch?v=Alec3yego3Q&feature=youtu.be ich hoffe, > damit ist meine Ehre wieder hergestellt :D So wie das Video aussieht, hast du ghosting drauf. Ist aber zugegebenermassen auf dem Video etwas schwer zu entscheiden. (ghosting: die Segmente, die bei einer Ziffer an einer Stelle eigentlich nicht leuchten sollen, glimmen leicht. Die sollten komplett dunkel sein - ist ein Software Fehler) Und mit einem extra Prozessor nur für das Display wird das sowieso eher nichts mit der wiederhergestellten Ehre.
:
Bearbeitet durch User
Matthias Klenk schrieb: > Ist doch jetzt ein Controller für alles OK. Das hab ich nicht so mitbekommen. In dem Fall wirds wieder was mit der Ehre :-) Im Ernst. Hast du da Ghosting drauf oder nicht? Am besten siehst du es, wenn du eine statische ANzeige machst, in der pro Stelle unterschiedliche Ziffern angezeigt werden. Also zb "1811" Die eingeschalteten Segmente der '8' scheinen bei den '1'-en durch. Entweder bei der Stelle davor oder bei der Stelle danach. Je nachdem in welcher Richtung gemultiplext wird. Im Idealfall leuchten bei den '1' jeweils nur die beiden Segmente, die die '1' bilden und die restlichen sind allesamt rabenschwarz. Es gibt allerdings auch 7-Segment-Anzeigen, bei denen die optische Trennung physikalisch zwischen den Segmenten etwas durchscheint. D.h. hier muss man zwischen 'bedingt durch die billige Anzeige' und 'tatsächlichem Programmfehler' unterscheiden. Wichtig ist die Reihenfolge, indem zuerst alle Anzeigen abgeschaltet werden und erst danach die Segmentleitungen neu bestückt werden. Nicht umgekehrt! Sonst kommt es zum Ghosting.
Also ich kann da kein Ghosting erkennen. Das ist der Code:
1 | ISR (TIMER0_OVF_vect){ |
2 | PORTB = 0xFF; // LEDs ausschalten |
3 | PORTC &= ~((1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)); // alle Ziffern abschalten |
4 | PORTB = ziffer[digits[z]]; // LEDs einschalten |
5 | // ziffern beinhaltet die LED-Beschaltung für die einzelnen Ziffern
|
6 | // digits enhält die Ziffern (1-5) der angezeigten Zahl
|
7 | PORTC |= (1<<(z+2)); // Ziffer einschalten |
8 | z++; |
9 | if (z>4) z=0; |
10 | }
|
Matthias Klenk schrieb: > Also ich kann da kein Ghosting erkennen. Alles klar. Dann hat das am Video nur so ausgesehen. Wollte nur sicher gehen, weil es sonst unschön aussieht. Der Code an sich ist in dieser Hinsicht in Ordnung.
:
Bearbeitet durch User
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.