Kani-Coaching (C lernen mit Nomis)

Hi Nomis,

Ich denke schon das das so funktioniert wie Kani meint.
Kani hatte den Effekt nämlich als er bei seinen 3 Gemultiplexten 7Segmentanzeigen versehentlich einen NPN eingebaut hatte. Das Resultat war das eine Anzeige eben genau dann leuchtete als sie nicht sollte.
das kann funktionieren. Mit der Betonung auf "kann". Ich würde dafür aber
nicht die Hand ins Feuer legen. Und nacher Fehler suchen weil sich die
Pegelverhältnisse am Transistor durch irgendeinen Umstand verändert haben
und es wegen 0,1V Veränderung auf einmal nicht mehr funktioniert hätte ich
keine Lust :D

Die Transistoren werden doch immer noch durchschalten:
Beim NPN floss der Basisstrom bei HIGH(am PORT) über den Basisvorwiderstand durch die Basis weiter zu den LEDs samt Vorwiderständen wodurch der Transistor durchschaltete.
Das ist es ja. der Basisstrom fließt durch den gesamten Laststromkreis mit
durch. Wenn der Laststrom ansteigt, dann verändern sich die Pegel und an
der Basis fällt evtl nicht mehr genug zum durchsteuern ab. Dann glimmt die
Anzeige so vor sich hin. Außerdem verändert sich der
Gleichstromverstärkungsfaktor des Transistors dadurch. Er wird erheblich
weniger und man müßte theoretisch mehr Basisstrom verwenden um ihn
gleich gut durchzusteuern.

Es kann also gehen aber ich würde es als "suboptimal" bezeichnen.

Und nun ruft das Bett ... :sleep:

Gruß
Dino
 
Hi Kani,

Naja, ich brauche nur Strom für den Controller selbst. Da kommen 32 Taster dran und die USART-Verbindung, dass war es.
Wenn Du nen Low-Power-Mega verwendest und die RS232 ohne MAX232
sondern mit ner Hilfschaltung baust _könnte_ es funktionieren.
Aber erschlag mich nicht, wenn es nicht funktioniert. Außerdem ist mit
16MHz dann auch Essig. Ich würde dann auf nen Keramikresonator mit so
400-500kHz runtergehen um den Stromverbrauch zu drosseln. Evtl
sogar noch weiter (mit nem Uhrenquarz auf 32,7kHz betreiben).
Das sind aber ziemliche Strickschaltungen ...:rolleyes:

Gruß
Dino
 
Okay also. Zwei Transistoren => 2 Pins (Projekt 1)
Uuuunndd. Stromversorgung => "Netzteilpflicht" (Projekt 2)
 
Hab heute mal mit meinem ersten Projekt angefangen. Das mit der Vitrine.

Leider läuft das alles nicht so:
Wo alles dranhängt, steht im Code ganz oben.

Wollte bevor ich weitermache, erstmal die 7-Segmente testen, deßwegen ist da noch nicht mehr.

Leider leuchten die Anzeigen nicht.



CodeBox c
/* Vitrinen-Schaltung
Version: 0.1
Datum: 13.04.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/


/* PE 0-2 = Taster für rauf, runter und Moduswahl
PD 6-7 = Transistoren (BC557)
PC 0-7 = Kathoden der Segmente

PA0 = Rot unten
PA1 = Blau unten
PA2 = Grün unten
PA3 = Rot mitte
PA4 = Blau mitte
PA5 = Grün mitte
PA6 = Rot oben
PA7 = Blau oben
PB0 = Grün oben
*/

//#define F_CPU 16000000UL;

#include <avr/io.h>
//#include <util/delay.h>



