LED Ansteuerung über BSS123

0n3 70uch

Neues Mitglied
26. Mai 2010
54
0
0
Wermelskirchen
Sprachen
  1. ANSI C
Hallo,

das von mir hier vorgestellte Projekt "Multi Input Switch" befindet sich nun in der Endphase. Nur wie das so ist, habe ich gestern einen Fehler entdeckt.

Der BSS123 im beigefügten Schaltplan steuert immer durch, egal ob an PB2 nun eine logische eins oder null vorliegt. Interessanterweise geht die angeschlossene LED jedoch aus, wenn ich eine Messspitze des Messgerätes zwischen R10 und Q2 halte.

Da ich mit meinem Latein am Ende bin, hoffe ich, dass Ihr mir weiter helfen könnt.

Gruß
Fabian
 

Anhänge

  • MIS-AVR 1.1-1.gif
    MIS-AVR 1.1-1.gif
    68,5 KB · Aufrufe: 16
Hallo Fabian!

Ich bin hier zwar nicht der Elektronikspezialist.... da müssen wir schon auf Dino oder Dirk warten.... aber wie wäre es denn, wenn du das Gate des BSS123 mit einem hochohmigen Widerstand negativ vorbelastest? :hmmmm:

Letztlich macht dein Spannungsmessgerät ja auch nichts anderes. ;)
Vielleicht reicht ja schon ein 100k (oder 47k, oder 10k) Widerstand vom Gate zu GND aus.

Wie sagt Dino immer so schön.....
Das Gate eines FET funktioniert wie ein Kondensator. ;)
Durch den Widerstand am Gate zu GND kann sich das Gate wieder "entladen" und sperrt dann auch den MOSFET.

Kannst es ja mal ausprobieren.....

Gruß,
Cassio
 
Hallo Fabian,

hast du PB2 auch als Ausgang geschaltet, für mich liest es sich so, als ob der Pin noch Input und hochohmig ist.

Gruß,
Dirk
 
Hallo, Danke für die Unterstützung!

hast du PB2 auch als Ausgang geschaltet, für mich liest es sich so, als ob der Pin noch Input und hochohmig ist.
Den Ausgang hatte ich mittels folgenden Befehl als Ausgang konfiguriert:

Code:
DDRB |= (1<<DDB2);
Anschließend habe ich den PIN2 an PORTB im fünf Sekunden Rhytmus blinken lassen. Sämtliche anderen LEDs auf der Platine funktionieren auch einwandfrei, der Ausgang vom ATmega8 macht auch das was er soll, nur leider nicht der BSS123. Diesen wiederum hatte ich eben auch schon durch einen neuen ersetzt. Leider mit dem gleichen Ergebnis.

Nochmals Danke.
Gruß
Fabian

PS @ Cassio: Hab deine Antwort ganz übersehen, muss da mal eben nachlesen ;).

PSS:
Wie sagt Dino immer so schön.....
Das Gate eines FET funktioniert wie ein Kondensator.
Durch den Widerstand am Gate zu GND kann sich das Gate wieder "entladen" und sperrt dann auch den MOSFET.
Das würde zu mindestens erklären, warum das MOSFET erst abschaltet, wenn ich ein Messgerät an das Gate halte. Das ganze wird jetzt von mir mal getestet. Etwas doof ist nur, dass ich jetzt acht gleiche Platinen (war bei Haka das günstigste ;)) mit dem gleichen Fehler habe :(. Was würde den passieren, wenn ich direkt nach dem Abschalten des Ausgangs PB2, diesen in DDRB als Eingang definiere?
 
Hallo Fabian!

Sicher ist es immer ärgerlich, wenn die Platinen fertig sind und dann doch noch ein Fehler entdeckt wird.
Sollte das mit dem 10k (bis 100k) Widerstand aber funktionieren, dann kannst du ja vielleicht einen SMD-Shunt am BSS123 benutzen.
Musst ihn ja nur zwischen Gate und GND löten und beides liegt am FET direkt an.
Würde also gar nicht auffallen. ;)

