38kHz erzeugen, ATmega8, Timer2

Gast #1256622
Lesenswert?

Hallo,

ich würde gerne Daten mit einer Infrarot-Diode versenden. Dazu muss ich 
das IR-Licht modulieren. Am liebsten wäre mir natürlich, wenn ich das 
ganze so machen könnte, dass der Timer2 der ATmega8, den ich verwende, 
das selbstständig macht. Leider kann ich den Timer-Takt ja nur recht 
grob mit den Vorteilern einstellen, sodass ich nicht wirklich nah an die 
38kHz rankomme.

Hat jemand einen Tipp, wie ich möglichst einfach Timer2 dazu überreden 
kann an einem Pin mit 38kHz zu togglen?

Danke!
#1256638
Lesenswert?

- OCR-Register für 38*2 kHz einstellen ("OCR2 = FCPU/(38000*2)")
- OCR-Pin (mit den COM2x-bits) auf "toggle on compare" (und auf Ausgang 
;))
- Timer im CTC-Mode starten (wahrscheinlich mit Prescaler "1"-> musst du 
nachrechnen)
Modulieren kannst du das Signal, indem du entweder den Timer ganz 
abstellst oder die COM2x-Bits vorübergehend umschaltest.
hth, Jörg
Gast #1256674
Lesenswert?

Hi,

habe jetzt folgendes gemacht:
1
// #######################################
2
// ### 38kHz IR-Modulation aut ATmega8 ###
3
// #######################################
4

5
DDRB  |=   (1 << PB3);                  // PB3 als Ausgang
6
OCR2   =   F_CPU / (38000 * 2);         // Modulationsfrequenz
7
TCCR2  =   (1 << WGM21) | (0 << WGM20)  // CTC-Mode
8
         | (1 << COM21) | (0 << COM20)  // Toggle OC2 on Compare Match
9
         | (1 << CS21);                 // Prescaler: 1

Leider schaltet der Pin nicht, sondern ist immer auf Low.
Gast #1256700
Lesenswert?

>Du machst -> Clear OC2 on Compare Match. Aber das wolltest du bestimmt >nicht.

In der Tat! Hier die korrigierte und funktionstüchtige Version!
1
// #######################################
2
// ### 38kHz IR-Modulation aut ATmega8 ###
3
// #######################################
4

5
DDRB  |=   (1 << PB3);                  // PB3 als Ausgang
6
OCR2   =   F_CPU / (38000 * 2);         // Modulationsfrequenz
7
TCCR2  =   (0 << WGM21) | (1 << WGM20)  // CTC-Mode
8
         | (1 << COM21) | (0 << COM20)  // Toggle OC2 on Compare Match
9
         | (1 << CS21);                 // Prescaler: 1

Vielen Dank!
Gast #1256703
Lesenswert?

Da hat sich doch noch ein Fehler eingeschlichen. Hier die korrekte 
Version:
1
// #######################################
2
// ### 38kHz IR-Modulation aut ATmega8 ###
3
// #######################################
4

5
DDRB  |=   (1 << PB3);                  // PB3 als Ausgang
6
OCR2   =   F_CPU / (38000 * 2);         // Modulationsfrequenz
7
TCCR2  =   (1 << WGM21) | (0 << WGM20)  // CTC-Mode
8
         | (0 << COM21) | (1 << COM20)  // Toggle OC2 on Compare Match
9
         | (1 << CS21);                 // Prescaler: 1
Gast #1366781
Lesenswert?

F_CPU ist das, mit dem der Atmega rennt.
Hast du nen externen Quarz dran? Wie sind die Fuses eingestellt?

Ganz genau kommt man meist nicht an die Werte ran, aber für die meisten 
Anwendungen ist das nicht weiter schlimm da es Toleranzen gibt.
#1366858
Lesenswert?

H.j.Seifert schrieb:
> Und wenn du die 38kHz genau haben möchtest, sollte die Taktfrequenz
> schon ein Vielfaches davon sein

Sooo genau nehmen es die TSOP Empfänger auch nicht. Ein 38kHz 
funktioniert auch noch mit einer 36kHz Fernbdienung. Allerdings mit 
geringerer Reichweite.
Wenn du auf "genau" abziehlst müsstest du auch die Formel für OCR2 
bemängeln.

Nach Datenblattformel müsste da ja auch
1
OCR2   =   F_CPU / (38000 * 2) - 1;
stehen.
Gast #1366903
Lesenswert?

Natürlich kommt es nicht so genau drauf an, bezog sich darauf:
"Wie kann ich dann die 38kHz einstellen? F_CPU ist ja bei einem Atmega8
1MHz, oder? D.h. ich komme nie genau auf die 38kHz, oder?"

Und das passt nun mal mit 1MHz eben nicht.
Gast #1367142
Lesenswert?

> F_CPU ist ja bei einem Atmega8 1MHz, oder?

Das gilt für den Auslieferungszustand. Es steht Dir frei, ihn mit einem 
anderen Takt laufen zu lassen. Intern stehen neben 1MHz noch einige 
andere Frequenzen zur Verfügung, z.B. 2MHz, 4MHz oder 8MHz, extern 
kannst Du durch Verwendung eines passenden Quarzes (oder anderer 
Taktquellen) noch viel feiner variieren. Am besten schaust Du mal im 
Datenblatt im Kapitel Clock-Sources nach, manchmal reicht es eben nicht, 
nur die Überschriften zu lesen.

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren