Ich hab jetz mal folgenden Code ausprobiert:
der hat funktioniert, nachedm ich servopos als integer deklariert hab.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 folgende code für zwei Servos funktioniert aber nicht so richtig:
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.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; };
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; }







Zitieren

Lesezeichen