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:
Nur zur Erinnerung: Ein Riskprozessor wie die ATMegas braucht mindestens einen Takt pro Befehl. Auch ohne den Sprung ist deine ISR einfach zu lang.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
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:
Weil das Counterregister nach dem Überlauf mit 0 geladen wird muss man in der ISR selbst einen neuen Startwert setzen: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
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.Code:ISR (TIMER2_OVF_vect) { TCNT2 = -80; // alle 80 Takte ein Interrupt ... }
Hast du Infomationen zum Protokoll des Robosapien?
Gruß
mic






Zitieren

Lesezeichen