Probiere es aber erst mal aus....

Gruß,
Cassio
 
Hallo zusammen,

der AVR hat am Pin im Low-Zustand je nach Belastung ca. 20mV, das würde bedeuten, dass der MOSFET hier schon schaltet, bzw einen ausreichend kleinen Durchgangswiderstand hat. :hmmmm:

Normalerweise halte ich einen Pulldown-Widerstand nur dann für notwendig, wenn man nach dem Reset oder beim Anlegen der Betriebsspannung nicht sicherstellen kann, dass der MOSFET ausgeschaltet ist.

Fabian, bist du dir sicher, dass der MOSFET richtig gepolt ist, in Eagle richtig definiert ist bzw. zum Package passt?

Dirk
 
Hallo,

also ich habe soeben den Test mit dem 10kOhm Widerstand durchgeführt. Das ganze hat soweit funktioniert, einziges Problem, der Widerstand ist scheinbar zu klein, denn die LED geht nicht sofort aus sondern dimmt langsam ab. Ich suche gleich mal nach einen 100kOhm Widerstand, dann dürfte sich das Dimmen ja erübrigen.

Fabian, bist du dir sicher, dass der MOSFET richtig gepolt ist, in Eagle richtig definiert ist bzw. zum Package passt?
Mehrmals geprüft und auch in der Schaltung durch gemessen. Konnte aber keinen Fehler feststellen.

der AVR hat am Pin im Low-Zustand je nach Belastung ca. 20mV, das würde bedeuten, dass der MOSFET hier schon schaltet, bzw einen ausreichend kleinen Durchgangswiderstand hat.
Aus irgendeinem Grund scheint genau dieser Effekt einzutreten... irgendwie komisch.

Vielen Dank für Eure Hilfe!
Gruß
Fabian

PS: Ich hatte zum Glück die Bauteile alle doppelt bestellt (mein weis ja nie was kommt ;)). Daher konnte ich jetzt einen 100kOhm SMD-Widerstand zwischen PB2 und GND Löten. Ist zwar nicht schon aber selten, wie man so schön sagt. Die LED ist schlagartig aus, also genau so wie es seien sollte. Anscheinend reichen die 20mV tatsächlich zum durch steuern des MOSFETs aus.
 
Hi,

PS: Ich hatte zum Glück die Bauteile alle doppelt bestellt (mein weis ja nie was kommt ;)). Daher konnte ich jetzt einen 100kOhm SMD-Widerstand zwischen PB2 und GND Löten. Ist zwar nicht schon aber selten, wie man so schön sagt. Die LED ist schlagartig aus, also genau so wie es seien sollte. Anscheinend reichen die 20mV tatsächlich zum durch steuern des MOSFETs aus.
hört sich alles sehr komisch an. Hast du direkt an PB2 mal ne LED (natürlich
mit Vorwiderstand) nach GND oder Vcc geschaltet ? Wenn die sauber schalten
dann sollte der Port auch Strom liefern bzw aufnehmen können. Hast du den
Atmel schon mal getauscht ? Ist der Pin wirklich heile ? Heile ist er nur wenn er
Strom liefern bzw aufnehmen kann. Ich hab hier nen Mega8535 rumfliegen der
an einem Pin nur noch nach einer Seite schaltet (nur noch nach GND).

Ist der GND des Atmels wirklich mit dem GND am MOSFET verbunden ???
Dadurch würde dir nämlich der MOSFET sonst auch in der Spannung
wegdriften.

Soweit erst mal meine Ideen.

Gruß
Dino
 
Anscheinend reichen die 20mV tatsächlich zum durch steuern des MOSFETs aus.

Hallo zusammen!

Ist zwar schön, dass es mit einem 100k Widerstand funktioniert, allerdings passt da irgendwas nicht zusammen! :hmmmm:

