Ich hab jetz mal folgenden Code ausprobiert:
Code:
#define SERVOPIN 7
#define SERVOPORT PORTD
#define DDRSERVO DDRD
volatile unsigned char servopos;
void servo_init()
{
TIMSK|=(1<<OCIE2);
TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode
OCR2 = F_CPU/100000; //alle 10µS ein IRQ
DDRSERVO|=(1<<SERVOPIN);
};
ISR(TIMER2_COMP_vect)
{
static int count;
if(count>servopos)SERVOPORT&=~(1<<SERVOPIN);
else SERVOPORT|=(1<<SERVOPIN);
if(count<2000+servopos)count++;
else count=0;
};
der hat funktioniert, nachedm ich servopos als integer deklariert hab.
der folgende code für zwei Servos funktioniert aber nicht so richtig:
Code:
#define SERVOPIN_LEFT (1<<PA1)
#define SERVOPIN_RIGHT (1<<PA2)
#define SERVOPORT PORTA
#define DDRSERVO DDRA
#define LEFT_SERVO 450
#define RIGHT_SERVO 420
volatile unsigned int servopos_left;
volatile unsigned int servopos_right;
void servo_init()
{
TIMSK |= (1<<OCIE2);
TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode
OCR2 = F_CPU/100000; //alle 10µS ein IRQ
};
ISR(TIMER2_COMP_vect)
{
static int count_left;
static int count_right;
if(count_left > servopos_left)
SERVOPORT &= ~SERVOPIN_LEFT;
else
SERVOPORT |= SERVOPIN_LEFT;
if(count_left < 2000 + servopos_left)
count_left++;
else count_left=0;
if(count_right > servopos_right)
SERVOPORT &= ~SERVOPIN_RIGHT;
else
SERVOPORT |= SERVOPIN_RIGHT;
if(count_right < 2000 + servopos_right)
count_right++;
else count_right=0;
};
wenn ich im Interrupt den Teil für den ersten Servo auskommentier läuft der erste, wenn ich den zweiten auskommentier läuft der zweite.
Aber beide gleichzeitig laufen nicht.
Ach ja, ich hab ne main-schleife
:
Code:
int main(void)
{
DDRA = 255;
servo_init();
servopos_left = 500;
servopos_right = 370;
sei();
while(1)
{
}
while(1);
return 0;
}
Lesezeichen