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)?
1 | .include "m169def.inc" |
2 | |
3 | .org 0x0000 |
4 | rjmp RESET |
5 | |
6 | RESET: |
7 | ldi R16, 0x5 ; "PIN PB0 & PB2 als Ausgang geschaltet" |
8 | out DDRB,R16 |
9 | |
10 | Loop: |
11 | dec R16 ; 5,4,3,2,1,0,255,254,... |
12 | out PORTB, R16 |
13 | rjmp Loop |
> 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.
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.