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.
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.
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.
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
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.
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.
>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)?
> 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.)
>> 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;)
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 | /
__ |/
----____--------|\
| \
|
|
---
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.
>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?
@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.
@ 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
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.
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?
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.
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.
@ 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
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
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.