richtig, jedes Paket ist aufgrund der Invertierung gleich lang, da jedes Bit einmal als 1 und einmal als 0 gesendet wird.
Ich verstehe Bonze eher so, daß er einen empfangenden TSOP simulieren will, also eine Applikation hat, die normalerweise mit einem TSOP ein trägerfrequenzbehaftetes IR-Signal empfängt, wobei der TSOP die Trägerfrequenz rausfiltert, und das reine biphasische (?) Signal weiterleitet.
Er will jetzt mit dem Rechenzwerg den TSOP ersetzen - selbst also ein äquivalentes biphasisches Signal auf die Applikation legen. logischerweise ohne Trägerfrequenz.
Zu meinem Programm: Da keine Trägerfrequenz gefordert war, hab ich da auch nichts umgesetzt.
Ich verwende den 16-Bit-Timer im frequenzkorrekten PWM. Als Überlaufpunkt wird das ICR verwendet (WGM=14), der OC1A-Pin wird beim Überlauf (automatisch) gesetzt, beim CompareMatch1A (automatisch) gelöscht (CompareOutputMode=2). Das geschieht alles in der Hardware des Timers im Hintergrund. Ich benutze ferner den OC1A-Interrupt, um mit dem ICR die Frequenz des PWM nach jedem Bit anzupassen -> also effektiv die low -Zeit festzulegen. Dafür habe ich 1.125ms (bei einer 0) bzw 2.25ms (bei einer 1) Zeit. Also mehr als genug.
Da man per PWM keinen konstanten lo-Pegel erzeugen kann, verwende ich während des Startbursts und der folgenden Pause den Pin als normalen I/O (CompareOutputMode=0). Das Umschalten von OCR1A stammt noch von dem Versuch, das komplett im COM2 zu fahren - könnte ich auch noch verändern.
Wenn ich jetzt mit einem 2ten Timer (Timer0) eine Trägerfrequenz erzeugen lassen würde (FastPWM im WGM=7), und OC0B als PWM-Ausgang verwende (COM0B=2), und mit OCR0B den DC vorgebe, muß ich as einmal initialisieren, und kann den Timer danach komplett vergessen - der erzeugt die Trägerfrequenz dann komplett unabhängig im Hintergrund.
Wenn ich stattdessen den COM oder die Datenrichtung von OC1A manipulieren will, muß das immer durch einen IRQ geschehen. Wegen der Asymmetrie (DC<>50) einmal zum setzen der hi-Anteils der Trägerfrequenz, einmal zu löschen. Ich muß also sowohl den OC0B-Interrupt verwenden, als auch den OC0A-/TOV0-Interrupt (treten ja gleichzeitig auf). Insbesondere werden jetzt also mit einer Frequenz von 38kHz 2 Interrupts angefordert (um den DC phasenverschoben).
Aber Bonze sagt, er braucht keine Trägerfrequenz...
Ich verstehe Bonze eher so, daß er einen empfangenden TSOP simulieren will, also eine Applikation hat, die normalerweise mit einem TSOP ein trägerfrequenzbehaftetes IR-Signal empfängt, wobei der TSOP die Trägerfrequenz rausfiltert, und das reine biphasische (?) Signal weiterleitet.
Er will jetzt mit dem Rechenzwerg den TSOP ersetzen - selbst also ein äquivalentes biphasisches Signal auf die Applikation legen. logischerweise ohne Trägerfrequenz.
Zu meinem Programm: Da keine Trägerfrequenz gefordert war, hab ich da auch nichts umgesetzt.
Ich verwende den 16-Bit-Timer im frequenzkorrekten PWM. Als Überlaufpunkt wird das ICR verwendet (WGM=14), der OC1A-Pin wird beim Überlauf (automatisch) gesetzt, beim CompareMatch1A (automatisch) gelöscht (CompareOutputMode=2). Das geschieht alles in der Hardware des Timers im Hintergrund. Ich benutze ferner den OC1A-Interrupt, um mit dem ICR die Frequenz des PWM nach jedem Bit anzupassen -> also effektiv die low -Zeit festzulegen. Dafür habe ich 1.125ms (bei einer 0) bzw 2.25ms (bei einer 1) Zeit. Also mehr als genug.
Da man per PWM keinen konstanten lo-Pegel erzeugen kann, verwende ich während des Startbursts und der folgenden Pause den Pin als normalen I/O (CompareOutputMode=0). Das Umschalten von OCR1A stammt noch von dem Versuch, das komplett im COM2 zu fahren - könnte ich auch noch verändern.
Wenn ich jetzt mit einem 2ten Timer (Timer0) eine Trägerfrequenz erzeugen lassen würde (FastPWM im WGM=7), und OC0B als PWM-Ausgang verwende (COM0B=2), und mit OCR0B den DC vorgebe, muß ich as einmal initialisieren, und kann den Timer danach komplett vergessen - der erzeugt die Trägerfrequenz dann komplett unabhängig im Hintergrund.
Wenn ich stattdessen den COM oder die Datenrichtung von OC1A manipulieren will, muß das immer durch einen IRQ geschehen. Wegen der Asymmetrie (DC<>50) einmal zum setzen der hi-Anteils der Trägerfrequenz, einmal zu löschen. Ich muß also sowohl den OC0B-Interrupt verwenden, als auch den OC0A-/TOV0-Interrupt (treten ja gleichzeitig auf). Insbesondere werden jetzt also mit einer Frequenz von 38kHz 2 Interrupts angefordert (um den DC phasenverschoben).
Aber Bonze sagt, er braucht keine Trägerfrequenz...