Forum: Mikrocontroller und Digitale Elektronik 38kHz erzeugen, ATmega8, Timer2


von Hannes (Gast)


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!

von Matthias L. (Gast)


Lesenswert?

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


Du kannst den Timer:
- Vorladen,
- beim TOP-Wert löschen (clear on top)

von Jörg G. (joergderxte)


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

von Hannes (Gast)


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.

von Gast (Gast)


Lesenswert?

Seite 118 Datenblatt.

Du machst -> Clear OC2 on Compare Match

Aber das wolltest du bestimmt nicht.

von Hannes (Gast)


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!

von Hannes (Gast)


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

von Michael (Gast)


Lesenswert?

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?

von ftf (Gast)


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.

von Elko (Gast)


Lesenswert?

>(0 << WGM20)
löscht man so wirklich bits?

von Klaus W. (mfgkw)


Lesenswert?

das nicht, aber man setzt sie auch nicht.
Da das Register TCCR2 nicht verodert wird, sondern wirklich zugewiesen
wird, steht danach dort eine 0.
Nötig wäre es nicht, aber zwecks Lesbarkeit finde ich es zumindest gut
("ich setze das Bit nicht").

von H.j.Seifert (Gast)


Lesenswert?

Und wenn du die 38kHz genau haben möchtest, sollte die Taktfrequenz 
schon ein Vielfaches davon sein

von Werner B. (werner-b)


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.

von H.j.Seifert (Gast)


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.

von Hannes Lux (Gast)


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.

...

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.