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.
Lesezeichen