int main (void)
{
DDRE = 0b00000000; // Taster auf Eingang (PE0-2)
PORTE = 0b00000000; // Int. Pullups aktivieren

DDRC = 0b00000000; // Segmente der 7-Segment-Anzeige
PORTC = 0b00000000; // Alles auf Low da die Segmente die Kathoden sind

DDRD = 0b11000000; // PD 6-7 auf Ausgang - Das sind die Transistoren
PORTD = 0b11000000; // Das schaltet den PNP-Transistor an PD6-7 ein

int aktuelles_programm = 0;
int modus = 0;
static unsigned char zustand_taster_hoch;
static unsigned char zustand_taster_runter;
static unsigned char zustand_taster_modus;
int seg_zehner, seg_einer, ziffern_zuweiser;
unsigned char seg[] =
{
0b11100111,//0
0b10000100,//1
0b11010011,//2
0b11010110,//3
0b10110100,//4
0b01110110,//5
0b01110111,//6
0b11000100,//7
0b11110111,//8
0b11110110,//9
};


while(1)
{

ziffern_zuweiser++;

// =============================
// ===== TASTER ABFRAGEN =====
// =============================

// Taster zum hochschalten

if(zustand_taster_hoch == 0 && !(PINE & (1<<PE0))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_hoch = 1;
}
else if (zustand_taster_hoch == 1 && !(PINE & (1<<PE0))) //Taster wird gehalten
{
zustand_taster_hoch = 2;
}
else if (zustand_taster_hoch == 2 && (PINE & (1<<PE0))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_hoch = 3;
}
else if (zustand_taster_hoch == 3 && (PINE & (1<<PE0))) //Taster losgelassen
{
zustand_taster_hoch = 0;
}

// Taster zum runterschalten

if(zustand_taster_runter == 0 && !(PINE & (1<<PE1))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_runter = 1;
}
else if (zustand_taster_runter == 1 && !(PINE & (1<<PE1))) //Taster wird gehalten
{
zustand_taster_runter = 2;
}
else if (zustand_taster_runter == 2 && (PINE & (1<<PE1))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_runter = 3;
}
else if (zustand_taster_runter == 3 && (PINE & (1<<PE1))) //Taster losgelassen
{
zustand_taster_runter = 0;
}

// Taster für die Moduswahl (Programm <-> Durchlaufgeschwindigkeit)

if(zustand_taster_modus == 0 && !(PINE & (1<<PB2))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_modus = 1;
}
else if (zustand_taster_modus == 1 && !(PINE & (1<<PB2))) //Taster wird gehalten
{
zustand_taster_modus = 2;
}
else if (zustand_taster_modus == 2 && (PINE & (1<<PB2))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_modus = 3;
}
else if (zustand_taster_modus == 3 && (PINE & (1<<PB2))) //Taster losgelassen
{
zustand_taster_modus = 0;
}

// =================================
// ===== TASTER VERARBEITEN =====
// =================================

if(zustand_taster_hoch == 1)
{
aktuelles_programm++;
}
if(zustand_taster_runter == 1)
{
aktuelles_programm--;
}
if(zustand_taster_modus == 1)
{
modus++;
}

// =========================
// 7-SEGMENT-ANZEIGEN =====
// =========================

// Anzeige splitten

seg_zehner = aktuelles_programm/10;
seg_einer = aktuelles_programm-(seg_zehner*10);

// Transistoren schalten

if(ziffern_zuweiser > 2)
{
ziffern_zuweiser = 1;
}

if(ziffern_zuweiser == 1)
{
PORTD = 0b01111111;
PORTC =~ seg[seg_zehner];
}
if(ziffern_zuweiser == 2)
{
PORTD = 0b10111111;
PORTC =~ seg[seg_einer];
}




} // END-WEHILE(1)




} // END-MAIN

Die Transistoren sind so angschlossen:
Datenblatt vom BC557C
Emitter: +5V
Basis: Zur Anode der erste bzw. zweiten 7-Segment-Anzeige
Kollektor: Zu PD 6 bzw. PD7
 
Hi Kani,

