mikrocontroller.net

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


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

habe jetzt folgendes gemacht:
// #######################################
// ### 38kHz IR-Modulation aut ATmega8 ###
// #######################################

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

Leider schaltet der Pin nicht, sondern ist immer auf Low.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seite 118 Datenblatt.

Du machst -> Clear OC2 on Compare Match

Aber das wolltest du bestimmt nicht.

Autor: Hannes (Gast)
Datum:

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

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

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

Vielen Dank!

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat sich doch noch ein Fehler eingeschlichen. Hier die korrekte 
Version:
// #######################################
// ### 38kHz IR-Modulation aut ATmega8 ###
// #######################################

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ftf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Elko (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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").

Autor: H.j.Seifert (Gast)
Datum:

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

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht 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
OCR2   =   F_CPU / (38000 * 2) - 1;
stehen.

Autor: H.j.Seifert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.