Hallo
Deine ISR von oben sollte besser so aussehen:
Mit dem "count=1" kann man mit servopos=0 den Impuls ganz ausschalten.Code:ISR(TIMER2_COMP_vect) { static int count; if(count > servopos_left) SERVOPORT &= ~SERVOPIN_LEFT; else SERVOPORT |= SERVOPIN_LEFT; if(count > servopos_right) SERVOPORT &= ~SERVOPIN_RIGHT; else SERVOPORT |= SERVOPIN_RIGHT; if(count < (2000) count++; else count=1; };
Trotzdem stimmt etwas mit dem Takt nicht denn die Werte für die Servopositionen sind viel zu hoch:
Bei einem 10µs-Interrupt wären das 5ms oder 3,7ms! Und 2000 als count-Wert würden auch keine 20ms ergeben. Deshalb reicht dir auch das char für servopos nicht aus.servopos_left = 500;
servopos_right = 370;
Sollen wir nun das Datenblatt wälzen um das Setup des Timers zu kontrollieren? Je nach Timer-Mode und Taktfrequenz/Prescaler werden OCR1A und OCR1B eingestellt. Bei nur zwei Servos erscheint mir die Verwendung der ISR-Lösung einfacher.Code:TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0)| (1<<WGM12) | (1<<WGM11) | (1<<WGM10); TCCR1B |= (1<<CS11);
Gruß
mic







Zitieren

Lesezeichen