Ich habs jetzt doch nochmal mit dem Timer versucht, aber zusätzlich einen Servo angeschlossen; dadurch sieht man noch genauer wann das delay wie oft übersprungen wird. Und zwar läuft das so ab, dass der Servo (Hauptschleife) ca. 25 Schritte korrekt macht, also mit 500ms dazwischen und die nächsten zehn dann mit geschätzten 50ms delay. Komischerweise hab ich das Problem auch in diesem Fall nicht mehr, wenn ich Batterien anstatt der USB-Stromversorgung nehme. (Und wenn man dem Servo eigene Batterien gibt, flackert nichtmal irgentwas).

Code:
#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile  uint8_t OCR0Adirection=0, OCR0Avalue=1;
                         //0->OCR0A raufzählen 1-> OCR0A runterzählen

        ISR(TIMER0_COMPA_vect){

                if(OCR0Adirection==0){
                        OCR0Avalue += 1;
                        if(OCR0Avalue==254) OCR0Adirection=1;
                }else
                {
                        OCR0Avalue -= 1;
                        if(OCR0Avalue==1) OCR0Adirection=0;
                }
                OCR0A = OCR0Avalue;
        }


int main (void)
{               
                TCCR0A = (1 << COM0A1) | (1 << COM0A0) | (1 << WGM00) | (1 << WGM01)
                                                        | (1 << COM0B1) | (1 << COM0B0);//OC0B für den servo              

                                //TCCR0B = (1 << CS00);//no Prescaler
                //TCCR0B = (1 << CS01);//Prescaler CPU/8
                                TCCR0B = (1 << CS00) | (1 << CS01);//Prescaler CPU/64
                                //TCCR0B = (1 << CS02);//Prescaler CPU/256
                                //TCCR0B = (1 << CS00) | (1 << CS02);//Prescaler CPU/1024

                OCR0A = 1; //Startwert, pendelt dann zwischen 0..255

                DDRB = (1 << PB2); //pin PB2 auf Ausgang (das ist OC0A)
                               
                                //blinkende led PB4, PD5, PA0
                 DDRD |= (1 << PD5);
                                DDRB |= (1 << PB4);
                                DDRA |= (1 << PA0);

                                //ISRs für OCR0A Compare Match
                                TIMSK = (1 << OCIE0A);
                                 
                                sei();

                                uint8_t i=215;
                                //servoausschlag liegt bei 8bit-Timer, Prescaler von 64 und Fast-PWM
                                //bei 215: -90°    245: +90°
                while(1){
                               
                                        for(;i<245;i++){
                                                OCR0B=i;
                                                _delay_ms(500);
                                        }
                                        for(;i>=215;i--){
                                                OCR0B=i;
                                                _delay_ms(500);
                                        }
                      
                }
}