www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Multiplexanzeige


Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm npn Transistoren in Kollektorschaltung ohne Basiswiderstand.

Die Emitterschaltung hat ne Verögerung:

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



Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK alle unwichtigen Teile rauslöscht.
.include "tn26def.inc"        ; Deklarationen für ATtiny26

.def  dig1 = R16          ; Speicherplätze für Ziffern
.def  dig2 = R17
.def  dig3 = R18
.def  dig4 = R19

.equ  digport = PORTA        ; Datenport
.equ  digddr = DDRA

.equ  s_port = PORTB        ; Steuerport
.equ  s_ddr = DDRB

.equ  s_dig1 = 3          ; Portbits der Anzeigen
.equ  s_dig2 = 4
.equ  s_dig3 = 5
.equ  s_dig4 = 6


.cseg                ; Programm-Flash
    rjmp  init        ; Reset-Einsprung

.org  0x00C            ; Interrupteinsprünge übergehen

init:  ldi    R16, RAMEND      ; Stapel anlegen
    out    SP, R16

    ldi    R16, 0b11111111    ; Steuerport als Ausgang
    out    digddr, R16

    ; Entsprechende Pins des Steuerports als Ausgang
    ldi    R16, (1 << s_dig1 | 1 << s_dig2 | 1 << s_dig3 | 1 << s_dig4)
    out    s_ddr, R16


    clr    dig1        ; Zu benutzende Register leeren
    clr    dig2
    clr    dig3
    clr    dig4

    ldi    dig3, 255      ; Testanzeige


/************************************************************************/
/*          Ausgabe durch Multiplexingverfahren          */
/************************************************************************/

; Ausgabe Ziffer 1
loop:  out    digport, dig1    ; Segmente stellen
    sbi    s_port,  s_dig1    ; Anzeige anschalten

    rcall  wait        ; Warten

    cbi    s_port, s_dig1    ; Anzeige ausschalten


; Ausgabe Ziffer 2
    out    digport, dig2    ; Segmente stellen
    sbi    s_port,  s_dig2    ; Anzeige anschalten

    rcall  wait        ; Warten

    cbi    s_port, s_dig2    ; Anzeige ausschalten


; Ausgabe Ziffer 3
    out    digport, dig3    ; Segmente stellen
    sbi    s_port,  s_dig3    ; Anzeige anschalten

    rcall  wait        ; Warten

    cbi    s_port, s_dig3    ; Anzeige ausschalten

; 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

    rjmp  loop        ; Endlosschleife



/************************************************************************/
/*              Warteschleife                */
/************************************************************************/

wait:  push  R16          ; Register retten
    push  R17

    ldi    R16, 1        ; Wartezeit

wait1:  ldi    R17, 255      ; Äussere Warteschleife

wait2:  dec    R17        ; Innere Warteschleife
    brne  wait2

    dec    R16
    brne  wait1

    pop    R17          ; Register wiederherstellen
    pop    R16

    ret              ; Kehre zurück

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das Timing.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.