Problem mit Multiplexanzeige

OP #645597
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
#645613
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
OP #645622
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
#645633
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
Gast #645647
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!
OP #645655
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
#645661
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 !
Gast #645668
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.
#645670
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
#645673
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
OP #645687
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
#645698
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
Angehängte Dateien:
#645708
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
#645718
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
#645720
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...
OP #645723
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.
#645729
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
Gast #645730
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.
OP #645760
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 ;-)
#645777
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...
#645840
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren