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!
>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)
- 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
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.
Seite 118 Datenblatt. Du machst -> Clear OC2 on Compare Match Aber das wolltest du bestimmt nicht.
>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!
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 |
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?
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.
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").
Und wenn du die 38kHz genau haben möchtest, sollte die Taktfrequenz schon ein Vielfaches davon sein
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.