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 ?
Hast Du die Ansteueuerung auch invertiert? (1-Pegel schaltet den Transistor ein) Otto
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)
Die gemeinsamen Kathoden werden OHNE Transistor mit "0" angesteuert, MIT Transistor benötigst Du einen "1"-Pegel, um diese einzuschalten....
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 ?
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....
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.
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
Hallo Peter, danke, jetzt hab ich mal einen Anhalt, welche Frequenz da sinnvoll ist.
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.