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.
hier noch die variablen: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
eine Initialisierung ist nicht notwendig, es müssen nur die ports als ausgänge geschalten werden.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
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]







Zitieren

Lesezeichen