20mV soll ausreichen, um den BSS123 voll durchzusteuern?
Laut Datenblatt sind dafür gut 3V nötig!
Dann muss der Widerstand zu GND größer werden, damit die LED ausgeht? :hmmmm:

Da stimmt doch, meinem Verständnis nach, irgendwas etwas anderes nicht!

Gruß,
Cassio
 
Hi,

Ist zwar schön, dass es mit einem 100k Widerstand funktioniert, allerdings passt da irgendwas nicht zusammen! :hmmmm:

20mV soll ausreichen, um den BSS123 voll durchzusteuern?
Laut Datenblatt sind dafür gut 3V nötig!
Dann muss der Widerstand zu GND größer werden, damit die LED ausgeht? :hmmmm:
brauchen ja nur 1-2mA fließen. Bei 5V reicht ein 4,7k aus um eine LED zum
leuchten zu bringen (ok ... sie glimmt).

Da stimmt doch, meinem Verständnis nach, irgendwas etwas anderes nicht!
sehe ich genauso. Entweder ist ein Fehler auf der Platine ...
oder der Ausgang des Atmels ist Schrott ...
oder der Ausgang ist falsch programmiert.

Evtl PIN mit PORT verwechselt ? Kommt gerne mal vor. :D

Gruß
Dino
 
Hallo,

Ist zwar schön, dass es mit einem 100k Widerstand funktioniert, allerdings passt da irgendwas nicht zusammen!
Irgendwie nicht so ganz ;).

Hast du direkt an PB2 mal ne LED (natürlich mit Vorwiderstand) nach GND oder Vcc geschaltet ?
Werde ich gleich mal testen. Könnte ja eventuell tatsächlich an einem defekten AVR-Ausgang liegen.

Hast du den Atmel schon mal getauscht ?
Das gestaltet sich etwas schwierig, weil ich ungern den ATmega8 im TQFP Gehäuse auslöten möchte, bzw. nicht weiß ob dann noch irgendetwas heile bleibt ;).

Ist der GND des Atmels wirklich mit dem GND am MOSFETverbunden ???
Ja, hab ich auch schon mehrmals durch gemessen.

Gruß
Fabian

PS: Im Anhang befindet sich noch das Platinenlayout welches zur Verwendung kam.

PSS: Ein Auszug aus dem Quelltext:
Code:
//Funktion für die Status LED
void Status_LED (uint8_t OnOff)
{
	if (OnOff == 0)
	{
		PORTB &= ~(1<<PB2);
	}
	if (OnOff == 1)
	{
		PORTB |= (1<<PB2);
	}
}

