Hallo

Das muss

if ((t==1) && (z==servo1)) heißen.
Ähnlich wie "Punkt vor Strich" gibt es in C die Rangfolge der Operatoren:
http://www.hs-augsburg.de/~sandman/c...Anhang_000.htm

Da "gleich" (==) vor "logisches Und" (&&) steht und deshalb dessen Bindung höher ist dienen die Klammern nur der Übersichtlichkeit. Der Kompiler übersetzt beides gleich.

TIMER0_interrupt_init(void){
z = 0;
TCNT0 = 0;
OCR0 = 9;
TCCR0 = 0x0a;
TIMSK |= (1<<OCIE0); //Interrupt aller 1/200ms ->200 je ms
sei();
}
Wo wird der CTC-Mode des Timers eingestellt? Wie sieht im Vergleich der funktionierende Code für ein Servo aus?

Gruß

mic

Edit: Möglicherweise ist deine Hauptschleife nun zu lang und z wird pro Durchlauf mehrfach erhöht. Das hätte zur Folge das ein Vergleich auf "gleich" nicht immer trifft. Sicherheitshalber solltest du deshalb so prüfen:

if (t==1 && z>=servo1){

Besser (und noch blockierender) wäre es so:

Code:
...
    while (1){
      if (t==1) while(z<=servo1);
         t=2;
         z=0;
         SERVO_PORT1 &= ~(1<<SERVO_PORTPIN1);
         SERVO_PORT2 |= (1<<SERVO_PORTPIN2);
         LED_PORT |=(1<<LED_PORTPIN);

      if (t==2) while(z<=servo2);
         t=3;
         z=0;
         SERVO_PORT2 &= ~(1<<SERVO_PORTPIN2);
         SERVO_PORT3 |= (1<<SERVO_PORTPIN3);

      if (t==3) while(z<=servo3);
         t=4;
         z=0;
         SERVO_PORT3 &= ~(1<<SERVO_PORTPIN3);
         q = (4000-servo2-servo3);

      if (t==4) while(z<=q);
         z = 0;
         t = 1;
         SERVO_PORT1 |= (1<<SERVO_PORTPIN1);

/*      if (z==4000){
         z = 0;
         t = 1;
         SERVO_PORT1 |= (1<<SERVO_PORTPIN1);
*/
      }
...
(ungetestet!)