Forum: Compiler & IDEs IR-Sender Bauen


von ichim (Gast)


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?

von holger (Gast)


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?

von doc (Gast)


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.

von ichim (Gast)


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?

von Michael M. (Gast)


Lesenswert?

es fehlt noch, dass du interrupts anschaltest.

von ichim (Gast)


Lesenswert?

habe ich doch mit sei();

von doc (Gast)


Lesenswert?

35 khz sind allerdings etwas weit daneben. kann aber trotzdem klappen => 
ausprobieren.

von ichim (Gast)


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?

von ichim (Gast)


Lesenswert?

So habe mal folgendes Programm geschrieben aber irgendwie geht das 
nicht!
Habe leider kein Oszilloskop um die Frequenz zu testen!!!
1
#define F_CPU 12000000L
2
3
#include <string.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <util/delay.h>
7
8
int main(void)
9
{
10
11
    //TCCR1A = (1<<COM1B0);
12
    TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);
13
    OCR1B = 0x02;
14
    sei();
15
    while(1)
16
    {
17
18
        IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);
19
20
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
21
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
22
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
23
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
24
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
25
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
26
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
27
28
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
29
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
30
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
31
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
32
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
33
        _delay_ms(6.0); 
34
        _delay_ms(6.0); 
35
        _delay_ms(6.0); 
36
        _delay_ms(6.0); 
37
        _delay_ms(6.0); 
38
39
    }
40
    
41
    return (1);
42
}
43
44
void IR_LED_ON(void){
45
  TCCR1A = (1<<COM1B0);
46
}
47
48
void IR_LED_OFF(void){
49
  TCCR1A = 0;
50
}

von Stefan E. (sternst)


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.

von gast (Gast)


Angehängte Dateien:

Lesenswert?

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

von ichim (Gast)


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

von Stefan E. (sternst)


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.

von Marvin (Gast)


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.

von Stefan E. (sternst)


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

von ichim (Gast)


Lesenswert?

Echt super Forum!!!
Habe anschließend den funktionierenden Code eingestellt um ihn für die 
nachwelt aufzubewahren!!!
1
#define F_CPU 12000000L
2
3
#include <string.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <util/delay.h>
7
8
int main(void)
9
{
10
11
    TCCR1B = (1<<WGM12) | (1<<CS10);
12
    OCR1A = 149;
13
    sei();
14
    while(1)
15
    {
16
17
        IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);
18
19
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
20
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
21
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
22
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
23
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
24
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
25
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
26
27
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
28
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
29
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
30
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
31
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
32
33
34
        //dieses delay steht ganz unten aud dieser seite
35
                  http://picprojects.org.uk/projects/sirc/sonysirc.pdf
36
        _delay_ms(45);
37
38
    }
39
    
40
    return (1);
41
}
42
43
void IR_LED_ON(void){
44
  TCCR1A = (1<<COM1B0);
45
}
46
47
void IR_LED_OFF(void){
48
  TCCR1A = 0;
49
}


DANKE!!!!

von Meerschweinchen (Gast)


Lesenswert?

WOZU SCHALTEST DU DIE INTERRUPTS MIT SEI EIN? DENK MAL NACH!!!

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

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

von ichim (Gast)


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
1
void Send_SIRC_Start(void){
2
    IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);
3
}
4
5
void Send_SIRC_0(void){
6
    IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
7
}
8
9
void Send_SIRC_1(void){
10
    IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
11
}
12
13
void Send_SIRC_DATA(uint8_t daten, uint8_t lenght){
14
    char i;
15
16
    for(i=0;i<lenght;i++)
17
    {
18
      if ((daten >> i)&1)
19
         {Send_SIRC_1();}
20
      else
21
         {Send_SIRC_0();}
22
    }
23
}
24
25
void Send_SIRC(uint8_t address, uint8_t command){
26
  TCCR1B = 0;
27
  TCCR1B = (1<<WGM12) | (1<<CS10);
28
  OCR1A = 149;
29
  Send_SIRC_Start();
30
  Send_SIRC_DATA(command, 7);
31
  Send_SIRC_DATA(address, 5);
32
  _delay_ms(45);
33
}

von tom (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?


von tom (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


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.

von Karl H. (kbuchegg)


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)

von tom (Gast)


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 ?

von Karl H. (kbuchegg)


Lesenswert?

tom schrieb:

> Habe ich das richtig verstanden ?

Perfekt

von tom (Gast)


Lesenswert?

:-) geil
vielen Dank

von Johannes S. (gnubert)


Angehängte Dateien:

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?

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

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

von Johannes S. (gnubert)


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;

von Abdul K. (ehydra) Benutzerseite


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.

von Johannes S. (gnubert)


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?

von Karl H. (kbuchegg)


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.

von Johannes S. (gnubert)


Angehängte Dateien:

Lesenswert?

Ok, danke für den Tipp. Habe das Programm wie folgt geändert:
1
void IR_LED_ON(void){
2
  TCCR1A |= (1<<COM1B0);
3
   DDRD |= (1 << PD5 );
4
}
5
6
void IR_LED_OFF(void){
7
  TCCR1A = 0;
8
  DDRD &= ~(1 << PD5 );
9
10
}

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

von Johannes S. (gnubert)


Lesenswert?

kleine Korrektur zu dem Schaltbild, mein Tranistor hängt an OC1B...

von Karl H. (kbuchegg)


Lesenswert?

Johannes Xy schrieb:
> Ok, danke für den Tipp. Habe das Programm wie folgt geändert:
>
>
1
void IR_LED_ON(void){
2
>   TCCR1A |= (1<<COM1B0);
3
>    DDRD |= (1 << PD5 );
4
> }
5
> 
6
> void IR_LED_OFF(void){
7
>   TCCR1A = 0;
8
>   DDRD &= ~(1 << PD5 );
9
> 
10
> }

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Johannes S. (gnubert)


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

von Karl H. (kbuchegg)


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.

von Abdul K. (ehydra) Benutzerseite


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.

von Johannes S. (gnubert)


Angehängte Dateien:

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:

1
#define F_CPU 12000000L
2
3
#include <string.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
8
void IR_LED_ON(){
9
  TCCR1B |= (1<<COM1B0);
10
 
11
}
12
13
void IR_LED_OFF(){
14
  TCCR1B = 0;
15
  
16
}
17
18
19
int main(void)
20
{
21
    DDRD |= (1 << PD4 );
22
    TCCR1B = (1<<WGM12)| (1<<CS10);  //kein Prescaling  
23
    OCR1A = 0x95;
24
  
25
26
    while(1)
27
    {
28
29
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
30
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
31
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
32
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
33
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
34
35
        IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
36
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
37
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
38
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
39
        IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
40
    
41
        _delay_ms(45);
42
43
    }
44
    
45
    return (1);
46
}

von Abdul K. (ehydra) Benutzerseite


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!

von Johannes S. (gnubert)


Lesenswert?

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

von Karl H. (kbuchegg)


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?

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.