mikrocontroller.net

Forum: Compiler & IDEs IR-Sender Bauen


Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde gerne mit einen ATMEGA8 die Lautstärke meines Fernsehers 
einstellen können. Ich habe schon herausgefunden das mein Sony Fernseher 
mit einer Trägerfrequenz von 40kHz läuft.
Meine IR-Diode hängt am Port PB2.

Nur ich schaffe es einfach nicht die LED mit 40kHz blinken zu lassen.
Kann mir daher einer sagen wie ich den Timer einstellen muss wenn der 
Controller mit 12MHz läuft?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nur ich schaffe es einfach nicht die LED mit 40kHz blinken zu lassen.
>Kann mir daher einer sagen wie ich den Timer einstellen muss wenn der
>Controller mit 12MHz läuft?

Taschenrechner und Datenblatt?

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum ein "?"
doch doch, du kannst sicher sein, das steht dort.

Mag sein, das man nicht exakt 40khz erwischt, aber das ist garnicht so 
wichtig, da gibt es große Tolleranzen.

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mir folgendes ausgerechnet:
12000000 / 1024 = 11718,75
11718,75 * 3 = 35156,25 Hz = 35,15625kHz


TCCR1A = (1<<COM1B0);
TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);
OCR1B = 0x02;
sei();


und in der Hauptschleife dann nur noch den Timer ein und ausschalten!


Sollte das dann so gehen?

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es fehlt noch, dass du interrupts anschaltest.

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe ich doch mit sei();

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
35 khz sind allerdings etwas weit daneben. kann aber trotzdem klappen => 
ausprobieren.

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>es fehlt noch, dass du interrupts anschaltest.
habe ich mit sei;

>35 khz sind allerdings etwas weit daneben. kann aber trotzdem klappen => 
ausprobieren.
gibt es eine möglichkeit das ich näher heran komme ohne den quarz zu 
tauschen?

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe mal folgendes Programm geschrieben aber irgendwie geht das 
nicht!
Habe leider kein Oszilloskop um die Frequenz zu testen!!!
#define F_CPU 12000000L

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

int main(void)
{

    //TCCR1A = (1<<COM1B0);
    TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);
    OCR1B = 0x02;
    sei();
    while(1)
    {

        IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);

        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);

        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        _delay_ms(6.0); 
        _delay_ms(6.0); 
        _delay_ms(6.0); 
        _delay_ms(6.0); 
        _delay_ms(6.0); 

    }
    
    return (1);
}

void IR_LED_ON(void){
  TCCR1A = (1<<COM1B0);
}

void IR_LED_OFF(void){
  TCCR1A = 0;
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ichim schrieb:
> Habe mir folgendes ausgerechnet:
> 12000000 / 1024 = 11718,75
> 11718,75 * 3 = 35156,25 Hz = 35,15625kHz
>
>
> TCCR1A = (1<<COM1B0);
> TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);
> OCR1B = 0x02;
> sei();

1) Ein OCR-Wert von 2 bedeutet "/ 3", nicht "* 3".

2) Beim Pin-Toggeln fehlt für die Berechnung der Ausgangsfrequenz auch 
noch der Faktor 2.

2) OCR1B? Für den CTC-Mode muss der Wert nach OCR1A.

3) Thema Interrupt freigeben: die Vorredner meinten damit nicht nur 
global mit sei(), sondern auch speziell den Timer-Interrupt. Ist aber 
beides hier unnötig, du hast schließlich gar keine ISR.

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein programm zu deinem Problem ohne ISR. Ist ja nicht nötig 
wenn du nur eine Aufgabe hast.

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>1) Ein OCR-Wert von 2 bedeutet "/ 3", nicht "* 3".
und was ist der unterschied zwischen beiden?


>2) Beim Pin-Toggeln fehlt für die Berechnung der Ausgangsfrequenz auch
noch der Faktor 2.

12000000 / 1024 = 11718,75
40000 / 11718,75 = 3,413333 / 2 = 1,70667 = OCR1A = 0x01


Probe:
   Mhz     Vorteiler     OCR1A         Toggeln
