Hallo,
Ich bin blutiger Anfänger im programmieren.
Und zwar möchte ich ein LED (rot 2V 20mA) zum leuchten bringen.
Ich verwende das AVR Butterfly. (Atmel 169)
Mit der LED + Vorwiderstand an ein PIN von PortB klappt das auch.
Jetzt wollte ich das mal über einen Transistor versuchen, doch jetzt
kommt das Problem!
Hab die Hardware so aufgebaut:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
Vcc: 4,5V
Basisvorwiderstand: 1,2K
Transistor: BC 548c
Vorwiderstand LED: 110 Ohm
Den zusätzlichen Widerstand zw. Basis und Emitter habe ich auch drin,
mit 1M Ohm.
Und zwar wenn das Programm noch nicht läuft, (das Butterfly nur an die
Betriebsspannung angeschlossen ist)steuert der Transistor schon durch.
Auch wenn ich nur die LED + Vorwiderstand an den PIN anschließe, glimmt
die LED schon ganz ganz ganz minimal.
Hatte das im Forum mir den Pullup-Widerstand gelesen, aber wie muss ich
den Ausgang jetzt Schalten, dass der Transistor noch nicht durch
schaltet bzw. der soll erst Schalten, wenn die das Programm starte!
Hatte das mit den "Push-Pull" auch versucht aber leider kein Erfolg.
Hier das normale Programm OHNE push-Pull oder ähnliches...
.include "m169def.inc"
.org 0x0000
rjmp RESET
RESET:
ldi R16, 0x5 "PIN PB0 & PB2 als Ausgang geschaltet"
out DDRB,R16
Loop:
dec R16
out PORTB, R16
rjmp Loop
Könntet Ihr mir einen Tip geben?
Danke
Also ich habe jetzt nochmal nach gemessen, wenn das Programm noch nicht
läuft, liegen an dem Transistor (angesteuert vom Port PB0) eine Ube von
ca. 0,74V an.
Klar das dieser da schon durch steuert.
Was muss ich machen, damit der Ausgang Nahe 0V geht??
> Hab die Hardware so aufgebaut:> htp://www.mikrocontroller.net/articles/AVR-Tutori...
Da sehe ich keinen Transistor.
EDIT: Doch ganz unten auf der Seite!
> Vcc: 4,5V> Transistor: BC 548c> Vorwiderstand LED: 110 Ohm
4,5V (Vcc) - 2V (LED) - 0,74V (Ube) = 1,76V
1,76V / 110 Ohm = 16 mA
Passt.
> Basisvorwiderstand: 1,2K
(4,5V - 0,74V) * ~30 (hFE) / 16 mA = 7 kOhm
1,2 kOhm funktioniert.
> Den zusätzlichen Widerstand zw. Basis und Emitter habe ich auch drin,> mit 1M Ohm.
Pulldown-Widerstand für sicheres AUS (Sperren des NPN).
1 MOhm Pulldown gegen einen versehentlich aktivierten interen 20-50 kOhm
Pullup an einem Eingangspin würden natürlich nicht wirken. Mit dem
Feuerwehrschlauch Wasser liefern und mit dem Teelöffelchen
wegschaufeln...
Deshalb der Frage von Karl Heinz nachgehen und erklären wo die Basis des
NPN angeschlossen ist und wie der Pin im Programm angesteuert wird. Als
Erklärung ist die Skizze/Schaltplan eine bessere Wahl als ein Text.
> Ube von ca. 0,74V an.
Mit was bzw. wie und wo genau gemessen?
http://www.mikrocontroller.net/articles/Transistor#PNP.2FNPN_als_Schalter.2C_wohin_mit_der_Last.3F
BC548c ist NPN, also linkes Schema.
Hallo,
Habe schon verschiedene PINs von Port B verwendet.
Die haben keine Sonderfunktion (soweit ich weiß) bis auf PIN 5 ist für
den Buzzer.
Hab die Spannung gerade mal an den Pins gemessen im Leerlauf!
4,35V an allen Ausgängen und wenn ich das Programm starte, dann liegen
nur noch 2,1V an.
Irgendwie verstehe ich das nicht.
Idealisiert muss es doch so sein:
An den Ausgängen liegen Nahe 0V an und denn ich das Programm starte,
sollten doch alle Ausgangs-PIn Nahe Vcc liegen....
Den Begriff Leerlauf kenne ich vom Mopped :-)
Meinst du im RESET-Zustand oder mit dem geladenen Programm ohne
angeschlossene Zusatzhardware (Basiswiderstand, Transistor, LED,
Vorwiderstand, Pulldown-Widerstand)?
> Habe schon verschiedene PINs von Port B verwendet.
Dein Programm macht grundsätzlich nur Sinn an PB0 oder PB2. Die anderen
Pins brauchst du nicht zu probieren
(Beitrag "Re: Anfängerproblem"). Ich habe nicht
nachgesehen, ob PB0 oder PB2 am Butterfly noch anders belegt sind und
ebenfalls ausscheiden.
Selbst an PB0 oder PB2 rattert das Programm mit affenartiger
Geschwindigkeit durch die Endlosschleife bei Loop und an den Pins PB0
oder PB2 erscheinen Nullen und Einsen schnell wie die Hölle
hintereinander. An PB0 viermal schneller als an PB2.
Du als lahmer Beobachter wirst kein Flackern der LED mehr sehen, sondern
ein mehr oder minder starkes Leuchten.
Bau in die Schleife noch eine deutliche Warteschleife ein!
Also mit Leerlauf meine ich keine zusätzlich Hardware angeschlossen.
Das Programm ist auf den Atmel geladen aber läuft noch nicht.
Müsste als der Reset-Zustand sein.
Gemessen mit nen Multimeter.
Ja in den Bsp. habe ich nur PB0 oder PB2 als Ausgang geschaltet.
Warteschleife, musst du mir erklären, ich habe doch gerade erst
angefangen mich zu versuchen! ;-)
Jetzt das Bild mit angeschlossener Hardware, Programm noch nicht
gestartet.
Also der Fall, der Transistror steuert schon durch, obwohl er das nicht
soll!
> Das Programm ist auf den Atmel geladen aber läuft noch nicht.> Müsste als der Reset-Zustand sein.
Das ist es nur, wenn der RESET-Pin auf LOW (GND) gehalten wird! Ohne
diese Maßnahme läuft das im AVR enthaltene Programm, egal ob was
angeschlossen ist oder nicht.
Warteschleifen sind im AVR-Tutorial erklärt. 3 Lektionen weiter als das
IO-Kapitel. Dort wo es um den Stack geht wegen der Unterprogrammaufrufe
und 4 Lektionen weiter wo dann das LCD angesteuert wird. Beim LCD sind
der Aufruf von z.B. delay5ms Warteschleifen als Unterprogramm nämlich
das A und O.
ok, das werde ich später mal machen.
Beim AVR Butterfly wird das Programm gestartet, wenn man den Joystick
nach oben drückt, vorher macht dieser nix.
Aber das löst immer noch nicht mein Verständnisproblem von vorhin:
"Hab die Spannung gerade mal an den Pins gemessen im Leerlauf!
Also das Butterfly mur mit der Betriesspannung versorgt.
4,35V an allen Ausgängen und wenn ich das Programm starte, dann liegen
nur noch 2,1V an.
Irgendwie verstehe ich das nicht.
Idealisiert muss es doch so sein:
An den Ausgängen liegen Nahe 0V an und denn ich das Programm starte,
sollten doch alle Ausgangs-Pins Nahe Vcc liegen...."
Wo ist mein Denkfehler?
Kay Mr. x schrieb:> ok, das werde ich später mal machen.> Beim AVR Butterfly wird das Programm gestartet, wenn man den Joystick> nach oben drückt, vorher macht dieser nix.
Vorher läuft auch ein Programm. Und von dem weiß keiner, was es mit den
Portpins anstellt.
Irgendein Programm muss ja schlieslich den Joystick überwachen. Von
alleine kann der nicht dein Programm starten. Da läuft sowas wie ein
kleines Betriebssystem
In einem µC läuft immer ein Programm, sobald er Strom bekommt!
> "Hab die Spannung gerade mal an den Pins gemessen im Leerlauf!> Also das Butterfly mur mit der Betriesspannung versorgt.> 4,35V an allen Ausgängen
Das klingt ganz stark danach, dass an dem Pin die Pullups eingeschaltet
wurden.
> Irgendwie verstehe ich das nicht.> Idealisiert muss es doch so sein:> An den Ausgängen liegen Nahe 0V an und denn ich das Programm starte,> sollten doch alle Ausgangs-Pins Nahe Vcc liegen...."
Nochmal.
Deine Annahme ist, dass vor deinem Programm nichts läuft. Dem ist aber
nicht so.
> Beim AVR Butterfly wird das Programm gestartet, wenn man den Joystick> nach oben drückt, vorher macht dieser nix.> "Hab die Spannung gerade mal an den Pins gemessen im Leerlauf!> Also das Butterfly mur mit der Betriesspannung versorgt.> 4,35V an allen Ausgängen
Was der AVR Butterfly im Bootloadermodus an den Pins für Spannungen hat
bzw. ob die Messung so OK ist, kann ich nicht sagen.
An PORTB ist auf der Butterfly-Platine das Dataflash, der Joystick und
der Piezo angeschlossen.
Dass da mindestens auf PB0 über R206 (100K) eine Spannungen her kommt,
ist nicht aussergewöhnlich. Das ist auch eine Spannung, die dein
höherohmiger 1 MOhm Pulldown nicht komplett weg bekommt. Das ist das
Prinzip eines Spannungsteilers.
So gesehen ist dein Programm unglücklich geschrieben. Hast du keine
freien Pins gefunden?
> und wenn ich das Programm starte, dann liegen> nur noch 2,1V an.
Achtung: Folgendes ohne Berücksichtigung der Schaltung auf der
Butterfly-Platine!
An PD0 und PB2 wird durch dein Programm wechselweise HIGH (Vcc bis Y
Volt) und LOW (0 bis X Volt) ausgegeben. Du wirst also eine Spannung
irgendwo zwischen X und Y messen. Würdest du ein Oszilloskop
anschliessen, würdest du am Pin ein Rechtecksignal finden. Dein trägeres
Multimeter misst gemittelt über eine gewisse Zeit.
An den anderen Pins hast du immer noch Eingänge eingestellt. Durch dein
Runterzählen von r16 und das folgende OUT schaltest du deren internen
Pullup-Widerstände nach Vcc ein- bzw. aus. Dadurch gelangt Spannung an
diese Pins, die du auch als Mittelwert misst.
Zwischen PD0 und PB2 könnte es Unterschiede geben. Zwischen PB0 und PB2
und den anderen Pins sollte es Unterschiede geben.