Forum: Mikrocontroller und Digitale Elektronik Transistor an Pin lässt sich nicht durchschalten


von Lukas B. (Gast)


Lesenswert?

Hallo,

nachdem ich nun erfolgreich einen Wecker auf Basis des AtMega8 
programmiert habe und jetzt möchte ich die Hintergrundbeleuchtung meines 
LCD mit Pin PB2 steuern, was auch softwareseitig funktioniert. 
Allerdings schaltet der Transistor nicht richtig durch. Ich habe schon 
verschiedene Mosfets und NPN-Transistoren getestet. Zwar wird die 
Beleuchtung an- und abgeschaltet, jedoch ist der Strom nur sehr gering. 
Die Hintergrundbeleuchtung braucht 130mA an 4,2V. Dazu habe ich den 
Transistor entsprechend verschaltet, einen 1kOhm Basis-Widerstand 
genommen und das LCD mit einem 4,7Ohm Vorwiderstand angeschlossen. Nur 
glimmt die Beleuchtung jetzt vor sich hin. Auch wenn ich den 
Vorwiderstand entferne, zieht das LCD weiterhin nur ~7mA. Das LCD selbst 
ist voll funktionstüchtig, denn auf einer anderen Platine mit dem 
gleichen Transistor und den gleichen Widerständen leuchtet es schön 
hell. Ich denke mal, der Pin des AVRs hat nicht genug Leistung, um den 
Transistor zu schalten. Was meint ihr? Ich bin nach zwei Stunden 
Experimentieren mit meinem Latein am Ende.

von 42 (Gast)


Lesenswert?

Lukas B. schrieb:
> Ich bin nach zwei Stunden
> Experimentieren mit meinem Latein am Ende

Dann zeig doch mal, was du da wie verdrahtet hast - so rein 
schaltplanmäßig.

von holger (Gast)


Lesenswert?

>Ich denke mal, der Pin des AVRs hat nicht genug Leistung, um den
>Transistor zu schalten. Was meint ihr?

Schalte den Pin doch mal auf Ausgang;)

von Harald Wilhelms (Gast)


Lesenswert?

Lukas B. schrieb:

> jetzt möchte ich die Hintergrundbeleuchtung meines
> LCD mit Pin PB2 steuern, was auch softwareseitig funktioniert.
> Allerdings schaltet der Transistor nicht richtig durch.

Hast Du diese Schaltung verwendet?
http://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern
Gruss
Harald

von Lukas B. (Gast)


Lesenswert?

Ich habe das LCD ähnlich wie im Tutorial angeschlossen, allerdings nicht 
in Kollektor-, sondern Emitterschaltung, also zwischen Emitter und 
Masse. Aber das dürfte ja keinen großen Unterschied machen. Ich fürchte, 
der Transistor verstärkt nicht gut genug.
@Holger: Der "Pin" ist auf Ausgang geschaltet und schaltet auch so wie 
er soll.

von holger (Gast)


Lesenswert?

>Die Hintergrundbeleuchtung braucht 130mA an 4,2V.
>Ich habe das LCD ähnlich wie im Tutorial angeschlossen, allerdings nicht
>in Kollektor-, sondern Emitterschaltung,

Großer Fehler. Warum tust du das?

4.2 + 0.7V = 4.9V
5V - 4.8V = 0.1V

0.1V / 4.7 Ohm = 20mA

von holger (Gast)


Lesenswert?

>4.2 + 0.7V = 4.9V
>5V - 4.8V = 0.1V

Ups;)

4.2V + 0.7V = 4.9V
5V - 4.9V = 0.1V

von Dietrich L. (dietrichl)


Lesenswert?

Lukas B. schrieb:
> Ich habe das LCD ähnlich wie im Tutorial angeschlossen, allerdings nicht
> in Kollektor-, sondern Emitterschaltung, also zwischen Emitter und
> Masse.

Das heißt dann aber Kollektorschaltung (Emitterfolger)...

In der Schaltung schafft Du aber nicht die 4,2V.
Probier mal, den Basiswiderstand wegzulassen (-> 0 Ohm). Den brauchst Du 
nicht und er frisst nur Spannung.
Und mess auch mal die Spannungen
- am Port-Ausgang
- an der Basis
- am Emitter

Gruß Dietrich

von Lukas B. (Gast)


Lesenswert?

Ok, ich glaube ich muss meine Grundkentnisse noch mal auffrischen. ;)
Also schalte ich das LCD zwischen Potential und Kollektor und umgehe so 
die 0,7V Spannungsabfall im Transistor.

@Dietrich L.
Ohne Basiswiderstand habe ich auch schon getestet. Das hat nur ein 
minimale Änderung gebracht.

von Lukas B. (Gast)


