Sebastian E. schrieb:
> Wenn ich allerdings den empfangenen Code mit Hilfe der IRSND-Bib
> zurücksenden möchte, ist das Sendesignal doppelt so schnell.
...
> Ich finde jetzt leider meinen Fehler nicht.
> Hat jemand einen Rat wo ich suchen könnte?
Deine Interruptroutine ruft den Interrupthandler für IRSND zwei mal auf,
dadurch wird dessen Output aufs Doppelte beschleunigt. Er wird 30.000
mal in der Sekunde aufgerufen, nicht wie vorgesehen 15.000 mal in der
Sekunde.
Enferne einfach in
1 | ISR(TIMER1_COMPA_vect)
|
2 | {
|
3 | if (! irsnd_ISR()) // call irsnd ISR
|
4 | { // if not busy...
|
5 | irmp_ISR(); // call irmp ISR
|
6 | }
|
7 | irsnd_ISR();
|
8 | }
|
den überflüssigen Aufruf vonirsnd_ISR() und die Sache wird
funktionieren.
In meinem funktionierenden Beispiel (mit dem PIC12F1840, nicht einem
AVR, aber das ist auf der Ebene egal), das auch im SVN-Repository zu
finden ist, sieht das so aus:
1 | void interrupt isr(void)
|
2 | {
|
3 | TMR1=0xffff-_XTAL_FREQ/F_INTERRUPTS;
|
4 | TMR1IF=0; // clear timer 1 interrupt
|
5 |
|
6 | if (!irsnd_ISR())
|
7 | {
|
8 | irmp_ISR();
|
9 | }
|
10 | }
|
Quelle:
https://www.mikrocontroller.net/svnbrowser/irmp/pic/main_pic12f1840.c?revision=143&view=markup