Hi. Von meinem AVR lasse ich 4 7-Segment-Anzeigen im Multiplexbetrieb laufen. Sie haben eine gemeinsame Kathode. Die 4 Anoden liegen über PNP-Transistoren am Port B meins ATtiny die jeweils mit 1kOhm basiswiderstand durchgesteuert werden. Die 8 Kathoden hängen über jeweils einen 470 Ohm Vorwiderstand direkt am Port A. Die einzelnen Anzeigen habe ich mit Sekundenkleber zusammengebappt und hinten die jeweiligen Kathoden miteinander verbunden sowie ca. 10cm lange Litze mit Stecker angelötet. Nun ist mir aufgefallen dass alles was ich auf der (n)-ten Stelle anzeigen lasse auch von Links gesehen auf der (n-1)-ten Stelle noch dunkel zu sehen ist. D.h. wenn ich auf der 2. Anzeige von Links gesehen eine 2 ausgebe dann erscheint diese auf der 1. Anzeige auch, aber nur sehr sehr schwach. Das ist nicht der Weltuntegang aber störend und ich will als Perfektionist natürlich zumindest mal die Ursache dieses Problems haben :-) Das Programm läuft so ab: Die Bitinformationen für die jeweilige Anzeige liegen in 4 Registern. dig1, dig2, dig3, dig4. dig1 an Port A ausgeben PortB 0 anschalten Millisekunde warten PortB 0 ausschalten dig2 an Port A ausgeben PortB 1 anschalten Millisek....... ...... und so weiter. Hier kann der Wurm eigentlich nicht liegen da jede Anzeige nur genau das krigt was sie auch kriegen soll.. mfg PoWl
Nimm npn Transistoren in Kollektorschaltung ohne Basiswiderstand. Die Emitterschaltung hat ne Verögerung: http://de.wikipedia.org/wiki/Millereffekt Peter
@ Peter Dannegger (peda) >Nimm npn Transistoren in Kollektorschaltung ohne Basiswiderstand. >Die Emitterschaltung hat ne Verögerung: So ein Quark. Wir reden doch nicht über Schaltzeiten im Nanosekundenbereich. Für so ein "Zeitlupenschaltung" tuts die Emitterschaltung problemlos. @ Paul Hamacher (powl) Poste mal deinen Sourcecode als Anhang. MFG Falk
OK alle unwichtigen Teile rauslöscht.
1 | .include "tn26def.inc" ; Deklarationen für ATtiny26 |
2 | |
3 | .def dig1 = R16 ; Speicherplätze für Ziffern |
4 | .def dig2 = R17 |
5 | .def dig3 = R18 |
6 | .def dig4 = R19 |
7 | |
8 | .equ digport = PORTA ; Datenport |
9 | .equ digddr = DDRA |
10 | |
11 | .equ s_port = PORTB ; Steuerport |
12 | .equ s_ddr = DDRB |
13 | |
14 | .equ s_dig1 = 3 ; Portbits der Anzeigen |
15 | .equ s_dig2 = 4 |
16 | .equ s_dig3 = 5 |
17 | .equ s_dig4 = 6 |
18 | |
19 | |
20 | .cseg ; Programm-Flash |
21 | rjmp init ; Reset-Einsprung |
22 | |
23 | .org 0x00C ; Interrupteinsprünge übergehen |
24 | |
25 | init: ldi R16, RAMEND ; Stapel anlegen |
26 | out SP, R16 |
27 | |
28 | ldi R16, 0b11111111 ; Steuerport als Ausgang |
29 | out digddr, R16 |
30 | |
31 | ; Entsprechende Pins des Steuerports als Ausgang |
32 | ldi R16, (1 << s_dig1 | 1 << s_dig2 | 1 << s_dig3 | 1 << s_dig4) |
33 | out s_ddr, R16 |
34 | |
35 | |
36 | clr dig1 ; Zu benutzende Register leeren |
37 | clr dig2 |
38 | clr dig3 |
39 | clr dig4 |
40 | |
41 | ldi dig3, 255 ; Testanzeige |
42 | |
43 | |
44 | /************************************************************************/ |
45 | /* Ausgabe durch Multiplexingverfahren */ |
46 | /************************************************************************/ |
47 | |
48 | ; Ausgabe Ziffer 1 |
49 | loop: out digport, dig1 ; Segmente stellen |
50 | sbi s_port, s_dig1 ; Anzeige anschalten |
51 | |
52 | rcall wait ; Warten |
53 | |
54 | cbi s_port, s_dig1 ; Anzeige ausschalten |
55 | |
56 | |
57 | ; Ausgabe Ziffer 2 |
58 | out digport, dig2 ; Segmente stellen |
59 | sbi s_port, s_dig2 ; Anzeige anschalten |
60 | |
61 | rcall wait ; Warten |
62 | |
63 | cbi s_port, s_dig2 ; Anzeige ausschalten |
64 | |
65 | |
66 | ; Ausgabe Ziffer 3 |
67 | out digport, dig3 ; Segmente stellen |
68 | sbi s_port, s_dig3 ; Anzeige anschalten |
69 | |
70 | rcall wait ; Warten |
71 | |
72 | cbi s_port, s_dig3 ; Anzeige ausschalten |
73 | |
74 | ; Ausgabe Ziffer 4 |
75 | out digport, dig4 ; Segmente stellen |
76 | sbi s_port, s_dig4 ; Anzeige anschalten |
77 | |
78 | rcall wait ; Warten |
79 | |
80 | cbi s_port, s_dig4 ; Anzeige ausschalten |
81 | |
82 | rjmp loop ; Endlosschleife |
83 | |
84 | |
85 | |
86 | /************************************************************************/ |
87 | /* Warteschleife */ |
88 | /************************************************************************/ |
89 | |
90 | wait: push R16 ; Register retten |
91 | push R17 |
92 | |
93 | ldi R16, 1 ; Wartezeit |
94 | |
95 | wait1: ldi R17, 255 ; Äussere Warteschleife |
96 | |
97 | wait2: dec R17 ; Innere Warteschleife |
98 | brne wait2 |
99 | |
100 | dec R16 |
101 | brne wait1 |
102 | |
103 | pop R17 ; Register wiederherstellen |
104 | pop R16 |
105 | |
106 | ret ; Kehre zurück |
Falk Brunner wrote: > So ein Quark. Wir reden doch nicht über Schaltzeiten im > Nanosekundenbereich. Für so ein "Zeitlupenschaltung" tuts die > Emitterschaltung problemlos. Selber Quark. Probiers doch erstmal aus, ehe Du falsche Sachen behauptest. Ohne Basisentladewiderstand ist ein total übersteuerter Transistor schon im kHz Bereich am Ende. Früher hat man für Transistorlogik sogar ne negative Hilfsspannung benutzt, um die Basis schneller zu entladen. Wenn man aber die Inverterfunktion nicht braucht, sondern nur die Stromverstärkung, ist eine Kollektorstufe wesentlich besser geeignet. Ich hab jetzt das Delay nicht nachgerechnet, obs wirklich 1ms ist oder viel schneller. Multiplexen mit Delay ist eh Murx. Peter
naja, glättet mal die Wogen :-) Sicher ist die Kollektorschaltung schneller, und nebenbei spart man auch noch den Basiswiderstand. Trotzdem funktioniert es auch mit pnp/Emitterschaltung bestens und ohne Mitleuchten, wenn das Timing stimmt. Ich habe beides im Einsatz. ; Ausgabe Ziffer 4 out digport, dig4 ; Segmente stellen sbi s_port, s_dig4 ; Anzeige anschalten rcall wait ; Warten cbi s_port, s_dig4 ; Anzeige ausschalten die pnp-Transistoren schalten die jeweilige Anzeige mit L-Pegel ein!
Tut mir leid ich glaube ich habe mich total verlabert. Wie ich schon am Anfang richtig gesagt habe sind es Anzeigen mit gemeinsamer Kathode. Demnach habe ich die 4 Kathoden auch an jeweils einem NPN-Transistor hängen ;-) Hab mich selbst etwas verwirrt da ich hier auch Anzeigen mit gemeinsamer Anode rumliegen hab und die mir noch im Kopf rumschwirren. Die Kollektor-Schaltung werde ich irgendwann demnächst gerne mal ausprobieren, schade nur dass ich das jetzt schon fertig gelötet aufgebaut hab^^ Danke für den Tipp. Ist die Emitterschaltung so lahm? Ich glaube als Basiswiderstand benutze ich 1 kOhm wobei 10kOhm vielleicht auch gehen würden.. d.h. der Fehler liegt im Miller-effekt? mfg Paul Hamacher
Peter Dannegger wrote: > Ohne Basisentladewiderstand ist ein total übersteuerter Transistor schon > im kHz Bereich am Ende. > Früher hat man für Transistorlogik sogar ne negative Hilfsspannung > benutzt, um die Basis schneller zu entladen. Dem kann ich voll zustimmen ! Kleinsignaltransistoren haben Schaltzeiten von einigen 100ns bis wenige µs. Ich mache bei Multiplexroutinen folgendes: Transistor aus Segmentdaten ausgeben Nächste Stelle berechnen Nächster Transistor an > Wenn man aber die Inverterfunktion nicht braucht, sondern nur die > Stromverstärkung, ist eine Kollektorstufe wesentlich besser geeignet. Allerdings gehen dann fast 1V verloren, was bei niedrigen Spannung und oder blauen/superhellen grünen LEDs dazu führt, dass die Spannung nicht ausreicht. Meine Faustregel: Habe ich genügend Spannung zum verbraten und/oder sollte das Signal so wenig wie möglich belastet werden, dann eine Kollektorstufe. @ Paul Das Multiplexing macht man in einem Timer Interrupt !
timer0_int: in sreg_bak, sreg sbi PORTD, a_msb sbi PORTD, a_lsb sbi PORTD, a_nsb inc int_count cpi int_count, 1 breq disp_lsb cpi int_count, 2 breq disp_nsb rjmp disp_msb disp_lsb: out PORTB, lsb cbi PORTD,a_lsb rjmp end_t0 disp_nsb: out PORTB, nsb cbi PORTD, a_nsb rjmp end_t0 disp_msb: out PORTB, msb cbi PORTD, a_msb clr int_count end_t0: out sreg, sreg_bak reti Hier mal ein Stückchen Assembler (90S1200), erst alle Digits ausschalten. Dann leuchtet auch nichts mit.
@ Paul Hamacher (powl) >Von meinem AVR lasse ich 4 7-Segment-Anzeigen im Multiplexbetrieb >laufen. Sie haben eine gemeinsame Kathode. Die 4 Anoden liegen über >PNP-Transistoren am Port B meins ATtiny die jeweils mit 1kOhm >basiswiderstand durchgesteuert werden. Die 8 Kathoden hängen über >jeweils einen 470 Ohm Vorwiderstand direkt am Port A. Die einzelnen Moment, da stimmt was nicht. Wenn du gemeinsame KATHODEN hast, dann hast du nur 4 davon. Und diese dürfen NICHT per Widerstand an Masse geschaltet werden. Die Widerstände müssen an die Anoden. Was hast du denn nun wirklich? Und wenn du scho die Sparvariante anwendest (ohne Leistungstreiber), dann nimm bitte den Transistor für die gemeinsamen Kathoden, denn hier fliesst der bis zu 8-fache Strom. Und dafür ist ein NPN das Mittel der Wahl. LED-Matrix Mit welchem Takt läuft den dein Controller?. Deine Sequenz ist ja recht schnell. cbi s_port, s_dig1 ; Anzeige ausschalten out digport, dig2 ; Segmente stellen sbi s_port, s_dig2 ; Anzeige anschalten MFG Falk
@ Benedikt K. (benedikt) >Dem kann ich voll zustimmen ! Kleinsignaltransistoren haben Schaltzeiten >von einigen 100ns bis wenige µs. So ein Quark! Die 0815 Transitoren ala BC337 & Co haben Transitfreqenzen um die 100 MHz!!! Wenn man die natürlich total untauglich ansteuert ist das was anderes. MfG Falk
nochmals ein hinweis auf meine verlaberei: ja ich habe 4 Kathoden welche ich mit NPN transistorenin emitterschaltung ansteuere. Sry ;-) Die Transistoren sind BC 547. Basiswiderstand wie gesagt 1kOhm. Hätte ich ein Steckboard frei würd ich die Kollektorschaltung mal ausprobieren. mfg PoWl
@ Peter Dannegger (peda) >Probiers doch erstmal aus, ehe Du falsche Sachen behauptest. Das habe ich, mehr als genug. >Ohne Basisentladewiderstand ist ein total übersteuerter Transistor schon >im kHz Bereich am Ende. Mit wieviel Megaohm Basiswiderstand steuerst du den denn an? Ich habs mal kurz simuliert (hier kann man Pspice schon gut vertrauen). PNP mit 4k7 Basiswiderstand, angesteuert von 5V Quelle, Lastwiderstand 100 Ohm, Betriebsspannung 5V. So direkt hat die Schaltung ca. 500ns Speicherzeit! Eine Ewigkeit, klar dass da ncoh was nachleuchtet. Aber ein kleiner Kondensator von 100pF parallel zum Basiswiderstand bringt die erhoffte Lösung, fast keine Speicherzeit mehr, Schaltzeit ca. 10ns. Eh voila! >Früher hat man für Transistorlogik sogar ne negative Hilfsspannung >benutzt, um die Basis schneller zu entladen. Sicher, und dabei kommt amn auf Schaltzeiten im Nanosekundenbereich. >Wenn man aber die Inverterfunktion nicht braucht, sondern nur die >Stromverstärkung, ist eine Kollektorstufe wesentlich besser geeignet. Wenn man statt ~300mV mit ~700mV Spannungsabfall leben kann vielleicht. MFG Falk
@ Paul Hamacher (powl)
>Die Transistoren sind BC 547. Basiswiderstand wie gesagt 1kOhm. Hätte
Dann nimm mal 4,7K und mach 100pF parallel dazu. Denn in der jetzigen
Konstellation ist deine Schaltung zu langsam, die Speicherzeit von
~500ns führt zum verwischen der Anzeige. Oder mach eine kleine
Verzögerung NACH dem Auschalten der aktuellen Stelle, ca. 1us.
MFG
Falk
100pF parallel - ich fasse es nicht. Technisch gesehen hast du Recht, aber der MC macht doch sowieso nichts anderes als warten, also kann man auch die Wartezeiten ein wenig aufteilen.
@ crazy horse (Gast)
>100pF parallel - ich fasse es nicht.
Was ist daran unfassbar? Das ist die übliche Vorgehensweise, um diese
Schaltung schneller ausschalten zu lassen. Und wenn der OP irgendwann
mal eine gescheite Multiplexanzeige per Timerinterrupt macht, will er
sicher nicht sinnlos warten.
MfG
Falk
Falk Brunner wrote: > @ Benedikt K. (benedikt) > >>Dem kann ich voll zustimmen ! Kleinsignaltransistoren haben Schaltzeiten >>von einigen 100ns bis wenige µs. > > So ein Quark! Die 0815 Transitoren ala BC337 & Co haben Transitfreqenzen > um die 100 MHz!!! > Wenn man die natürlich total untauglich ansteuert ist das was anderes. > Ich habs mal kurz simuliert (hier kann man Pspice schon gut vertrauen). > > PNP mit 4k7 Basiswiderstand, angesteuert von 5V Quelle, Lastwiderstand > 100 Ohm, Betriebsspannung 5V. > So direkt hat die Schaltung ca. 500ns Speicherzeit! Eine Ewigkeit, klar Irgendwie widersprichst du dir gerade selbst, merkst du das ? Und seien wir mal ehrlich: Wer baut schon bei kleinen LED Multiplex Anzeigen Kapazitäten parallel zu den Basiswiderständen, die dazu noch das EMV Verhalten negativ beeinlussen ? Da nimmt man doch lieben die 500ns in Kauf...
Genial Leute!!! Tatsächlich, da scheint eine gewisse Kapazität bei den Transistoren im Spiel zu sein. Ein einzelnes nop hinter jedem cbi-Befehl hat abhilfe geschaffen :-) Danke! :-) Sollte man fast ins Tutorial aufnehmen. Das Problem haben sicher noch mehrere Leute. mfg Paul H.
und jetzt mach es noch richtig, per Timerinterrupt. Dann ist alles gut :-)
@ Benedikt K. (benedikt) >Irgendwie widersprichst du dir gerade selbst, merkst du das ? Nein, ich widerspreche mir nicht. Es wurde von dir und Peter die allgemeine Aussage getroffen, das die Transistoren in Emitterschaltung zu langsam seien. Dem habe ich widersprochen. Denn bei RICHTIGER Ansteuerung sind die verdammt schnell, Schaltzeiten von 20ns sind da kein grosses Problem. >Und seien wir mal ehrlich: Wer baut schon bei kleinen LED Multiplex >Anzeigen Kapazitäten parallel zu den Basiswiderständen, die dazu noch >das EMV Verhalten negativ beeinlussen ? Welches EMV-Verhalten? Welchen Bastler interessiert EMV? > Da nimmt man doch lieben die >500ns in Kauf... Nö. Mfg Falk
"gescheite Multiplexanzeige per Timerinterrupt macht, will er sicher nicht sinnlos warten." Das ist eben dein Trugschluss, er braucht nicht sinnlos warten. Allein die zeitlich richtige Anordnung der Befehle reicht aus.
Naja ein Timerinterrupt ist hier möglich aber unnötig da mein Prozessor sonst ausser dem Multiplexbetrieb nichts zu tun hat :-) Ist ein 7-Segment-Anzeigen Treiber den man per I²C steuern kann. Ausserdem kann ich die Wartezeit bzw. Multiplexfrequenz zu Demonstrationszwecken einfach beliebig erhöhen ;-)
Falk Brunner wrote: > Es wurde von dir und Peter die allgemeine Aussage getroffen, das die > Transistoren in Emitterschaltung zu langsam seien. Dem habe ich > widersprochen. Denn bei RICHTIGER Ansteuerung sind die verdammt schnell, > Schaltzeiten von 20ns sind da kein grosses Problem. Wobei es eben aber unnötig ist. Ich kaufe mir auch kein Auto mit 1000PS, nur um Brötchen zu holen. Ob das Auto jetzt 1s von 0-50km/h oder 10s braucht, ist egal. >>Und seien wir mal ehrlich: Wer baut schon bei kleinen LED Multiplex >>Anzeigen Kapazitäten parallel zu den Basiswiderständen, die dazu noch >>das EMV Verhalten negativ beeinlussen ? > > Welches EMV-Verhalten? Welchen Bastler interessiert EMV? Super Einstellung. Ich hoffe die RegTP kommt mal bei dir vorbei und nimmt alles mit ! Wenn z.B. ein DCF77 Empfänger drang hängt, dann interessiert es schon wie stark die Störungen sind...
@ Benedikt K. (benedikt) >Wobei es eben aber unnötig ist. Ich kaufe mir auch kein Auto mit 1000PS, >nur um Brötchen zu holen. Ob das Auto jetzt 1s von 0-50km/h oder 10s >braucht, ist egal. Jaja, Schwarz-Weiss Malerei, immer wiederbeliebt. >> Welches EMV-Verhalten? Welchen Bastler interessiert EMV? >Super Einstellung. Ich hoffe die RegTP kommt mal bei dir vorbei und >nimmt alles mit ! Ohhh, ich zittere! >Wenn z.B. ein DCF77 Empfänger drang hängt, dann interessiert es schon >wie stark die Störungen sind... Welche Störungen? Der Transistor schaltet mit und ohne C gleich schnell (Anstiegs-und Abfallzeit), nur eben ohne c verzögert. MfG Falk
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.