Code:
//Funktion für die Initialisierungsphase
void Initialization (void)
{
	uint16_t Counter1 = 0;	//Zahler für die fünf Sekunden Schleife
	uint8_t Counter2 = 0;	//Zähler für die zwei Sekunden Schleife
	
	DDRB |= (1<<DDB0)|(1<DDB2);				//PIN0 und PIN2 an PORTB als Ausgang
	DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC4)|(1<<DDC5);	//PIN2, PIN3, PIN4 und PIN5 an PORTC als Ausgang
	
	DDRC &= ~(1<<DDC0);					//PIN0 an PORTB als Eingang
	DDRD &= ~((1<<DDD0)|(1<<DDD1)|(1<<DDD2)|(1<<DDD3));	//PIN0, PIN1, PIN2 und PIN3 an PORTD als Eingang
	PORTD |= (1<<PD0)|(1<<PD1);				//Interne PullUps an PIN0 und PIN1 des PORTD aktivieren
	
	Status_LED (1);		//PIN2 an PORTB einschalten
	Level_LED_Red (1); Level_LED_Green (1); Mode_LED_Red (1); Mode_LED_Green (1);	//PIN2, PIN3, PIN4 und PIN5 an PORTC einschalten
	_delay_ms (250);
	Status_LED (0);		//PIN2 an PORTB ausschalten
	Level_LED_Red (0); Level_LED_Green (0); Mode_LED_Red (0); Mode_LED_Green (0);	//PIN2, PIN3, PIN4 und PIN5 an PORTC ausschalten
	_delay_ms (250);
	
	for (Counter1 = 0; Counter1 < 500; Counter1++)		//Fünf Sekunden Initialisierung
	{
		_delay_ms (10);
		
		if (((PIND & (1<<PD1)) == 0) && ((PIND & (1<<PD0)) == 0))	//Wenn beide Taster gedrückt sind
		{
			for (Counter2 = 0; ((Counter2 < 200) && (((PIND & (1<<PD1)) == 0) && ((PIND & (1<<PD0)) == 0))); Counter2++)	//Zwei Sekunden Schleife
			{
				_delay_ms (10);
			}
		
			if (Counter2 == 200)
			{
				Level_LED_Red (1); Level_LED_Green (1); Mode_LED_Red (1); Mode_LED_Green (1);	//PIN2, PIN3, PIN4 und PIN5 an PORTC einschalten

				while (((PIND & (1<<PD1)) == 0) || ((PIND & (1<<PD0)) == 0))	//Warten bis beide Taster losgelassen werden
				{
				}

				Level_LED_Red (0); Level_LED_Green (0); Mode_LED_Red (0); Mode_LED_Green (0);	//PIN2, PIN3, PIN4 und PIN5 an PORTC ausschalten
				_delay_ms (250);
				Interrupts_Timer (1, 2);							//Funktion zur Interrupt und Timer Aktivierung
				Level_Function ();								//Wechseln zur Anwender Programmierung
			}	
		}
	}
	
	Status_LED (1);		//PIN2 an PORTB einschalten
	Level_LED_Red (1); Level_LED_Green (1); Mode_LED_Red (1); Mode_LED_Green (1);	//PIN2, PIN3, PIN4 und PIN5 an PORTC einschalten
	_delay_ms (250);
	Status_LED (0);		//PIN2 an PORTB ausschalten
	Level_LED_Red (0); Level_LED_Green (0); Mode_LED_Red (0); Mode_LED_Green (0);	//PIN2, PIN3, PIN4 und PIN5 an PORTC ausschalten
	_delay_ms (250);
}



//Hauptschleife
int main (void)
{
	Initialization ();	//Funktion für die Initialisierungsphase
...
 

Anhänge

  • MIS-AVR 1.1-2.gif
    MIS-AVR 1.1-2.gif
    28,2 KB · Aufrufe: 6
Hallo,

Sieh dir mal das Bildchen an. Das ist ein Teil deiner Platine.
MIS-AVR 1.1-2_Teil.jpg

PB2 (Pin14) geht vom Atmel über 2 Durchkontaktierungen an R10.
Dann gehts vom R10 weiter an den MOSFET (Gate).
Außerdem geht ein Pin des MOSFET (Drain) nach oben auf Pin 2
des Steckers.
Aber was ist mit dem Source-Pinn des MOSFET ? Der geht auf ne
Kupferfläche und dann nach nix. Der liegt in der Luft. Dein MOSFET
funktioniert schätzungsweise als Diode. Und wenn du dann mit
Potentialunterschieden rumspielst dann sperrt er ganz langsam.
Sein Gegenpotential holt er sich schätzungsweise über die
kapazitive Kopplung der Massefläche am Source zu der anderen
Massefläche auf der anderen Platinenseite.

Also nach meiner Meinung ist da ein Platinenfehler.
Source-Anschluß hängt in der Luft. Alles am schweben. :D

Ich hoffe mal das die Gate-Isolierschicht die Spielchen überlebt hat.

Gruß
Dino
 
Aber was ist mit dem Source-Pinn des MOSFET ? Der geht auf ne
Kupferfläche und dann nach nix.

Hallo zusammen!

Da war der Dino mal wieder scheller! ;)

Bin zum selben Ergebnis gekommen..... und dein altes Layout (anderer Beitrag) sieht genauso aus.

