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
Lesezeichen