Forum: Mikrocontroller und Digitale Elektronik Anfängerproblem


von Kay M. (wolle2011)


Lesenswert?

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

von Kay M. (wolle2011)


Lesenswert?

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??

von Karl H. (kbuchegg)


Lesenswert?

Welchen Pin hast du denn genommen?
Hat der eine Sonderfunktion?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 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.

von Kay M. (wolle2011)


Lesenswert?

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....

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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!

von Kay M. (wolle2011)


Angehängte Dateien:

Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 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.

von Kay M. (wolle2011)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 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
Noch kein Account? Hier anmelden.