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!)
Lesezeichen