Forum: Mikrocontroller und Digitale Elektronik Problem mit Multiplexanzeige


von Paul H. (powl)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Nimm npn Transistoren in Kollektorschaltung ohne Basiswiderstand.

Die Emitterschaltung hat ne Verögerung:

http://de.wikipedia.org/wiki/Millereffekt



Peter

von Falk B. (falk)


Lesenswert?

@ 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

von Paul H. (powl)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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!

von Paul H. (powl)


Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

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 !

von crazy horse (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Falk B. (falk)


Lesenswert?

@ 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

von Paul H. (powl)


Lesenswert?

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

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ 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

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier das Timing.

von Falk B. (falk)


Lesenswert?

@ 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

von crazy horse (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Benedikt K. (benedikt)


Lesenswert?

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...

von Paul H. (powl)


Lesenswert?

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.

von crazy horse (Gast)


Lesenswert?

und jetzt mach es noch richtig, per Timerinterrupt. Dann ist alles gut 
:-)

von Falk B. (falk)


Lesenswert?

@ 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

von crazy horse (Gast)


Lesenswert?

"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.

von Paul H. (powl)


Lesenswert?

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 ;-)

von Benedikt K. (benedikt)


Lesenswert?

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...

von Falk B. (falk)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.