Lesenswert?

Edit: Danke für die Tipps. In der Schaltung zwischen Kollektor und +5V 
fließen wenigstens 40mA, was für eine ausreichende Helligkeit sorgt. 
Über dem LCD liegen dabei 3,8V an. Ich frage mich zwar, wo die restliche 
Spannung geblieben ist, denn über dem Vorwiderstand fallen nur 0,09V ab. 
Selbst wenn ich Vorwiderstand und Basiswiderstand entferne, bleibt der 
Strom weiterhin bei 40mA.

von holger (Gast)


Lesenswert?

>Ich frage mich zwar, wo die restliche
>Spannung geblieben ist, denn über dem Vorwiderstand fallen nur 0,09V ab.

Am Transistor?

>Selbst wenn ich Vorwiderstand und Basiswiderstand entferne, bleibt der
>Strom weiterhin bei 40mA.

Lass den Vorwiderstand drin! Vieleicht ist deine Transe ja schon
defekt. Was passiert wenn du die Hintergrundbeleuchtung
ohne Transistor direkt anschliesst (mit Vorwiderstand)?

von Lukas B. (Gast)


Lesenswert?

> Am Transistor?

Aber doch nur 0,7V? Und dann kommt man in Summe auf 4,59V.

Mit Vorwiderstand an 5V direkt liiegen am LCD 4,2V an und es leuchtet 
schön hell. Mit Transitor geht es nicht. Der Transisor ist definitiv 
nicht defekt, ich habe mehrer verschiedene getestet. Auch wenn ich zwei 
Transitoren als Darlington-Transistor schalte, ändert sich nicht.

(??? - Die Schaltung will mich auf den Arm nehmen.)

von holger (Gast)


Lesenswert?

>> Am Transistor?

>Aber doch nur 0,7V? Und dann kommt man in Summe auf 4,59V.

Das kann je nach Basiswiderstand auch mehr sein.
Wie groß war der eigentlich? Ohne Basiswiderstand
könnte der Transistor hin sein wenn du da >40mA
durch die Basis jagst. Dann sinkt die Stromverstärkung.

>(??? - Die Schaltung will mich auf den Arm nehmen.)

Ne, du nimmst uns auf den Arm;)

von Lukas B. (Gast)


Lesenswert?

Basiswiderstand: 1kOhm
Normalerweise hat ein toter Transitor bei mri immer ein Loch und stinkt. 
:D Aber es kann natürlich sein, dass er beim Experimentieren beschädigt 
wurde.

So sieht meine Schaltung momentan aus:

                   o +5V
                   |
                  LCD
                   |
                  | |  2k2
                  | |
                   |
    1k          | /
    __        |/
----____--------|\
                | \
                   |
                   |
                  ---

von Karl H. (kbuchegg)


Lesenswert?

Und was willst du mit den 2k2?

Runter damit!
Mit dem Widerstand stellst du den Strom ein, den dein LCD ziehen soll 
(falls es keinen eigenen R an Board hat).
Bei 2k2 wird an deinen 4.2V nicht wirklich ein vernünftiger Strom 
fliessen. Werte so um die 40 bis 70 Ohm sind da normal.

von holger (Gast)


Lesenswert?

>Basiswiderstand: 1kOhm
>Normalerweise hat ein toter Transitor bei mri immer ein Loch und stinkt.
>:D

So schnell geht das manchmal nicht;)
Kollektor und Emitter hast du nicht zufällig vertauscht?

von Lukas B. (Gast)


Lesenswert?

@kbuchegg: Tippfehler meinerseits, das ist ein 2R2 Vorwiderstand. Aber 
selbst ohne Vorwiderstand komme ich nicht auf über 40mA.
@holger: Vertauscht ist dort nichts und ich habe schon mein komplettes 
Repertoire an NPN-Transistoren durchprobiert. Zwar gibt es zwischen den 
einzelnen Typen kleine Unterschiede, aber keiner lässt genug Strom 
fließen, damit das LCD optimal leuchtet. Man könnte meinen, die 
Betriebsspannung wäre zu niedrig, aber es liegen mit einem 7805 
stabiliserte +5V DC an. Eventuell liegt es aber auch an meinem 
Versuchsaufbau auf dem Steckbrett.

von Falk B. (falk)


Lesenswert?

@  Lukas B. (Gast)

>Die Hintergrundbeleuchtung braucht 130mA an 4,2V.

Das sind Nominalwerte. Meist reichen aber 20-50mA aus.

>Vorwiderstand entferne, zieht das LCD weiterhin nur ~7mA.

Kein gute Idee. Schließe mal die Hintergrundbeleuchtung OHNE Transistor 
über 2R2 an 5V. Dann siehst du, wieviel theoretisch drin ist.

