Hallo

Zuerst eine Warnung: Die IR-CommLED hängt über R6 (10Ohm) direkt an der Batteriespannung. Wenn Q5 nicht mit einem Trägertakt angesteuert wird kann die IRLED zerstört werden! Zum Testen wäre eine Ausgabe an eine StatusLED sicherer, wenns dann blickt kann man richtig loslegen.

Auf den ersten Blick scheint mir folgender Fehler vorzuliegen: Der Timer2 mit Prescaler 1 und OCR2=8 blockiert alles weil zwischen den Matches nur 8 Takte (!) Zeit bleiben. Das reicht nicht einmal aus um die ISR auszuführen:

Code:
ISR (TIMER2_OVF_vect)
{
    1880:	1f 92       	push	r1
    1882:	0f 92       	push	r0
    1884:	0f b6       	in	r0, 0x3f	; 63
    1886:	0f 92       	push	r0
    1888:	11 24       	eor	r1, r1
    188a:	8f 93       	push	r24
    188c:	9f 93       	push	r25
	Zeit++;
    188e:	80 91 0c 01 	lds	r24, 0x010C
    1892:	90 91 0d 01 	lds	r25, 0x010D
    1896:	01 96       	adiw	r24, 0x01	; 1
    1898:	90 93 0d 01 	sts	0x010D, r25
    189c:	80 93 0c 01 	sts	0x010C, r24
    18a0:	9f 91       	pop	r25
    18a2:	8f 91       	pop	r24
    18a4:	0f 90       	pop	r0
    18a6:	0f be       	out	0x3f, r0	; 63
    18a8:	0f 90       	pop	r0
    18aa:	1f 90       	pop	r1
    18ac:	18 95       	reti
Nur zur Erinnerung: Ein Riskprozessor wie die ATMegas braucht mindestens einen Takt pro Befehl. Auch ohne den Sprung ist deine ISR einfach zu lang.

Ich habe dein Programm mit der Overflow-ISR für Timer2 übersetzt weil diese ISR von der RP6-Lib nicht verwendet wird (und ich deshalb die Comp-ISR nicht ausblenden muss). So kann man bequem den Timer2 in eigenen Anwendungen verwenden und bei Bedarf initialiert man den Timer einfach wieder mit den Lib-Parametern. Mein Setup für eine 100kHz-Servo-ISR sieht so aus:

Code:
	// Initialize Timer2 - 100kHz für Servos mit Overflow-ISR
	TCCR2 = (0 << WGM21) | (0 << COM20) | (1 << CS20); // Normal Mode, no prescaler
	TCNT2  = -80; // alle 80 Takte ein Interrupt
	TIMSK |= (1 << TOIE2); // Timer2 Overflow-Interrupt erlauben
Weil das Counterregister nach dem Überlauf mit 0 geladen wird muss man in der ISR selbst einen neuen Startwert setzen:
Code:
ISR (TIMER2_OVF_vect)
{
	TCNT2  = -80; // alle 80 Takte ein Interrupt
...
}
Nach diesem Prinzip könnest du vermutlich auch deine Zeiten erzeugen. Anstelle der -80 müssen bei dir eben die an deine Zeiten angepassten Werte stehen.

Hast du Infomationen zum Protokoll des Robosapien?

Gruß

mic