Löte den SMD-Shunt also wieder aus und löte dafür mal nen Draht zu GND des µC.
Geht es dann?

Gruß,
Cassio
 
Hallo Fabian,

schau dir mal die unten letzte Zeile in deinem Code einmal genauer an... ;)

Code:
//Funktion für die Initialisierungsphase
void Initialization (void)
{    
 uint16_t Counter1 = 0;    //Zahler für die fünf Sekunden Schleife     
uint8_t Counter2 = 0;    //Zähler für die zwei Sekunden Schleife          
DDRB |= (1<<DDB0)|(1<DDB2);                //PIN0 und PIN2 an PORTB als Ausgang
Dirk
 
Hi !

Oder warte mal....
Geht eine Leiterbahn von der Massefläche am Q2 zum unteren Steckkontakt (Pin 2) und brückt sich dort nach oben auf die blaue Leiterbahn?

Kann man leider nicht so gut erkennen.

Gruß,
Cassio



EDIT:

Hallo Dirk!
Meinst du dies hier?
DDRB |= (1<<DDB0)|(1<DDB2);

Habe ja leider keine Ahnung von C, aber muss das nicht "<<" sein? :hmmmm:
 
Hallo,

leider ist der Source-Anschluss mit Ground verbunden (sonst hätten wir jetzt den Fehler ;)). Kann man nur etwas schlecht sehen (siehe Anhang) ist aber von mir nachgemessen worden.

Gruß
Fabian

PS:
Geht eine Leiterbahn von der Massefläche am Q2 zum unteren Steckkontakt (Pin 2) und brückt sich dort nach oben auf die blaue Leiterbahn?
Da war ich wohl mal wieder zu langsam ;).
 

Anhänge

  • MIS-AVR 1.1-2_Teil.jpg
    MIS-AVR 1.1-2_Teil.jpg
    85 KB · Aufrufe: 10
Noch ne Idee ...
Ist das ??WIRKLICH?? ein BSS123 ??
Bei manchen Transistoren gibt es auch "Reverse"-Typen bei denen die
beiden nebeneinanderliegenden Pins (bei dir Source und Gate) getauscht
sind. Nur mal als Idee ... Hab ich hier als BC818B und BC818BR .

Gruß
Dino
 
Hi Cassio,

EDIT:

Hallo Dirk!
Meinst du dies hier?
DDRB |= (1<<DDB0)|(1<DDB2);

Habe ja leider keine Ahnung von C, aber muss das nicht "<<" sein? :hmmmm:


ja genau. Der Portpin ist also noch ein Eingang und hochohmig, wenn man versucht in das Portregister eine 0 zu schreiben, wenn man eigentlich den Pin low setzen möchte.

Dirk
 
ja genau. Der Portpin ist also noch ein Eingang und hochohmig, wenn man versucht in das Portregister eine 0 zu schreiben, wenn man eigentlich den Pin low setzen möchte.
Damit würde man dann über PORTB2 den Pin zwischen hochohmig und
PullUp (+5V über 50k) umschalten. Das erklärt auch warum es mit dem 10k
nicht geht weil der dann zu weit nach GND zieht und der MOSFET nicht mehr
durchschalten kann.
 
Hallo,

Ist das ??WIRKLICH?? ein BSS123 ??
Auf die Idee war ich auch schon gekommen, leider negativ :D. Denn BSS123 hab ich von Reichelt.

Habe ja leider keine Ahnung von C, aber muss das nicht "<<" sein?
Manchmal ist es sogar besser wenn man die Programmiersprache nicht kann, zu mindestens um den Fehler zu finden ;). Ich Löte jetzt mal den Widerstand weg, mal gucken was passiert. Allerdings hatte ich auch mal ein ganz einfaches Programm geschrieben, welches nur PB2 anspricht, da hatte ich den Fehler aber glaub ich nicht gemacht ;).

Mal schauen, wäre ja jetzt ein verdammt dämlicher Fehler :eek:.

Gruß
Fabian
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)