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 :
könnte man das ganze auch wie folgt schreiben: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
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:
könnte man im übrigen das folgende machen: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}
Warum das auch so geht findest du übrigens hier: Instruktion SetCode:*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
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.







Zitieren

Lesezeichen