Transistor an Pin lässt sich nicht durchschalten

Gast #2376670
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.
Gast #2376778
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.
Gast #2376784
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
#2376796
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
Gast #2376804
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.
Gast #2376856
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.
Gast #2376870
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)?
Gast #2376903
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.)
Gast #2376907
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;)
Gast #2376919
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          | /
    __        |/
----____--------|\
                | \
                   |
                   |
                  ---
#2376956
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.
Gast #2377883
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.
#2377908
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
Gast #2379137
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?
Gast #2379152
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.
Gast #2379180
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.
Angehängte Dateien:
#2379751
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
Gast #2380809
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
}
#2381077
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
Gast #2382040
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.

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