Leider läuft das alles nicht so:
...
..
.
..
...
Die Transistoren sind so angschlossen:
Datenblatt vom BC557C
Emitter: +5V
Basis: Zur Anode der erste bzw. zweiten 7-Segment-Anzeige
Kollektor: Zu PD 6 bzw. PD7
das Problem liegt nicht im Quellcode sondern an den Transistoren. Ich hab es
gerade geschrieben aber irgendwie ist der Text mal wieder nicht ins Board
gewandert sondern ins Nirvana. Also nochmal ... :(

Du hast Kollektor und Basis vertauscht. Die Basis ist der Steueranschluß.
Mach die Basis aber NICHT DIREKT an PD6 bzw PD7 sondern über nen
Vorwiderstand von 4,7k..10k. Sonst geht den Transistoren der Hut hoch.
Die mögen es nicht besonders wenn du sie mit zuviel Basisstrom kochst.

Ich hab dir mal nen besseres Datenblatt rausgesucht ...
Anhang anzeigen BC557_pnp_Fairchild.pdf
Da stehen wenigstens die Steuerkennlinien mit drin. Seite 2 , Fig.1
Da sieht man, das der Basisstrom sich im Microampere-Bereich abspielt.
Da drüber geht der Transistor in die Sättigung. Das ist nicht weiter
schlimm, so lange man den maximalen Basisstrom nicht überschreitet.
Ich rechne bei den Kleinsignal-Transistoren normalerweise immer so mit
0,5..1mA Basisstrom für die Ansteuerung. Das ist nicht zu viel und sie
steuern absolut sicher durch. Liegen aber damit auch schon in der
Sättigung.

Auf der Steuerkennlinie mal nachsiehst ... Wenn du 5V bei 15mA
durchsteuern willst, dann würden schon etwa 120uA Basisstrom
ausreichen. Das sind 0,12mA ! Nicht wirklich viel ;)

In deinem Datenblatt kann man zusätzlich lesen, das der Transistor maximal
200mA Basis- oder Kollektor-Strom aushält (peak collector current /
peak base current) danach gibt es eine Rauchwolke und es hat sich
erledigt.

Gruß
Dino
 
Ok, dann schmeiß ich die Transistoren mal weg und mach vor PD6 und 7 noch einen 10k Widerstand. :D:cheers:
 
Ne, ich dachte die wären kaputt wenn man keinen Widerstand nimmt.
 
Ich hab jetzt:
1. 10k Widerstand -> Zum Controller
2. Zu den Anzeigen
3. +5V

Irgendwie geht das nicht. Letztes mal hatte ich 2,2k Widerstände.
 
Yip, hab ich grad gesehen. - Kani???


Gruss,

Michael
 
Hi Kani,

Ich hab jetzt:
1. 10k Widerstand -> Zum Controller
2. Zu den Anzeigen
3. +5V

Irgendwie geht das nicht. Letztes mal hatte ich 2,2k Widerstände.
Von welchem Transistor-Pin ?? Irgendwie nur die halbe Info.
So nach dem Motto "Die Autobahn geht nach Stuttgart" von München aus
oder von Hannover oder von Berlin ???

Sieh dir doch mal die Schaltbilder an, die wir damals schon zusammengemalt haben.
Da ist doch eigentlich alles drin ...

Ich sag nur DDR-Register.

Yip, hab ich grad gesehen. - Kani???

Wo alles dranhängt, steht im Code ganz oben.

Wollte bevor ich weitermache, erstmal die 7-Segmente testen, deßwegen ist da noch nicht mehr.

Leider leuchten die Anzeigen nicht.


CodeBox c

/* PE 0-2 = Taster für rauf, runter und Moduswahl
PD 6-7 = Transistoren (BC557)
PC 0-7 = Kathoden der Segmente

----- PortA -----
=A7= =A6= =A5= =A4= =A3= =A2= =A1= =A0=
bl-O rt-O gn-M bl-M rt-M gn-U bl-U rt-U

----- PortB -----
=B7= =B6= =B5= =B4= =B3= =B2= =B1= =B0=
---- ---- ---- ---- ---- ---- ---- gn-O
*/

//#define F_CPU 16000000UL;

#include <avr/io.h>
//#include <util/delay.h>

