Code:
CON
_CLKMODE = XTAL1 + PLL16X 'Set to ext crystal, 16x PLL, 80MHz Clock
_XINFREQ = 5_000_000 'Frequency on XIN pin is 5 MHz
Var
'LONG high_pulse, low_pulse, periode, speed
LONG speed
LONG Apos[3], Aini[3], Alast[3], Aziel[3], Asign[3]
LONG Bpos[3], Bini[3], Blast[3], Bziel[3], Bsign[3]
LONG Cpos[3], Cini[3], Clast[3], Cziel[3], Csign[3]
LONG Dpos[3], Dini[3], Dlast[3], Dziel[3], Dsign[3]
LONG Epos[3], Eini[3], Elast[3], Eziel[3], Esign[3]
LONG Fpos[3], Fini[3], Flast[3], Fziel[3], Fsign[3]
BYTE x
long stack_a[15], stack_b[15], stack_c[15], stack_d[15], stack_e[15], stack_f[15] ' Speicher für den Cog
pub main
init
Aziel[0] := 45 ' Zielposition Servo
Aziel[1] := 90
Aziel[2] := 90
Bziel[0] := 45 ' Zielposition Servo
Bziel[1] := 90
Bziel[2] := 90
Cziel[0] := 45 ' Zielposition Servo
Cziel[1] := 90
Cziel[2] := 90
Dziel[0] := 45 ' Zielposition Servo
Dziel[1] := 90
Dziel[2] := 90
Eziel[0] := 45 ' Zielposition Servo
Eziel[1] := 90
Eziel[2] := 90
Fziel[0] := 45 ' Zielposition Servo
Fziel[1] := 90
Fziel[2] := 90
speed := 5000
'-------------------------------------------------------------------------------------------------------------------------
'### INITIALPOSITION ANFAHREN ###
x:=0
repeat 3
Apos[x] := Aini[x]
Bpos[x] := Bini[x]
Cpos[x] := Cini[x]
Dpos[x] := Dini[x]
Epos[x] := Eini[x]
Fpos[x] := Fini[x]
x++
coginit(3, moveA, @stack_A)
coginit(4, moveB, @stack_B)
coginit(5, moveC, @stack_C)
coginit(6, moveD, @stack_D) ' Ab hier arbeitet ein Cog kontinuierlich das moveit programm ab
coginit(7, moveE, @stack_E)
coginit(8, moveF, @stack_F)
waitcnt(100_000_000 + cnt) ' Anfahren der Initalposition
repeat 10
busy_led ' Bestätigen, dass bereit
'-------------------------------------------------------------------------------------------------------------------------
'### SERVO BEWERGN ###
x:=0
repeat 3
Alast[x] := Aini[x]
Apos[x] := Alast[x]
Apos[x] #>= 20 ' Untere Servogrenze
Apos[x] <#= 160 ' Obere Servogrenze
Blast[x] := Bini[x]
Bpos[x] := Blast[x]
Bpos[x] #>= 20
Bpos[x] <#= 160
Clast[x] := Cini[x]
Cpos[x] := Clast[x]
Cpos[x] #>= 20 ' Untere Servogrenze
Cpos[x] <#= 160
Dlast[x] := Dini[x]
Dpos[x] := Dlast[x]
Dpos[x] #>= 20 ' Untere Servogrenze
Dpos[x] <#= 160
Elast[x] := Eini[x]
Epos[x] := Elast[x]
Epos[x] #>= 20 ' Untere Servogrenze
Epos[x] <#= 160 ' Obere Servogrenze, wenn die Mathe mal versagt
Flast[x] := Fini[x]
Fpos[x] := Flast[x]
Fpos[x] #>= 20
Fpos[x] <#= 160
if Aziel[x] > Alast[x] ' Servo-bewegung vorwärts
Asign[x] := +1
if Aziel[x] < Alast[x] ' Servo-bewegung rückwärts
Asign[x] := -1
if Bziel[x] > Blast[x] ' Servo-bewegung vorwärts
Bsign[x] := +1
if Bziel[x] < Blast[x] ' Servo-bewegung rückwärts
Bsign[x] := -1
if Cziel[x] > Clast[x] ' Servo-bewegung vorwärts
Csign[x] := +1
if Cziel[x] < Clast[x] ' Servo-bewegung rückwärts
Csign[x] := -1
if Dziel[x] > Dlast[x] ' Servo-bewegung vorwärts
Dsign[x] := +1
if Dziel[x] < Dlast[x] ' Servo-bewegung rückwärts
Dsign[x] := -1
if Eziel[x] > Elast[x] ' Servo-bewegung vorwärts
Esign[x] := +1
if Eziel[x] < Elast[x] ' Servo-bewegung rückwärts
Esign[x] := -1
if Fziel[x] > Flast[x] ' Servo-bewegung vorwärts
Fsign[x] := +1
if Fziel[x] < Flast[x] ' Servo-bewegung rückwärts
Fsign[x] := -1
x++
repeat ' Bewegung
x:= 0
repeat 3
Apos[x] += Asign[x] ' Positionsänderung
if Apos[x]==Aziel[x] ' Ziel erreicht
Asign[x]:=0
Bpos[x] += Bsign[x] ' Positionsänderung
if Bpos[x]==Bziel[x] ' Ziel erreicht
Bsign[x]:=0
Cpos[x] += Csign[x] ' Positionsänderung
if Cpos[x]==Cziel[x] ' Ziel erreicht
Csign[x]:=0
Dpos[x] += Dsign[x] ' Positionsänderung
if Dpos[x]==Dziel[x] ' Ziel erreicht
Dsign[x]:=0
Epos[x] += Esign[x] ' Positionsänderung
if Epos[x]==Eziel[x] ' Ziel erreicht
Esign[x]:=0
Fpos[x] += Fsign[x] ' Positionsänderung
if Fpos[x]==Fziel[x] ' Ziel erreicht
Fsign[x]:=0
x++
repeat speed ' Warten
until ((Asign[0] == 0) AND (Asign[1] == 0) AND (Asign[2] == 0)AND(Bsign[0] == 0) AND (Bsign[1] == 0) AND (Bsign[2] == 0)AND (Csign[0] == 0) AND (Csign[1] == 0) AND (Csign[2] == 0)AND(Dsign[0] == 0) AND (Dsign[1] == 0) AND (Dsign[2] == 0)AND(Esign[0] == 0) AND (Esign[1] == 0) AND (Esign[2] == 0)AND(Fsign[0] == 0) AND (Fsign[1] == 0) AND (Fsign[2] == 0)) ' Bis zum Ziel und Schluss
'-------------------------------------------------------------------------------------------------------------------------
'### PROGRAMM ENDE ###
repeat
ready_led
pub init
dira[26]~~ ' Ausgang für LED - Grün
Aini[0] := 90
Aini[1] := 90
Aini[2] := 90
Bini[0] := 90
Bini[1] := 90
Bini[2] := 90
Cini[0] := 90
Cini[1] := 90
Cini[2] := 90
Dini[0] := 90
Dini[1] := 90
Dini[2] := 90
Eini[0] := 90
Eini[1] := 90
Eini[2] := 90
Fini[0] := 90
Fini[1] := 90
Fini[2] := 90
PRI moveA|periode, high_pulse, low_pulse ' Paralleler Prozess der dauerhaft läuft
dira[22]~~
dira[23]~~
dira[24]~~
' Servo Pin D[2]
periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen
repeat
' Tu das bis du gestoppt wirst - für immer
high_pulse := ((clkfreq / 1000000) * (Apos[0]* 8 +799 +50 )) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[22]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[22]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (Apos[1]* 8 +795 -70 )) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[23]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[23]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (Apos[2]* 8 +799 +0)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[24]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[24]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
PRI moveB|periode, high_pulse, low_pulse ' Paralleler Prozess der dauerhaft läuft
dira[19]~~
dira[20]~~
dira[21]~~
' Servo Pin D[2]
periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen
repeat
' Tu das bis du gestoppt wirst - für immer
high_pulse := ((clkfreq / 1000000) * (Bpos[0]* 8 +800 -50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[19]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[19]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (2192 - Bpos[1]* 8 +50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[20]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[20]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (2173 - Bpos[2]* 8 +80)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[21]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[21]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
PRI moveC|periode, high_pulse, low_pulse ' Paralleler Prozess der dauerhaft läuft
dira[16]~~ ' Servo Pin D[2]
dira[17]~~
dira[18]~~
' Servo Pin D[2]
periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen
repeat
' Tu das bis du gestoppt wirst - für immer
high_pulse := ((clkfreq / 1000000) * (Cpos[0]* 8 +800 +50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[16]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[16]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (2160 - Cpos[1]* 8 + 0)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[17]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[17]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (2173 - Cpos[2]* 8 +50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[18]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[18]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
PRI moveD|periode, high_pulse, low_pulse ' Paralleler Prozess der dauerhaft läuft
dira[13]~~
dira[14]~~
dira[15]~~
' Servo Pin D[2]
periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen
repeat
' Tu das bis du gestoppt wirst - für immer
high_pulse := ((clkfreq / 1000000) * (2179 - Dpos[0]* 8 -150)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[13]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[13]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (Dpos[1]* 8 + 795 - 50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[14]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[14]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (Dpos[2]* 8 + 795 + 10)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[15]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[15]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
PRI moveE|periode, high_pulse, low_pulse ' Paralleler Prozess der dauerhaft läuft
dira[10]~~ ' Servo Pin D[2]
dira[11]~~
dira[12]~~
' Servo Pin D[2]
periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen
repeat
' Tu das bis du gestoppt wirst - für immer
high_pulse := ((clkfreq / 1000000) * (2187 - Epos[0]*8 -10)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[10]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[10]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (Epos[1]*8 + 800 - 150)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[11]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[11]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (Epos[2]*8 + 795 - 50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[12]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[12]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
PRI moveF|periode, high_pulse, low_pulse ' Paralleler Prozess der dauerhaft läuft
dira[7]~~ ' Servo Pin D[2]
dira[8]~~
dira[9]~~
' Servo Pin D[2]
periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen
repeat
' Tu das bis du gestoppt wirst - für immer
high_pulse := ((clkfreq / 1000000) * (2190 - Fpos[0]*8 + 150)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[7]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[7]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (2187 - Fpos[1]*8 - 50)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[8]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[8]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
high_pulse := ((clkfreq / 1000000) * (2187 - Fpos[2]*8 - 0)) ' Immer wenn sich der Wert in der Variablen pos ändert
low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt.
outa[9]~~ ' Ausgabe des High Pegels
waitcnt (cnt += high_pulse)
outa[9]~ ' Ausgabe des Low Pegels
waitcnt (cnt += low_pulse)
pub busy_led
!outa[26] ' Ausgang invertieren
waitcnt(3_000_000 + cnt) ' 300ms warten
pub ready_led
outa[26]~~ ' LED ON
Mit dem Laufen wird es leider noch dauern, da ich mich noch gar nicht an die Implementierung der Inversen Kinematik gemacht habe oder die Berechnung der Bahnkurven. Der nächste Schritt wird sein ein paar Grundlegende Bewegungen zu implementieren.
Lesezeichen