Nunja, das kann man halten wie ein Dachdecker
Ich zumindest würde es nicht so realisieren, zumal bei mir meistens noch "wichtigere" Dinge so nebenbei laufen.

Im übrigen könntest du deinen Assemblercode noch etwas optimieren ... zumindest in der resultierenden Codegröße .. da die Laufzeit an sich bei deinem speziellem Fall eher Wurst ist.

Anstatt :
Code:
Nextpos:
  inc Position                ;1 Nächste Position (0..Servorightpos)
  cp Pos1,Position            ;1
  brne Next2                  ;1
  cbi PORTB,PINB0             ;+2=6 Servo1 low
Next2:
  cp Pos2,Position            ;1+
  brne Next3                  ;2
  cbi PORTB,PINB1             ;Servo2 low
Next3:
  cp Pos3,Position
  brne Next4
  cbi PORTB,PINB2             ;Servo3 low
Next4:
  cp Pos4,Position
  brne Next5
  cbi PORTB,PINB3             ;Servo4 low
Next5:
  cp Pos5,Position
  brne Next6
  cbi PORTB,PINB4             ;Servo5 low
Next6:
  cp Pos6,Position
  brne Next7
  cbi PORTB,PINB5             ;Servo6 low
Next7:
  cp Pos7,Position
  brne Next8
  cbi PORTB,PINB6             ;Servo7 low
Next8:
  cp Pos8,Position
  brne Next9
  cbi PORTB,PINB7             ;Servo8 low
könnte man das ganze auch wie folgt schreiben:

Code:
Nextpos:
  inc Position                ;1 Nächste Position (0..Servorightpos)
  cp Pos1,Position            ;1
  ror temp

  cp Pos2,Position            ;1+
  ror temp

  cp Pos3,Position
  ror temp

  cp Pos4,Position
  ror temp

  cp Pos5,Position
  ror temp

  cp Pos6,Position
  ror temp

  cp Pos7,Position
  ror temp

  cp Pos8,Position
  ror temp

  out PORTB, temp

aus:
Code:
  sbi PORTB,PINB0             ;Servo1 high
 *lds Pos1,{Servopos}         ;2+
  sbi PORTB,PINB1             ;Servo2 high
 *lds Pos2,{Servopos+1}
  sbi PORTB,PINB2             ;Servo3 high
 *lds Pos3,{Servopos+2}
  sbi PORTB,PINB3             ;Servo4 high
 *lds Pos4,{Servopos+3}
  sbi PORTB,PINB4             ;Servo5 high
 *lds Pos5,{Servopos+4}
  sbi PORTB,PINB5             ;Servo6 high
 *lds Pos6,{Servopos+5}
  sbi PORTB,PINB6             ;Servo7 high
 *lds Pos7,{Servopos+6}
  sbi PORTB,PINB7             ;Servo8 high
 *lds Pos8,{Servopos+7}
  sbi PORTD,PIND5             ;Servo9 high
 *lds Pos9,{Servopos+8}
  sbi PORTD,PIND6             ;Servo10 high
 *lds Pos10,{Servopos+9}
könnte man im übrigen das folgende machen:

Code:
 *lds Pos1,{Servopos}         ;2+
 *lds Pos2,{Servopos+1}
 *lds Pos3,{Servopos+2}
 *lds Pos4,{Servopos+3}
 *lds Pos5,{Servopos+4}
 *lds Pos6,{Servopos+5}
 *lds Pos7,{Servopos+6}
 *lds Pos8,{Servopos+7}
 *lds Pos9,{Servopos+8}
 *lds Pos10,{Servopos+9}
 ldi temp, 0xff
 out PORTB, temp
 in temp, PORTD
 ori temp, 0b01100000
 out PORTD, temp
Warum das auch so geht findest du übrigens hier: Instruktion Set

Sicherlich mag dir das vielleicht etwas unnötig erscheinen, allerdings macht es im Zweifelsfall neben ein paar gesparten Bytes eben auch einen gewissen Zeitfaktor aus (welcher ja in deinem Beispiel eh unrelevant ist).


Grüße,

da Hanni.