12000000 / 1024 = 11718,75 *2 = 23437,5 * 2 = 46,875kHz

Naja Passt das noch???
Kommt man irgendwie näher an die Frequenz????

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ichim schrieb:
>>1) Ein OCR-Wert von 2 bedeutet "/ 3", nicht "* 3".
> und was ist der unterschied zwischen beiden?

Hä? Du erwartest von mir jetzt nicht ernsthaft, den Unterschied zwischen 
Multiplikation und Division zu erklären, oder?

> Naja Passt das noch???

Nein. Dein Rechenweg ist immer noch falsch.

Übrigens gibt es im Datenblatt exakt zu dieser Anwendung (Pin-Toggeln im 
CTC-Modus) eine Formel für den Zusammenhang OCR-Wert <-> Frequenz.

Autor: Marvin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum überhaupt den Vorteiler von 1024?

12MHz / (2 * 40KHz) = 150! Das ist dein Zählerwert, fertig.
Dann hast du ein 40KHz Rechteck.

Deine Rechnung oben kann ich nicht nachvollziehen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marvin schrieb:

> 12MHz / (2 * 40KHz) = 150! Das ist dein Zählerwert, fertig.
> Dann hast du ein 40KHz Rechteck.

Naja, eigentlich fehlt noch ein "-1", aber dieser kleine Fehler wird den 
Empfänger sicher nicht stören. ;-)

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Echt super Forum!!!
Habe anschließend den funktionierenden Code eingestellt um ihn für die 
nachwelt aufzubewahren!!!
#define F_CPU 12000000L

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

int main(void)
{

    TCCR1B = (1<<WGM12) | (1<<CS10);
    OCR1A = 149;
    sei();
    while(1)
    {

        IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);

        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);

        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);


        //dieses delay steht ganz unten aud dieser seite
                  http://picprojects.org.uk/projects/sirc/sonysirc.pdf
        _delay_ms(45);

    }
    
    return (1);
}

void IR_LED_ON(void){
  TCCR1A = (1<<COM1B0);
}

void IR_LED_OFF(void){
  TCCR1A = 0;
}


DANKE!!!!

Autor: Meerschweinchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WOZU SCHALTEST DU DIE INTERRUPTS MIT SEI EIN? DENK MAL NACH!!!

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wofür includest du eigentlich interrupt.h?
Aber sonst, super Programm.
Werde ich auch verwenden!
Valentin

Autor: ichim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interrupts brauche ich für den RS232 Empfang.
Der empfänger wartet mähmlich auf 3 Bytes auf der Seriellenschnittstelle
1.Byte Protokoll
2.Byte Adresse
3.Byte Daten

somit kann ich über RS232 so ziemlich alle geräte bei mir Ein- und 
Ausschalten

Anbei nochmals der neueste quelltext der SIRC-Sende routine:
einfach Send_SIRC(1,20) aufrufen um den TV stumm zu schalten
void Send_SIRC_Start(void){
    IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);
}

void Send_SIRC_0(void){
    IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
}

void Send_SIRC_1(void){
    IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
}

void Send_SIRC_DATA(uint8_t daten, uint8_t lenght){
    char i;

    for(i=0;i<lenght;i++)
    {
      if ((daten >> i)&1)
         {Send_SIRC_1();}
      else
         {Send_SIRC_0();}
    }
}

void Send_SIRC(uint8_t address, uint8_t command){
  TCCR1B = 0;
  TCCR1B = (1<<WGM12) | (1<<CS10);
  OCR1A = 149;
  Send_SIRC_Start();
  Send_SIRC_DATA(command, 7);
  Send_SIRC_DATA(address, 5);
  _delay_ms(45);
}

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich versuche den Code zu verstehen. Ist mir soweit auch alles klar. Ich 
verstehe nur noch nicht, an welcher Stelle eine Umwandlung von Dezimal 
nach Binär passiert.

Lt. ichim schaltet der Aufruf "Send_SIRC(1,20)" den Fernseher aus.

Passiert die Umwandlung hier ?
>>if ((daten >> i)&1)

Übersetzung : arbeite die Variable "daten" bitweise(!) nach rechts ab ?

