www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3-stellige 7-Segmentanzeige, MUX Problem (Transistor)


Autor: Oliver Keller (0x2142)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,


ich versuche grad, Assembler auf PICs zu lernen (Anfänger in Sachen 
Elektronik + uC) und möchte jetzt nach den ersten Tutorials eine 
dreistellige 7-Segment-Anzeige zu steuern.

Das Dekodieren klappt soweit ganz gut, das Multiplexen auch und solange 
ich die 3 Anzeigen direkt an den Ausgang des PIC anschließe, macht die 
Schaltung genau was sie soll (Segmente/Anoden an RB0-7, gemeinsame 
Kathoden an RA0-2).

Jetzt möchte ich die Anzeigen aber über einen Transistor ansteuern (für 
Folgeprojekte) und da fangen die Probleme an:

Das Programm läuft zwar, aber die Anzeigen leuchten fast gar nicht, man 
kann´s grad so erkennen. Meine Idee war, eine Emitterschaltung mit je 
einem BC337 zu bauen, d.h. Pinout über Widerstand an die Basis, 
gemeinsame Kathode der Anzeigen an den Collector und den Emitter auf 
Masse.

Kann es sein, dass der Transistor zu träge ist, um das Multiplexen 
mitzumachen ? Momentan passiert das nämlich mit 6 Instruktionen, der PIC 
läuft mit 20Mhz, also effektiv 5 MHz. Oder liegt das Problem ganz wo 
anders ?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die Ansteueuerung auch invertiert?
(1-Pegel schaltet den Transistor ein)

Otto

Autor: Oliver Keller (0x2142)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

die 3 Kathoden werden mit 6 Befehlen an- und ausgeschaltet, also

RA0 1
RA0 0
RA1 1
RA1 0
RA2 1
RA2 0

(klar, damit hab ich erstmal immer die gleiche Anzeige auf allen 
Segmenten, wird dann anders, wenn die Segmente auch mit Transistor 
ordentlich leuchten)

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gemeinsamen Kathoden werden OHNE Transistor mit "0" angesteuert,
MIT Transistor benötigst Du einen "1"-Pegel, um diese einzuschalten....

Autor: Oliver Keller (0x2142)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, ich denk mal laut :

Wenn die Basis vom Pin des PIC Spannung + Strom bekommt, also der 
PIC-pin auf 1 steht, dann schaltet der Transistor und die Anzeige 
leuchtet. Bei 0 kein Strom zur Basis, also auch kein Strom Collector -> 
Emitter

Vom Code her ist es ja nun so, dass ständig zwischen 0 und 1 gewechselt 
wird, also hab ich quasi ne 50% PWM ? Wenn also 50% der Zeit 0 und für 
den Rest 1 gesetzt sind, dann müsste es doch eigentlich egal sein, ob 
die angeschlossene Schaltung bei 0 oder 1 leuchtet, sprich ob ein 
Transistor im Spiel ist oder nicht ?

Aber ein Unterschied ist natürlich richtig, den ich vorher nicht bedacht 
habe: Ohne Transistor arbeitet der Port als Senke, und damit 
funktioniert es. Mit Transistor ist der Port Quelle, und damit 
funktioniert es nur ein ganz klein bißchen.

Ich hab mal verschieden Widerstände zwischen Pin und Basis probiert, 
daran scheint´s nicht zu liegen. Kann es sein, dass das Timing 0->1 
anders ist als 1->0 ?

Autor: Oliver Keller (0x2142)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und da merk ich´s auch schon:

Es ist ja nicht 50-50, sondern je  16,6 zu 83,3 !

Ich bastel das grad mal um und melde mich dann gleich nochmal mit 
Ergebnis....

Autor: Oliver Keller (0x2142)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, Problem gelöst, erstmal ein dickes Dankeschön an der Stelle.

Ich hab´s umgebaut auf

    bcf    PORTA,0    ; RA0=0
  bsf    PORTA,0    ; RA0=1
  bcf    PORTA,1    ; RA1=0
  bsf    PORTA,1    ; RA1=1
  bcf    PORTA,2    ; RA2=0
  bsf    PORTA,2    ; RA2=1


und schon ist das Verhalten genau umgekehrt : Mit Emitterschaltung 
leuchtet´s so wie es soll und direkt am Port angeschlossen glimmt´s nur 
ein bißchen.

Und jetzt werd ich mal sehen, dass ich die Dekodierfunktion zwischendrin 
aufrufe, um pro Segment verschiedene Symbole ausgeben zu können.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver Keller schrieb:
> Und jetzt werd ich mal sehen, dass ich die Dekodierfunktion zwischendrin
> aufrufe, um pro Segment verschiedene Symbole ausgeben zu können.

Wesentlich sinnvoller ist es, sich zuerst mit dem Timerinterrupt zu 
beschäftigen.

Dann kannst Du das Multiplexen im Timerinterrupt durchführen und das 
Main ist völlig frei für andere Aufgaben.
Du legst nur 3 Byte Bildspeicher an für die 3 Digits und da kann das 
Main dann die Ziffern-codes ablegen.
Etwa 300 .. 1000Hz Interruptfrequenz sind völlig ausreichend.


Peter

Autor: Oliver Keller (0x2142)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,


danke, jetzt hab ich mal einen Anhalt, welche Frequenz da sinnvoll ist.

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.