int main (void)
{
DDRE = 0b00000000; // Taster auf Eingang (PE0-2)
PORTE = 0b00000000; // Int. Pullups aktivieren

DDRC = 0b00000000; // Segmente der 7-Segment-Anzeige
PORTC = 0b00000000; // Alles auf Low da die Segmente die Kathoden sind

DDRD = 0b11000000; // PD 6-7 auf Ausgang - Das sind die Transistoren
PORTD = 0b11000000; // Das schaltet den PNP-Transistor an PD6-7 ein
1. Wie war das mit den Datenrichtungen ? (Zeilen 21, 27)
2. Was benötigt ein PNP-Transistor zum durchschalten ? +5V oder GND ? (Zeile 28)
3. Wie schaltet man die Pullups ein ? (Zeile 22)

Das sollte aber als Hilfe reichen. Hast Du doch alles schon mal gehabt ... ;)

Und jetzt nicht einfach rumprobieren ... Lies dir die Erklärungen die wir hier lang
und breit gemacht haben nochmal genau durch. Da stand das schon mal alles drin.
Also durchlesen und verstehen. Wenn es dann noch Probleme gibt, dann frag nochmal
nach dem nach, was unklar ist.

Gruß
Dino
 
1,2 und 3 bezog sich auf dein gepostetes Datenblatt des BC557.

Also,
Emitter = +5V
Basis = 2,2k Widerstand zu PD6 bzw. PD7
Kollektor = Zur Anode der Anzeige
So steht es hier:
http://www.avr-praxis.de/forum/showpost.php?p=2502&postcount=28

Die Register waren so wie bei dem DMX dingens.

Ich schau mal weiter

_______________
Edit: Ich raffs nich'.


CodeBox C
DDRE    = 0b00000000;    //    Taster auf Eingang (PE0-2)
PORTE = 0b11111111; // Int. Pullups aktivieren

DDRC = 0b11111111; // Segmente der 7-Segment-Anzeige
PORTC = 0b00000000; // Alles auf Low da die Segmente die Kathoden sind

DDRD = 0b11111111; // PD 6-7 auf Ausgang - Das sind die Transistoren
PORTD = 0b11000000; // Das schaltet den PNP-Transistor an PD6-7 ein

Bei DDRE und PORTE bin ich mir ziemlich sicher.

DDRC und PORTC bin ich mir auch sicher: Um die Segmente zu steuern muss man dann PORTC auf 1 setzen.

DDRD und PORTD: Da glaube ich, ist es auch richtig.
 
Hi Kani,

Edit: Ich raffs nich'.
...
...
Bei DDRE und PORTE bin ich mir ziemlich sicher.

DDRC und PORTC bin ich mir auch sicher: Um die Segmente zu steuern muss man dann PORTC auf 1 setzen.

DDRD und PORTD: Da glaube ich, ist es auch richtig.
Mönsch Kani ! Jetzt machst du mich aber traurig :cray:
Hatten wir doch alles schon ...
DDRx (Data Direction Register) : Bit auf 0 = Eingang , Bit auf 1 = Ausgang
PORTx (Ausgangsregister) : Bei Anschluß auf Eingang ... 0=kein Pullup , 1=Pullup

Sieh dir deine 6 Zeilen nochmal an ...

Von den Tastern bekommst du Informationen, an die Transistoren und
Displays willst du Informationen ausgeben.

Teilweise stimmt es und teilweise sind da noch ein paar Fehler drin.

Gruß
Dino
 
Also, ich hab mir die Skizze von Nomis angeschaut, als ich das geschrieben habe.
http://www.avr-praxis.de/forum/attachment.php?attachmentid=845&d=1237749754

Alsooo:

Taster:
DDRE = 0 // Eingang
PORTE = 0 //pullup aktiv