Was bedeutet jier die Bitmanipulation UND 1 ?

Kann mich da mal jemand aufklären ?
Danke und Gruß
tom

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Artikel habe ich vorher schon gelesen. Finde da aber irgendwie nicht 
die Lösung zu meiner Frage ??

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> if ((daten >> i)&1)
>> Übersetzung : arbeite die Variable "daten" bitweise(!) nach rechts ab ?
>> Was bedeutet jier die Bitmanipulation UND 1 ?

& ist hier C-Operator für Bitweise-UND

Bitweise-UND Wahrheitstabelle:
a  b a&b
========
0  0  0
1  0  0
0  1  0
1  1  1

daten = 0b00110101; // Beispiel
1 dezimal = 0b00000001 binär = 0x01 hexadezimal

i  daten>>i  (daten>>i)&1
=========================
0  00110101    00000001
1  00011010    00000000
2  00001101    00000001
3  00000110    00000000
4  00000011    00000001
5  00000001    00000001
6  00000000    00000000
7  00000000    00000000
8  00000000    00000000

Ist doch nicht schwer, oder?

>> "Send_SIRC(1,20)"

Schickt also eine 1 und dann neunzehn Mal eine 0. Schwupp ist der TV 
aus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tom schrieb:
> Den Artikel habe ich vorher schon gelesen. Finde da aber irgendwie nicht
> die Lösung zu meiner Frage ??

Mit welchem Teil dieses Satzes aus dem Artikel

<quote>
Bits prüfen
Will man prüfen ob ein oder mehrere Bits in einer Variable gesetzt oder 
gelöscht sind, muss man sie mit einer Bitmaske UND verknüpfen. Die 
Bitmaske muss an den Stellen der zu prüfenden Bits eine '1' haben, an 
allen anderen eine '0'.
</quote>
hast du Schwierigkeiten?

(Das ist ernst gemeint. Wenn du damit ein Problem hast, kann man darüber 
nachdenken den Artikel so zu verändern, dass das Problem ausgeräumt 
wird)

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst einmal vielen Dank für die Hilfe.

Dann versuch ich es mal:


Sende 1,20 (Adress, Befehl)

Der Befehl "20" ist 7 bit lang:

>> for(i=0;i<lenght;i++)
>> if ((daten >> i)&1)
>>         {Send_SIRC_1();}
>>         else
>>         {Send_SIRC_0();}


Befehl  00101000    &  00000001  0 --> sende 0
  00010100    &  00000001  0 --> sende 0
  00001010    &  00000001  0 ..
  00000101    &    00000001  1 --> sende 1
  00000010    &   00000001  0
  00000001    &  00000001  1
  00000000    &  00000001  0

Die Adresse "1" ist 5 bit lang:

Adress  00000001  00000001  1
  00000000  00000001  0
  00000000  00000001  0
  00000000  00000001  0
  00000000  00000001  0
  00000000  00000001  0


Habe ich das richtig verstanden ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tom schrieb:

> Habe ich das richtig verstanden ?

Perfekt

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:-) geil
vielen Dank