>ist voll funktionstüchtig, denn auf einer anderen Platine mit dem
>gleichen Transistor und den gleichen Widerständen leuchtet es schön
>hell.

Schonmal gut, es funktioniert noch.

> Ich denke mal, der Pin des AVRs hat nicht genug Leistung, um den
>Transistor zu schalten.

Nö. Du hast eher einen Verdrahtungs- oder Bestückungsfehler. Vielleicht 
aus versehen 10K statt 1K erwischt. Softwarefehler? Den Pin nicht als 
Ausgang geschaltet? Miss mal den Basisstrom.

> Was meint ihr? Ich bin nach zwei Stunden
> Experimentieren mit meinem Latein am Ende.

Kleines Latinum? ;-)

>selbst ohne Vorwiderstand komme ich nicht auf über 40mA.

Sowas macht man nicht.

>stabiliserte +5V DC an. Eventuell liegt es aber auch an meinem
>Versuchsaufbau auf dem Steckbrett.

Möglich. Wackelkontakt etc.

MfG
Falk

von Lukas B. (Gast)


Lesenswert?

Ich habe ein Latinum, keine Sore, aber nur in Latein, nicht in AVR GCC. 
;)
Beim Optimieren des Codes habe ich bemerkt, dass das nur LCD dann leicht 
abgedunkelt ist, wenn man das Wecksignal aktiviert. Das Wecksignal wird 
durch Timer2 generiert, der ein PWM Signal erzeugt. Sobald der Wecker 
dann getriggert wird, wird das PWM Signal über PB3 ausgegeben. Die 
Hintergrundbeleuchtung des LCDs liegt auf PB2 und irgendwie wird in dem 
Moment auch das PWM-Signal auf die Hintergrundbeleuchtung gegeben, die 
dann natürlich gedimmt ist.

Ich mache es nochmal anhand des Codes deutlich:

In der init-Funktion schalte ich das das Datenrichtungsregister von Port 
B für PB2 auf Ausgang.
1
DDRB = (1<<DDB2);

Dann wird Timer2 initialisiert.
1
//PWM-Initialisierung für Speaker  
2
ASSR=0x00;
3
TCCR2=0x6A;   //Hauptregister Modus,Frequenz s.Datenblatt
4
TCNT2=0x3C;
5
OCR2=0x50;

In diesem Abschnitt wird das Signal dann im Takt von 2Hz auf PB3 
ausgegeben (in der Praxis). Jeder sieht aber, dass ich da totalen Mist 
programmiert habe, denn ich schalte ja das ganze Datenrichtungsregister 
für Port B auf Ausgang.
1
//Alarm1 auslösen...
2
[...]
3
if(millisekunden<=500){
4
DDRB = (1 << DDB3); //OC2 mit PWM Signal s.init-Funktion
5
}
6
else{
7
DDRB = (0 << DDB3);
8
}
9
}  
10
else{
11
DDRB = (0 << DDB3);
12
[...]
13
}

Programmiere ich jedoch an dieser Stelle so, wie es sein sollte,...
1
//Alarm1 auslösen...
2
[...]
3
if(millisekunden<=500){
4
PORTB = (1 << PB3); //OC2 mit PWM Signal s.init-Funktion
5
}
6
else{
7
PORTB = (0 << PB3);
8
}
9
}  
10
else{
11
PORTB = (0 << PB3);
12
[...]
13
}
...dann wird zwar PB3 im 2Hz-Takt an- und ausgeschaltet (Knacken im LS), 
aber das PWM Signal wird nicht mehr ausgegeben. Wird das Signal 
irgendwie überschrieben?

Folgender Codeabschnitt schaltet die Hintergrundbeleuchtung:
1
//Lichtsteuerung für LCD
2
if(stunde>=21 || stunde<=9){
3
PORTB = (1<<PB2);
4
}
5
else{
6
PORTB = (0<<PB2);
7
}

Wie soll ich es programmieren, damit es funktioniert?

von Curunir (Gast)


Lesenswert?

Ohne jetzt alles genau gelesen zu haben, PORTB=(0<<PB2) usw. löscht 
nicht nur ein Bit, sondern setzt alle Bits auf Null.

PORTB &= ~(1<<PB2) löscht das einzelne Bit.

Da Du das häufiger machst, könnte das das Problem sein.

von Lukas B. (Gast)


Angehängte Dateien:

Lesenswert?

