Hallo, ich möchte wissen, wie groß der Widerstand (Anhang) sein soll, bzw. ob 7,5 kOhm richtig sind. Der Transistor soll bei Spannung entweder durchschalten oder bei 0V "Sperren". Die Spannung vor dem Widerstand beträgt 5V (vom AVR). Nach welchem Wert vom Transistor (2N3904) richtet sich der Widerstand?
Welchen Widerstand hat das Relais? Wie groß ist B bzw. hfe des Transistors? Informiere dich auch über Freilaufdioden für induktive Lasten.
Innenwiderstand: 178 Ohm Mehr Infos habe ich leider nicht.
Freilaufdiode vergessen. http://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern Widerstand richtet sich nach: -Laststrom -hfe (Stromverstärkung) -Übersteurungsfaktor Basiswiderstand ist circa: hfe *(Steuerspannung - 0,7 V) / (Laststrom * Übersteuerungsfaktor) Gruß Christian EDIT: Waren andere schon schneller =)
Anhang ? Welchen Kollektorstrom willst du denn fliessen lassen ? Den Parameter den du suchst ist der Stromverstaerkungsfaktor B also das Verhaeltnis IC/IB = B Mal angenommen dein Kollektorstrom betraegt 10mA und die Stromverstaerkung B = 100 dann ergibt sich dein Basisstrom zu IB = IC/B = 0.1mA. Jetzt brauchst du noch die Spannung deines Ausganges. Nehmen wir mal 5V. An deinem Basisvorwiderstand fallen jetzt 5V - 0.7V = 4.3V ab. 0.7V = Spannung an der Basis-Emitterstrecke. Um den Transistor jetzt zuverlaessig durch zu steuern erhoehen wir den Basisstrom um einen Uebersteuerungsfaktor. Der liegt in der Groessenordnung von 2.. 10 normalerweise. Wir nehmen jetzt mal einen Faktor von 4 an. Also ergibt sich damit ein Basisstrom von IB*4 = 0.4mA. Jetzt kannst du den Vorwiderstand berechnen. R = 4.3V / 0.4mA = 10750 Ohm. Gewaehlt wird der naechste Normwert = 10KOhm Gruss Helmi
Zugegebenermaßen habe ich noch nicht alles Verstanden, aber wenn R2 = 10 kOHm ist, mache ich nichts falsch? Muss die Diode sein, oder würde es auch ohne gehen?
Mit 7,5k machst Du auch nichts falsch aber die Diode (mit Kathode an +) muss sein. Otto
Danke, ich habe noch die hier: http://de.rs-online.com/web/search/searchBrowseAction.html?method=searchProducts&searchTerm=625-5206&x=0&y=0 gefunden. KAnn ich diese nehmen?
@Helmi Ich weiss, du gingst von Annahmen aus, deshalb: Sein Kollektorstrom ist knapp 30mA (178 Ohm Last) und Otto meinte, B sein rund 60 bei 50mA, also wäre es ganz gut, wenn er den Basiswiderstand ca. um den Faktor 5 reduzieren würde: 1k5 ist mein Vorschlag. >Zugegebenermaßen habe ich noch nicht alles Verstanden, aber wenn R2 = 10 >kOHm ist, mache ich nichts falsch? IMHO ist dann dein Basisstrom zu klein, um sicher durchzusteueren. Mit 1k ... 2k liegst du viel besser.
@HildeK Da schliess ich mich deinem Vorschlag an. Als ich anfing eine Antwort zu schreiben hatte er noch nicht gesagt das sein Kollektorstrom 30mA betraegt. Deshalb auch meine Frage am Anfang "Anhang ?" Gruss Helmi
> sorry, aber ich habe nie etwas von 30mA gesagt ;-)
aber von 178 Ohm Innenwiderstand......
Otto
Achso, dann sollte ich vielleicht noch sagen, dass ich das ganze mit einem ATTINY ansteuere. Desshalb der Transistor, weil der Controller ja nicht so viel treiben kann. Ich habe erstmal einen Kiloohm verwendet, aber es funktioniert noch nicht. Wenn ich das freie Ende von R2 im Plan direkt mit 5V verbinde, schaltet das Relais und es fließen anständige 30mA. Aber wenn ich das Ende direkt mit dem Pin PB0 verbind und folgendes Programm laufen lasse passiert nichts. .include "tn12def.inc" ; Definitionsdatei für den Prozessortyp einbinden ldi r16, 0xFF ; lade Arbeitsregister r16 mit der Konstanten 0xFF out DDRB, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben ldi r16, 0b11111111 ; 0b11111100 in r16 laden out PORTB, r16 ; r16 ins IO-Register PORTB ausgeben ende: rjmp ende ; Sprung zur Marke "ende" -> Endlosschleife Ich habe alles sowohl mit 0b11111111 als auch mit 0b00000000 ausprobiert.
> Ich habe alles sowohl mit 0b11111111 als auch mit 0b00000000 > ausprobiert. Meine Frage war eigentlich, ob Du im Fall 0b00000000 das DDRB mit 0b11111111 geladen hast ? Otto
ne, ich habe den obrigen code nur mit beiden möglichkeiten (0b00000000 und 0b11111111) ausprobiert. Sonst habe ich nichts weiter gemacht. Fehlt da etwa etwas?
Nein - aber wenn es mit "1" nicht funktioniert, stimmt etwas anderes nicht. Wie sieht denn Deine Schaltung aus ? Otto
Ich habe den Teil mit der Spannungsvers. weggelassen, ist aber ok, denn Kontakt mit dem TINY habe ich ja. der Quarz und die Kondensatoren ist nicht drin.
Die Spannungsversorgung wäre interessant und ohne Freilaufdiode (1N4148) könnte auch der µC durcheinander kommen..... Otto
Hast du auch schon mal den Programmieradapter abgezogen ? Nicht das der dein Signal an PB0 (MOSI) auf 0V hält. Gruss Helmi
Na klar! Jumper JP1 nicht gesetzt, wie? Na gut, auf alle Fälle könntest Du ja einfach mal die Spannung am Port PB0 bei laufendem Programm messen.
Welchen Wert müsste ldi r16 denn in meiner Schaltung haben? Dann könnte ich das korrekte Programm rüberspielen und dann messen. Ist sonst am Programm alles ok?
R16 müsste für PB0 "1" enthalten - es funktioniert auch mit FF Evtl. ist Dein Problem aber die Spannungsversorgung, welche nicht reichen könnte, dass Relais zu speisen (z. B. bei Verwendung einer 9V-Batterie mit 5V-Spannungsregler) oder die fehlende Freilaufdiode sein, die Deinen Controller "abstürzen" lässt. Lass erst einmal eine LED blinken, um sicher zu sein, dass der Cpntroller läuft. Otto
Es fehlt immer noch die Freilaufdiode, und es ist KEINE gute Idee, das Relais aus derselben Spannungsquelle wie den uC zu versorgen. Olli
Ich bin mir noch nicht ganz sicher, aber ich glaube es funktioniert alles - dank Eurer hilfreichen und schnellen Tipps! Vielen Dank! Auf die Freilaufdiode etc. bin ich so nicht drauf gekommen. Aber nochmal eine andere Frage: Gibt es in Assembler soetwas wie ein Delay? Ich möchte in einer Endlosschleife den Port von 0x00 auf 0xff mit einer Wartezeit von jeweils 1s schalten.
> Gibt es in Assembler soetwas wie ein Delay? Ich möchte in einer > Endlosschleife den Port von 0x00 auf 0xff mit einer Wartezeit von > jeweils 1s schalten es geht mit mehreren (3) verschachtelte Schleifen (macht man so aber nicht) Otto
Versuche es mal so: ldi r12, $10 LOOP2: ldi r11, $FF LOOP1: ldi r10, $FF LOOP0: dec r10 brne LOOP0 dec r11 brne LOOP1 dec r12 brne LOOP2 Otto
Invalid Register (ldi r12 kennt er scheinbar nicht) wieso macht man das so nicht? Kann man diesen C-Code nicht "direkt" übersetzen?: while(1) { Port1=0xff; _Delay_ms (500); Port1=0x00; _Delay_ms (500); }
ach ja - Du kannst nicht jedes Register mit "ldi" ansprechen mit r15 bis r31 müsste es aber gehen. Die Zeit ist abhängig von Deiner CPU-Frequenz: ldi r19, $10 LOOP2: ldi r18, $FF LOOP1: ldi r17, $FF LOOP0: dec r17 brne LOOP0 dec r18 brne LOOP1 dec r19 brne LOOP2 Nein, ein C-Programm kannst Du nicht einbinden. Otto
Man macht es so nicht, weil der Controller in einer Delay-Schleife nichts sinnvolles tut - eine Alternative ist z. B. die Verwendung eines Timers (siehe Tutorium) Otto
cool, das gibt beim kompilieren keine Fehler. Ich benutze den Internen Taktgeber des ATTINY 12. Ich messe mit meinem Multimeter jetzt ca. 200mV. - Ein Indiz dafür, das alles zu schnell geht?
Nur wenn Du ein- und ausschaltest. An Deiner Stelle würde ich eine LED mit 1k Vorwiderstand an PB0 schalten. PB0 o---/\/\/\--->|--- GND Da siehst Du, was passiert. Otto
Kann man keine Wartezeit einbauen, die sicher 0,5s (oder etwas mehr oder weniger, aber zumindest im Bereich) wartet, wenn man weiss, dass ich die Interne Taktung verwende? Das mit der LED ist bestimmt eine gute Idee, aber auf meiner geätzten Platine schlecht durchführbar. Lieber würde ich ein Programm haben, was einfach nur endlos blinkt.
Schalt Deine LED über Deinen "JP1" (Kathode an den Basiswiderstand) dann sollte sie auch hinreichend hell leuchten. Eine definierte Wartezeit kannst Du durch ausrechnen erhalten. Sieh im Datenblatt nach, wieviel Takte ein "dec" und ein "brne" braucht und multipliziere dies mit dem Kehrwert der CPU-Frequenz. Das Ausrechnen kann auch der Compiler übernehmen. Die bessere Möglichkeit ist es, einen Timer zu verwenden. Gruss Otto
Im Tiny12-Datenblatt steht aber nicht wie lange die Anweisungen "dec" und "brne" brauchen. Wie kann ich die CPU-Frequenz ermitteln, wenn ich keinen externen Quartz angeschlossen habe? Wenn ich ein Timer nehmen soll, geht dass dann auch wirklich mit Tiny12 und assembler? Wie würde soetwas aussehen?
Hallo Noname, es steht alles im Datenblatt - die Anzahl der Taktzyklen auf Seite 85 ! http://www.atmel.com/dyn/resources/prod_documents/doc1006.pdf Die Verwendung des Timers ist im Tutorium beschrieben. Otto
ja gut, "brne" braucht einen halben Taktzyklus und "dec" einen ganzen. Aber ich kenne ja nicht meine Taktfrequenz. Im tutorial ist aber etwas anderes beschrieben. Ich suche ein Endlosprogramm, welches die LED mit 0,5 Hz blinken lässt.
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.