Autor: Johannes S. (gnubert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich habe hier ienen atmega32 auf einen Pollin Net IO Board, dürfte ja 
der gleiche code sein wenn ich das richtig aus dem Datenblat entnommen 
habe....

Habe die LED wie auf dem anhang angeschlossen. Es hat einmal geblinkt, 
aber bekomme es jetzt nicht mehr zum laufen...
jemand ne idee?

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LED tot wegen zu hohem Strom. Oder deine Software liest den Port zurück 
und sieht dann immer ne Null.

Autor: Johannes S. (gnubert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstmal danke für die Antwort.
Die LED scheint nich zu laufen, habe sie testweise mit Widerständen an 
VCC und Grpund angeschlossen. Hier leuchtet sie, wenn auch schwach, aber 
es tut sich was...


> deine Software liest den Port zurück und sieht dann immer ne Null.

Damit meinst du wohl diese Zeile oder??
TCCR1A = 0;

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine IR-LED leuchtet? Fürs Auge oder mit IR-Empfänger gemessen? Die 
meisten IR-LEDs halten nur 100mA Dauerstrom aus. Hoffe, du weißt das.

Sieht nach AVR aus. Da kenne ich mich nicht aus. Das Problem gibts aber 
bei vielen Controllern, z.B. 8051. Ube(sat) ist unter der Schwelle zu 
HIGH.

Autor: Johannes S. (gnubert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die IR - LED leuchtet wenn ich sie durch meine Handykamera 
betrachte... (aber eben nicht am Pin mt der PWM)

Verstehe nicht 100% was du mit Ube(sat) meinst. Vermute mal, das du auf 
die Spannung am Controler-Pin anspielst?! Die soll nicht ausreichend 
sein um die Diode durchzuschalten? Gut möglich, habe leider kein 
Messgerät hier ums zu überprüfen.

Jemand noch ne Idee wie ich dem Problem systematisch auf den Grund gehen 
kann?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir im zuletzt geposteten Programm auffällt:
Die entsprechenden Port-Pins werden nie auf Ausgang gesetzt.

Wenn mich mein Gedächtnis nicht trügt, dann werden die aber nicht 
automatisch auf Output gesetzt, nur weil man da eine PWM drauf schaltet.

Damit würde sich deine Beobachtung wie folgt erklären:
Was der Timer macht: Er schaltet ständig den Pullup Widerstand zu und 
ab. Das reicht aber nicht, damit eine LED leuchtet.

Autor: Johannes S. (gnubert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für den Tipp. Habe das Programm wie folgt geändert:
void IR_LED_ON(void){
  TCCR1A |= (1<<COM1B0);
   DDRD |= (1 << PD5 );
}

void IR_LED_OFF(void){
  TCCR1A = 0;
  DDRD &= ~(1 << PD5 );

}

Jetzt blinkt eine normale (grüne) LED mit der oben geposteten 
Transistorschaltung. Aber nur wenn ich an das Basisbein des Transistos 
zusätzlich meinen Daumen halte. hää?

Autor: Johannes S. (gnubert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kleine Korrektur zu dem Schaltbild, mein Tranistor hängt an OC1B...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes Xy schrieb:
> Ok, danke für den Tipp. Habe das Programm wie folgt geändert:
>
>
void IR_LED_ON(void){
>   TCCR1A |= (1<<COM1B0);
>    DDRD |= (1 << PD5 );
> }
> 
> void IR_LED_OFF(void){
>   TCCR1A = 0;
>   DDRD &= ~(1 << PD5 );
> 
> }

Die DDR Einstellung macht man einmal am Programmanfang und danach lässt 
du sie in Ruhe!

Was soll denn das bringen, wenn du den Pin beim Abschalten der LED 
wieder auf Eingang stellst? Lass ihn doch auf Ausgang. Du willst ja 
haben, dass der µC aktiv den Pin auf 0 zieht

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ich geh mal davon aus, dass die Beschriftung in deinem Schaltbild 
"OC2A" ein Tippfehler ist.

Autor: Johannes S. (gnubert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hoppala,
ja das ist wohl nicht so klug, das hätte selbst ich als Anfänger mir 
denken können.

Hab die DDR Konfiguration an den Anfang gebracht.
Um noch mal zurück auf deinen Satz zu kommen:

>Was der Timer macht: Er schaltet ständig den Pullup Widerstand zu und
>ab. Das reicht aber nicht, damit eine LED leuchtet.

Ich bin etwas unsicher, meinst du damit, die Aufurfe LED ON und OFF 
sollten den PD4 jeweils auf HIGH und LOW setzen?

und wie weiter oben schon angemekrt, es ist in dem Schaltbild falsch.
>kleine Korrektur zu dem Schaltbild, mein Tranistor hängt an OC1B...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes Xy schrieb:
> hoppala,
> ja das ist wohl nicht so klug, das hätte selbst ich als Anfänger mir
> denken können.
>
> Hab die DDR Konfiguration an den Anfang gebracht.
> Um noch mal zurück auf deinen Satz zu kommen:
>
>>Was der Timer macht: Er schaltet ständig den Pullup Widerstand zu und
>>ab. Das reicht aber nicht, damit eine LED leuchtet.
>
> Ich bin etwas unsicher, meinst du damit, die Aufurfe LED ON und OFF
> sollten den PD4 jeweils auf HIGH und LOW setzen?

Nein.
Der Timer steuert schon ganz von alleine das Port Register an. Das ist 
ja auch bei einer PWM seine Aufgabe.

Nur sollte der Pin dann auch auf Ausgang stehen. Denn der Timer macht ja 
intern im Grunde auch nichts anderes, als wie wenn du händisch ein Bit 
in einem PORT Register setzt. Und die Auswirkung dieses Bitsetzens hängt 
nun mal davon ab, ob der Pin in diesem PORT auf Eingang oder auf Ausgang 
steht.

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte sich die Logik an I/O-Pins sehr genau zu Gemüte führen. Da 
gibt es je nach Controller-Familie kleine Unterschiede, die sich oft 
auch im Befehlssatz widerspiegeln. Was wird wann wo gelesen, Pin-Zustand 
oder Latch-Zustand usw.

Offensichtlich ist kein Scope vorhanden? Auch kein Multimeter? Der 
Finger an der Basis, ist halt kurios. Vielleicht den Transistor falsch 
angeschlossen oder schlecht gelötet?

Ube(sat) ist die Sättigungsspannung des Transistors bei Vollaussteuerung 
an seinem Steuereingang Basis. Das Teil wird über den Strom gesteuert! 
Nehmen wir an, du schreibst ein HIGH am Controller raus. Dann fließt ein 
Basisstrom vom Controller über den Widerstand in den Transistor. Bei 
richtiger Auslegung des Widerstands, haste dann an der Basis ca. 0,6V. 
Über den Widerstand fast 4,4V. Am Controller-Pin eine Differenz von 
vielleicht 0,1 oder 0,2V zu VCC.
ACHTUNG: Liest der Controller den Pin-Status ein, dann sieht er immer 
ein LOW. Vorausgesetzt, der Ausgang ist als Eingang konfiguriert! Sollte 
der Basiswiderstand fehlen, weil der Controller eh einen Stromausgang 
hat (z.B. beim PCF8574), dann würde er die Basisspannung einlesen, die 
kann aber nie höher als ca. 0,8V sein! Hoffe jetzt ist es klar.

Autor: Johannes S. (gnubert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Erklärung.

Ich habe jetzt noch mal die Transistorschaltung durchgerechnet und bin 
auf ein Basiswiderstand von 1.5K gekommen (bei hFE = 35, Ic = 100mA)
Schaltung wie in dem Schaltbild angefügt aufgebaut, LED leuchtet :). 
Aber sie leuchtet die ganze Zeit, kein blinken! Argh.

Code sieht jetzt wie folgt aus:

#define F_CPU 12000000L

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


void IR_LED_ON(){
  TCCR1B |= (1<<COM1B0);
 
}

void IR_LED_OFF(){
  TCCR1B = 0;
  
}


int main(void)
{
    DDRD |= (1 << PD4 );
    TCCR1B = (1<<WGM12)| (1<<CS10);  //kein Prescaling  
    OCR1A = 0x95;
  

    while(1)
    {

        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);

        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
    
        _delay_ms(45);

    }
    
    return (1);
}




Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem AVR-Code kann ich dir leider nicht weiterhelfen. Teste es doch 
durch SelbstAVRspielen. Wenns dann geht, ist es ein Softwareproblem.

Einen BR337 gibt es nicht und oben war es noch ein BC337. Hoffentlich 
machst du im Code nicht genauso viele Fehler. Ein AVR verzeiht nix!

Autor: Johannes S. (gnubert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Jo, der Fehler im Schaltbild ist ärgerlich. Aber konnte das 
hochgeladene Bild nicht mehr ändern...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes Xy schrieb:


> void IR_LED_OFF(){
>   TCCR1B = 0;
>

Dir ist aber schon klar, dass du dir hier die komplette restliche 
Konfiguration des Timers (CTC Mode, Vorteiler) über den Haufen 
geschossen hast?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.