So ich hab jetzt mal den code rausgesucht, aber noch nicht editiert.
Das ganze ist die noch nicht ganz so elegante lösung ohne Timer. Das Programm läuft folgender masen ab:
Ausgabe1:
- an Portb werden alle pins high geschaltet.
- es wird 1ms gewartet (kann auch über timer gemacht werden)
- danach werden die servo werte nacheinander abgeglichen und bei gleichheit der entsprechende pin ausgeschaltet (es wird erster Register "A1" geschrieben und dann am ende eines durchlaufes A1 nach portb geschoben)
- wenn das ganze 255mal durchgelaufen ist, springt er aus dem unterprogramm
bei Ausgabe2 ist es das gleiche nur mit einem anderen port.
Code:
;-------------------------------------------------------------------
;UP zur ansteuerung der Servos, wird später durch Interrups ersetzt.
;-------------------------------------------------------------------
Ausgabe1:
clr X1
ser A1
cli
out Portb,A1
ldi R30,low(Servo1)
ldi R31,high(Servo1)
ldd var1,z+3
ldd var2,z+4
ldd var3,z+5
ldi R30,low(Servo2)
ldi R31,high(Servo2)
ldd var4,z+3
ldd var5,z+4
ldd var6,z+5
Servoinit:
ldi B1,250
loop1: ldi B2,6
loop: dec B2
brne loop
dec B1
brne loop1
Se1:
cp X1,var1
brne wait1
subi A1,0b00000001
nop
rjmp Se2
wait1:
nop
nop
nop
Se2:
cp X1,var2
brne wait2
subi A1,0b00000010
nop
rjmp se3
wait2:
nop
nop
nop
Se3:
cp X1,var3
brne wait3
subi A1,0b00000100
nop
rjmp se4
wait3:
nop
nop
nop
Se4:
cp X1,var4
brne wait4
subi A1,0b00001000
nop
rjmp se5
wait4:
nop
nop
nop
Se5:
cp X1,var5
brne wait5
subi A1,0b00010000
nop
rjmp se6
wait5:
nop
nop
nop
Se6:
cp X1,var6
brne wait6
subi A1,0b00100000
nop
rjmp se7
wait6:
nop
nop
nop
Se7:
nop
out portb,A1
nop
ser A2
cp X1,A2
brne se8
sei
ret
se8:
inc X1
rjmp Se1
;==================================================
Ausgabe2:
clr X1
ser A1
cli
out Portd,A1
ldi R30,low(Servo3)
ldi R31,high(Servo3)
ldd var1,z+3
ldd var2,z+4
ldd var3,z+5
ldi R30,low(Servo4)
ldi R31,high(Servo4)
ldd var4,z+3
ldd var5,z+4
ldd var6,z+5
rjmp Servoinit2
Servoinit2:
ldi B1,250
loop12: ldi B2,6
loop2: dec B2
brne loop2
dec B1
brne loop12
Se12:
cp X1,var1
brne wait12
subi A1,0b00000100
nop
rjmp Se22
wait12:
nop
nop
nop
Se22:
cp X1,var2
brne wait22
subi A1,0b00001000
nop
rjmp se32
wait22:
nop
nop
nop
Se32:
cp X1,var3
brne wait32
subi A1,0b00010000
nop
rjmp se42
wait32:
nop
nop
nop
Se42:
cp X1,var4
brne wait42
subi A1,0b00100000
nop
rjmp se52
wait42:
nop
nop
nop
Se52:
cp X1,var5
brne wait52
subi A1,0b01000000
nop
rjmp se62
wait52:
nop
nop
nop
Se62:
cp X1,var6
brne wait62
subi A1,0b10000000
nop
rjmp se72
wait62:
nop
nop
nop
Se72:
nop
out portd,A1
nop
ser A2
cp X1,A2
brne se82
sei
ret
se82:
inc X1
rjmp Se12
hier noch die variablen:
Code:
.def A1 = R16 ;Bearbeitungs Register
.def A2 = R17 ;Bearbeitungs Register
.def B1 = R18 ;Bearbeitungs Register
.def B2 = R19 ;Bearbeitungs Register
.def Heben= R20
.def var1 = R7 ;frei zur verfügung stehende Variablen
.def Var2 = R8 ;frei zur verfügung stehende Variablen
.def Var3 = R21 ;frei zur verfügung stehende Variablen
.def Var4 = R22 ;frei zur verfügung stehende Variablen
.def Var5 = R23 ;frei zur verfügung stehende Variablen
.def Var6 = R24 ;frei zur verfügung stehende Variablen
.DSEG
Servo1: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)
Servo2: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)
Servo3: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)
Servo4: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)
GlVar: .byte 5 ;X,Y,Z,a,Globale Flags(Bein in der Luft, )
.CSEG
eine Initialisierung ist nicht notwendig, es müssen nur die ports als ausgänge geschalten werden.
Der code bietet noch viele möglichkeiten zur optimierung, aber ich denke mal, das er dir schonmal ein wenig weiterhelfen wird.
Es werden auch nur jeweils 6 Servos angesteuert, da ich nicht mehr benötigte ist aber auch auf 8 Servos leicht erweiterbar, muss man nur schaun, dass ein durchlauf nicht länger als 1/255ms ist.[/code]
Lesezeichen