Bei mir functioniert das mit folgende code :Timer 1 wird genutzt um servopulsen zu generieren. Forteil : lauft ohne uberhead, da wird nur eine Timerinterrupt getriggerd jeden 1 bis 2mS, je nach den Pulslaenge von actuele Servo.Code:/* Timer 1 is used for servo-puls generation */ ISR(TIMER1_COMPA_vect) { if(servocount==0){PORTC|=IO_PC2;OCR1A=servo4;} if(servocount==1){PORTC&= ~IO_PC2;PORTC|=IO_PC3;OCR1A=servo3;} if(servocount==2){PORTC&= ~IO_PC3;PORTC|=IO_PC5;OCR1A=servo2;} if(servocount==3){PORTC&= ~IO_PC5;PORTC|=IO_PC7;OCR1A=servo1;} if(servocount==4){PORTC&= ~IO_PC7;PORTD|=IO_PD5;OCR1A=servo5;} if(servocount==5){PORTD&= ~IO_PD5;OCR1A=250*12;} servocount++; if(servocount>5) servocount=0; } /* Timer 1 is free for your application! Prescaler = 64, CTC mode, 4µs resolution */ TCCR1A = (0<<WGM10) |(0<<WGM11) |(0<<COM1A1) |(0<<COM1B1); TCCR1B = (1<<WGM12) |(0<<CS12) |(1<<CS11) |(1<<CS10); OCR1A = 1000; // Enable timer interrupts: TIMSK = (1 << OCIE0)|(1<<OCIE1A); uint16_t servo1=350; uint16_t servo2=350; uint16_t servo3=250; uint16_t servo4=500; uint16_t servo5=350; uint8_t servocount=0; void servo (uint8_t nummer,uint16_t puls) { if (puls<200) puls=200; //beveiliging tegen extreme pulslengte!! if (puls>550) puls=550; //beveiliging tegen extreme pulslengte!! if(nummer==1) servo1=puls; if(nummer==2) servo2=puls; if(nummer==3) servo3=puls; if(nummer==4) servo4=puls; if(nummer==5) servo5=puls; }
Lesezeichen