Hallo
Deine ISR von oben sollte besser so aussehen:
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;
};
Mit dem "count=1" kann man mit servopos=0 den Impuls ganz ausschalten.
Trotzdem stimmt etwas mit dem Takt nicht denn die Werte für die Servopositionen sind viel zu hoch:
servopos_left = 500;
servopos_right = 370;
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.
Code:
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0)| (1<<WGM12) | (1<<WGM11) | (1<<WGM10);
TCCR1B |= (1<<CS11);
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.
Gruß
mic
Lesezeichen