Segmente:
DDRC = 1 //Ausgang
VCC (Bild) ist die Kathode der Segmente => Wenn S2 geschlossen ist (PORTC = 0 fließt der Strom direkt nach Masse. Also leuchtet das Segment. Wenn S1 geschlossen ist (PORTC = 1) S2 offen und die masse fehlt.
Richtig?
Also: DDRC = 1 //Ausgang | PORTC = 1 //Aus / PORTC = 0 //An

Transistoren:
Das versteh ich noch nicht. Was brauch der BC557 damit er schaltet...?
 
Hi Kani,

Also, ich hab mir die Skizze von Nomis angeschaut, als ich das geschrieben habe.
http://www.avr-praxis.de/forum/attachment.php?attachmentid=845&d=1237749754

Alsooo:

Taster:
DDRE = 0 // Eingang
PORTE = 0 //pullup aktiv
paßt ! :)

Segmente:
DDRC = 1 //Ausgang
paßt auch ! :)

VCC (Bild) ist die Kathode der Segmente => Wenn S2 geschlossen ist (PORTC = 0 fließt der Strom direkt nach Masse. Also leuchtet das Segment. Wenn S1 geschlossen ist (PORTC = 1) S2 offen und die masse fehlt.
Richtig?
Also: DDRC = 1 //Ausgang | PORTC = 1 //Aus / PORTC = 0 //An
Paßt alles ! :) bis auf das mit der Kathode. ... Das ist die Anode. (Pluspol)
Die Kathode ist der Minuspol der Diode und liegt in dem Schaltplan am PA0
Kannst Du dir ganz gut merken. Das Dreieck zeigt die Stromrichtung in der
Diode an und den Strich an der Kathode kann man auch als Minuszeichen
interpretieren oder auch als |< (K) wenn man es auf die Seite legt :D

Transistoren:
Das versteh ich noch nicht. Was brauch der BC557 damit er schaltet...?
Also ... wenn die Transistoren leiten sollen (durchschalten) dann muß ...

- beim NPN-Transistor die Basis positiver sein als der Emitter.

- beim PNP-Transistor die Pasis negativer sein als der Emitter.

Der Emitter ist der Anschluß mit dem Pfeil. Die Pfeilrichtung zeigt dir den
Strom an, der zum durchsteuern benötigt wird und auch von wo nach wo
er fließen muß. Ist mit der Eselsbrücke eigentlich ganz gut zu merken.

Transistortypen ... (ich nehme eigentlich nur noch die 5er Serie) ...
- 546, 547, 548 sind NPN (ne 4 in der Mitte)
- 556, 557, 558 sind PNP (ne 5 in der Mitte)
Das ist bei anderen Serien aber wieder anders ...
- BC327, BC328 sind PNP
- BC337, BC338 sind NPN

Man kann sich auch mit dem Typ merken was er zum durchsteuern braucht ...

NPN braucht eine positivere Basis zum durchsteuern
PNP braucht eine negativere Basis zum durchsteuern

So , das war erst mal ne Menge Stoff ... :D Ich glaube, das mußt du jetzt
erst mal in Ruhe verdauen ... :)

Gruß
Dino
 
Eine negative Basis....die ist ja am Controller. Also muss ich Strom ausschalten, damit ein PNP-Transistor "angeht", da der Strom ja kleiner als meine +5V vom Netzteil (Emitter) sein muss, richtig?
 
Eine negative Basis....die ist ja am Controller. Also muss ich Strom ausschalten, damit ein PNP-Transistor "angeht", da der Strom ja kleiner als meine +5V vom Netzteil (Emitter) sein muss, richtig?
Oh weh, da fehlt noch viel grundlegenderes als nur das Verständniss von Transistoren. Das ist leider etwas das man entweder in seiner Ausbildung lernt oder etwas das man Büchern oder dem Internet in langen Gefechten entreißen muss.

Das mein ich:
da der Strom ja kleiner als meine +5V vom Netzteil (Emitter) sein muss, richtig?
Was jetzt?
oder
doch Spannung?
Du musst dir überlegen wie du dir ein Verständniss für Strom und Spannung aufbaust.
 
Ich kenne den unterschied. XD

Dann reden wir mal von der Spannung. Um den Transistor anzuschalten, muss die Spannung die an der Basis anliegt (;)) kleiner sein, als die Spannung ( +5V ) am Emitter. Richtig?
 

Ü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)