Ok, danke für die Info.
Ich habe es jetzt etwas anders gemacht, indem ich den PB2 nicht schon in 
der init-Funktion auf Ausgang setze, sondern erst im Hautpprogramm. Mit 
|= kopiere ich in den aktuellen Stand des Datenrichtungsregisters dann 
noch das Bit PB2 als 1. Jetzt geht es mehr oder weniger. :D
1
//Lichtsteuerung für LCD
2
//Port PB2 auf Ausgang
3
DDRB |= (1 << PB2);
4
5
if(stunde>=21 || stunde<=9){
6
  PORTB = (1<<PB2);
7
}
8
else{
9
  PORTB = (0<<PB2);
10
}

Danke für eure Tipps, als blutiger Anfänger in Sachen Programmierung 
kann man die ganz gut gebrauchen, aber jetzt ist der Wecker fertig. Im 
Anhang sind zwei Bilder vom Aufbau auf dem Steckbrett.

von Falk B. (falk)


Lesenswert?

@  Lukas B. (Gast)

>noch das Bit PB2 als 1. Jetzt geht es mehr oder weniger. :D

Weniger. Lies was über Bitmanipulation und wie man einzelne Bits 
schaltet, OHNE den Rest vom Port zu verändern.

>//Lichtsteuerung für LCD
>//Port PB2 auf Ausgang
>DDRB |= (1 << PB2);

OK.

>if(stunde>=21 || stunde<=9){
>  PORTB = (1<<PB2);

FALSCH!

>}
>else{
>  PORTB = (0<<PB2);
>}

FALSCHER!

MFG
Falk

von Lukas B. (Gast)


Lesenswert?

Ich habe den Artikel kurz überflogen, aber mir wird gerade nicht ganz 
klar, was daran so falsch sein soll. Es läuft doch wunderbar. ;)

von Lukas B. (Gast)


Lesenswert?

Edit:

Alles klar. Ist es so besser?
1
//Lichtsteuerung für LCD    
2
DDRB |= (1 << PB2); //Port PB2 auf Ausgang, vorherige Konfiguration erhalten
3
4
if(stunde>=21 || stunde<=9){ //zwischen 21 und 9 Uhr  Beleuchtung anschalten
5
PORTB |= (1 << PB2);
6
}
7
else{
8
PORTB &= ~(1 << PB2); //tagsüber ausschalten
9
}



Muss ich denn hier auch etwas korrigieren?
1
//Alarm2 auslösen...(Kommentar s.oben)
2
if(!alarm1_aktiv){ //wenn Alarm 1 nicht schon aktiv ist
3
if(alarm == 2 || alarm == 3){
4
if(stunde == w2_stunde && minute == w2_minute && tag != 5 && tag != 6 && sekunde<=6){ 
5
alarm_aktiv=1;
6
alarm2_aktiv=1;
7
if(millisekunden<=500){
8
DDRB = (1 << DDB3); 
9
}
10
else{
11
DDRB = (0 << DDB3);
12
}
13
}  
14
else{
15
DDRB = (0 << DDB3);
16
alarm_aktiv=0;
17
alarm2_aktiv=0;
18
}
19
}
20
}

von Falk B. (falk)


Lesenswert?

@  Lukas B. (Gast)

>Alles klar. Ist es so besser?

1
//Lichtsteuerung für LCD    
2
DDRB |= (1 << PB2); //Port PB2 auf Ausgang, vorherige Konfiguration erhalten
3
4
if(stunde>=21 || stunde<=9){ //zwischen 21 und 9 Uhr  Beleuchtung anschalten
5
PORTB |= (1 << PB2);
6
}
7
else{
8
PORTB &= ~(1 << PB2); //tagsüber ausschalten
9
}

Ja, so ist es richtig.

>Muss ich denn hier auch etwas korrigieren?

>if(millisekunden<=500){
>DDRB = (1 << DDB3);

Warum willt du die Datenrichtung umschalten? Sollte da nicht eher der 
PORT geschaltet werden?

>}
>else{
>DDRB = (0 << DDB3);

Eine 0 schiebt man niemals.

>}
>}
>else{
>DDRB = (0 << DDB3);

dito.

MfG
Falk

von Lukas B. (Gast)


Lesenswert?

Der Code ist fertig und die Fehler im letzten Abschnitt habe ich auch 
beseitigt.
Des Weiteren habe ich die Schaltug fertig aufgebaut und es läuft soweit 
alles. Zwar zieht das LED Backlight ziemlich viel Strom (~100mA), 
weshalb der Spannungsregler recht warm wird, aber laut Datenblatt liegt 
der typische Strom bei 130mA, somit ist alles in Ordnung. Morgen muss 
ich noch die Gehäusebleche bearbeiten und dann ist der Wecker fertig. 
Evtl. baue ich noch eine RTC ein, damit die Zeit auch weitergezählt 
wird, wenn der Wecker abgeschaltet ist. DCF77 lässt sich ledier nicht 
realisieren, da der µC zu wenige freie Ports hat.

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.