Hallo Leute!
Ich habe ein kleines Problemchen.
Im angehängten Bild seht ihr meine Schaltung. Das selbst erstellte
Bauteil ist eine 4x 7-Segment-Anzeige, welche gemultiplext wird. Dazu
kommen noch zwei LEDs und zwei Ausgänge. Die Ausgänge sind egal. Problem
habe ich hauptsächlich mit den LEDs.
Die Anzeige und die LEDs werden 1/6 gemultiplext. 1/6, weil die Anzeige
vier Stellen hat und dazu noch extra Punkte, welche z.B. ein °
darstellen können. Die Anzeige hat also insgesamt 5 Anoden, dazu noch
die Anoden der LEDs.
Also schalte ich nacheinander durch: Stelle 1, 2, 3, 4, Punkte, LEDs.
Das Problem ist jetzt, dass die LEDs leicht mitzuleuchten scheinen. Das
tun sie aber nur, wenn eben auch das entsprechende Segment, mit denen
sie sich die Kathode teilen, an ist. Zeitgleich sind die Anoden aber
nicht an! Es scheint vielmehr so, als wenn das umschalten der Anoden und
Kathoden nicht zeitgleich erfolgt.
Vermutung: Segment (Kathode Stelle und LED) war bei Stelle an, jetzt
wird auf LED umgeschaltet und die Anode der LED ist schon an, während
die Kathode noch nicht vollständig umgeschaltet ist. Oder andersherum:
Kathoden sind schon umgeschaltet, aber der Transistor schaltet nicht
schnell genug aus.
Ähnlich ist es auch mit den Punkten, da aber nicht so stark.
Weiß jemand, ob es daran liegen könnte?
Alles mit einem Oszi prüfen.
Um ein Ausschalten der Transistoren sicher zu stellen noch zusätzlich
eine Widerstand (10k) von den Basen gegen 5V einbauen.
Joe
Ersan schrieb:> Das Problem ist jetzt, dass die LEDs leicht mitzuleuchten scheinen. Das> tun sie aber nur, wenn eben auch das entsprechende Segment, mit denen> sie sich die Kathode teilen, an ist. Zeitgleich sind die Anoden aber> nicht an! Es scheint vielmehr so, als wenn das umschalten der Anoden und> Kathoden nicht zeitgleich erfolgt.
Das wird auch nie zeitgleich erfolgen.
Der Trick besteht darin, dass du im Multiplexcode als allererstes erst
mal eine Anzeigestelle dunkel schaltest, in dem du alle
Anodentransistoren sperrst.
Danach tust du alles was du brauchst um das Muster für das nächste
Segment zu bestimmen und an die Kathoden auszugeben.
Und erst dann aktivierst du diese Stelle durch einschalten des richtigen
Anoden Transistors.
> Weiß jemand, ob es daran liegen könnte?
Es liegt in deiner Programmierung. Es ist ein reines
Reihenfolgenproblem, in welcher Reihenfolge du welche Aktionen machst
und welche Aktionen du vermeintlich glaubtest einsparen zu können.
Karl Heinz Buchegger schrieb:> Der Trick besteht darin, dass du im Multiplexcode als allererstes erst> mal eine Anzeigestelle dunkel schaltest, in dem du alle> Anodentransistoren sperrst.
OK, das kann ich natürlich machen. Heißt bei mir aber, dass ich extra
nochmal 16 Bit reintakten muss, nur um die Anzeigen dunkel zu schalten.
Sollte ich dass dann stets vor dem neuen Ausgeben der Daten machen? Also
quasi stets 32 bit hinschicken?
Karl Heinz Buchegger schrieb:> Es liegt in deiner Programmierung.
Das wäre natürlich prima, wenn es dadurch zu beheben ist. Ohne jetzt
längere Dunkelphasen erzeugen zu müssen. Wenn ich beispielsweise immer
eine Dunkelphase mit einbauen würde, dann würde sich die "Ein"-Zeit ja
noch halbieren. Das ist ja auch nicht Sinn der Sache.
Also immer 32 bit senden scheint mir da sinnvoller. Die Anoden kann ich
so ja nicht abschalten.
Die Transistoren schalten zu langsam ab, das ist richtig.
Probiere doch mal den Spannungsteiler mit 10k gegen +5V. Das reduziert
auch die verbleibende Ladung auf der Basis und führt zu einem
schnelleren Abschalten.
Joe
Ersan schrieb:> OK, das kann ich natürlich machen. Heißt bei mir aber, dass ich extra> nochmal 16 Bit reintakten muss, nur um die Anzeigen dunkel zu schalten.> Sollte ich dass dann stets vor dem neuen Ausgeben der Daten machen? Also> quasi stets 32 bit hinschicken?
Darauf läufts bei deinem Hardwrae aufbau hinaus.
>> Es liegt in deiner Programmierung.>> Das wäre natürlich prima, wenn es dadurch zu beheben ist.
Da habe ich jetzt allerdings dein Oszi Bild noch nicht gesehen. Die
fallenden Flanken sind in der Tat sehr lang.
Peter Dannegger schrieb:> Nimm für T1..6 NPNs in Kollektorschaltung.
OK, einen Basiswiderstand brauche ich dann nicht? Stellt der Strom
dadurch dann automatisch ein? Dann hätte ich ca. 4,3V am Emitter
anliegen, richtig? Ist der Basisstrom dann automatisch genau so hoch,
wie der Strom im Kollektor-Emitter-Zweig / Verstärkungsfaktor?
Karl Heinz Buchegger schrieb:> Da habe ich jetzt allerdings dein Oszi Bild noch nicht gesehen. Die> fallenden Flanken sind in der Tat sehr lang.
Für das Tutorial hab ich BC328 eingesetzt mit 1k Basiswiderstand. Selbst
bei Full-Speed Multiplexen gab es da kein Geisterleuchten.
AVR-Tutorial: 7-Segment-Anzeige
Ich wollte mit mode_counter == 0 erstmal alle Anoden im SR ausschalten
und dann im zweiten Druchgang, wo mode_counter dann 1 ist, die richtigen
Daten.
Aber der Compiler geht zweimal in den else-Zweig bei
mode_counter-Abfrage. Compiler ist CCS.
Ersan schrieb:> Aber der Compiler geht zweimal in den else-Zweig bei> mode_counter-Abfrage. Compiler ist CCS.
Da wird dir wohl der Optimizer einen Streich gespielt haben und die
beiden Zweige weitgehend zusammengezogen haben. Sind ja auch weitgehed
gleich, lediglich im einen Fall wird noch ANODE_MATRIX eingeodert.
Ersan schrieb:> So, also ich werde jetzt 32Bit senden.
Wäre bei Kollektorschaltung nicht nötig, die ist fix genug auch ohne
Pause. Da kannst Du Segmente und Digit gleichzeitig ändern.
Peter
Karl Heinz Buchegger schrieb:> Da wird dir wohl der Optimizer einen Streich gespielt haben und die> beiden Zweige weitgehend zusammengezogen haben.
Ok, hab grad mal die Optimierungen ausgeschaltet, dann geht er rein.
Karl Heinz Buchegger schrieb:> Sind ja auch weitgehed> gleich, lediglich im einen Fall wird noch ANODE_MATRIX eingeodert
Aber dann sind sie doch nicht gleich. Wenn der sowas wegoptimiert, dann
funktioniert doch mein Programm nicht mehr??!!
Ersan schrieb:> Aber dann sind sie doch nicht gleich. Wenn der sowas wegoptimiert, dann> funktioniert doch mein Programm nicht mehr??!!
Der optimiert es ja nicht 'weg'!
Der optimiert es nur so, dass der entstehende Code eben keine 1:1
Entsprechung mehr mit deinem C-Code hat. Funktional kommt dasselbe raus.
Heisst: Dein Programm macht schon noch das, was du hingeschrieben hast.
Nur macht es das eben ein wenig anders (schneller) als so wie du das
hingeschrieben hast. Sonst bräuchte man ja keinen Optimizer, wenn dann
sowieso wieder dasselbe rauskommen soll, wie du das hingeschrieben hast.
Karl Heinz Buchegger schrieb:> Im übrigen hätte ich das gar nicht so gemacht
OK, das sieht natürlich besser aus.
Peter Dannegger schrieb:> Wäre bei Kollektorschaltung nicht nötig, die ist fix genug auch ohne> Pause
Ja, dann muss ich wohl umbauen...habe es schon gelötet. Trotzdem werde
ich jetzt erstmal das Resultat der Dunkelzeit abwarten...
Karl Heinz Buchegger schrieb:> Nur macht es das eben ein wenig anders (schneller) als so wie du das> hingeschrieben hast.
Also kann ich das dann nur nicht mehr debuggen, aber es bleibt von der
Funktion her gleich?
Karl Heinz Buchegger schrieb:> Aber hör auf Peter. Der hat von Hardware mehr Ahnung als ich.
Ja, ich nehme mir das auf jeden Fall auch zu Herzen. Kann mir denn dann
nochmal jemand das hier erklären:
Ersan schrieb:> OK, einen Basiswiderstand brauche ich dann nicht? Stellt der Strom> dadurch dann automatisch ein? Dann hätte ich ca. 4,3V am Emitter> anliegen, richtig? Ist der Basisstrom dann automatisch genau so hoch,> wie der Strom im Kollektor-Emitter-Zweig / Verstärkungsfaktor?
Ersan schrieb:> Stellt der Strom>> dadurch dann automatisch ein? Dann hätte ich ca. 4,3V am Emitter>> anliegen, richtig? Ist der Basisstrom dann automatisch genau so hoch,>> wie der Strom im Kollektor-Emitter-Zweig / Verstärkungsfaktor?
3 * Ja.
Peter
Peter Dannegger schrieb:> 3 * Ja.
Vielen Dank!
Also das Ergebnis: Es leuchtet trotzdem noch nach, auch wenn ich erst
alles einmal dunkel schalte. Jetzt kommen die NPN-Transistoren ;-) Mal
sehen
Peter Dannegger schrieb:> Welche Multiplexfrequenz hast Du?
Ich muss die Multiplexfrequenz von einem Timer ableiten, der mir eine
Hardware-PWM macht. Die ist wichtiger, als die Anzeige. Also kann ich
dafür nur den Overflow-Interrupt nehmen. Daraus resultiert eine Frequenz
pro Stelle von 54Hz.
Klaus 2m5 schrieb:> Dein Scope-Bild sagt aber 440µs, also etwas über 2 kHz.
Das stimmt. Aber da ist auch kein Programm am laufen, sondern in der
main wird nur ständig die Anzeige aktualisiert. Aber es macht auch
keinen Unterschied, ob es (wie jetzt gerade) mit Timer läuft, oder eben
nur in der main. Das ungewünschte Leuchten bleibt.
Die LEDs glimmen nicht, wenn das Segment bei der vorherigen Stelle nicht
an gewesen ist. Es liegt also auf jeden Fall daran. Nur es ändert leider
auch nichts, wenn ich beispielsweise mehrere male hintereinander alles
lösche um die Zeit zu verzögern.
Ersan schrieb:> Hat jemand von euch vielleicht die Nerven, mir kurz zu erklären, warum> das so ist? Also weshalb NPN und PNP sich so anders verhalten?
Das liegt vielleicht daran, dass in Kollektorschaltung der Transistor
nicht in die Sättigung kommt, in Emitterschaltung aber schon.
Wenn das Scopebild also nicht den "echten" Betrieb darstellt, hat es
auch keinerlei Aussagekraft. Wahrscheinlich war auch keins der Segmente
von der anderen Seite angesteuert? Wie soll sich da die parasitäre
Kapazität entladen?
Wer misst, misst Mist, so auch hier.