i cant give all the source code but i can give some routines of the program must be 100% free and i dont want that someone make buisness with it
it is integrally writen with mikrobasic (aproximative 2500 lines of code)
90% is only the menu and the display
for driving the motors it use a simple bresenham algorythm
Code:
sub procedure do_line
if px>maxx then fail=1 end if
if py>maxy then fail=2 end if
if pz>maxz then fail=3 end if
if px<0 then fail=1 end if
if py<0 then fail=2 end if
if pz<0 then fail=3 end if
dx = ax - px
dy = ay - py
dz = az - pz
dx = dx * stepratio
dy = dy * stepratio
dz = dz * stepratio
stvel = 50000/(stvel1*stepratio)
speed2 = 50000/(speed*stepratio)
speed3 = 0
acc2=acc
coord = 0
coord1 = 0
coord2 = 0
mx = 0
my = 0
mz = 0
inv = -1
ct = 0
if dx < 0 then portb.6 = 1 dirx = 1 dx = dx*inv
else portb.6 = 0 dirx = 0 end if
if dy < 0 then portb.4 = 1 diry = 1 dy = dy*inv
else portb.4 = 0 diry = 0 end if
if dz < 0 then portb.2 = 1 dirz = 1 dz = dz*inv
else portb.2 = 0 dirz = 0 end if
if dx > stepratio then spi_glcd_write_text(" MOVE",15,1,1) end if
if dy > stepratio then spi_glcd_write_text(" MOVE",15,2,1) end if
if dz > stepratio then spi_glcd_write_text(" MOVE",15,3,1) end if
vm = sqrt((dx*dx)+(dy*dy)+(dz*dz))
vm2 = vm
if speed2 < stvel then speed3 = stvel vel = 1
endvec = acc*((stvel-speed2)/10)
else speed3 = speed2 vel = 0
endvec = 0
end if
while (vm>0)and(porta.4=1)and(fail=0)
if (portd.1=1)and(portc.0=0)and(menu=1) then spi_glcd_write_text(" PAUSE ",76,6,1)
delay_ms (1000)
while (portd.1=0)and(portc.0=0) wend
if speed2 < stvel then speed3 = stvel vel = 1
else speed3 = speed2 vel = 0
end if
end if
if vel=1
then ct = ct +1
if ct = acc2 then speed3 = speed3-10 ct = 0 end if
if speed3stvel then speed3 = stvel end if
end if
for delay = 0 to speed3
nop
next delay
vm = vm - 1
if dx<>0 then
if coord > dx then coord = coord - vm2
portb.7 = 1
mx = mx +1 end if end if
coord = coord + dx
if dy<>0 then
if coord1 > dy then coord1 = coord1 - vm2
portb.5 = 1
my = my + 1 end if end if
coord1 = coord1 + dy
if dz<>0 then
if coord2 > dz then coord2 = coord2 - vm2
portb.3 = 1
mz = mz + 1 end if end if
coord2 = coord2 + dz
delay_us (2)
portb.3 = 0
portb.5 = 0
portb.7 = 0
wend
if dirx = 1 then ax = ax + (mx/stepratio)
else ax = ax - (mx/stepratio)
end if
if diry = 1 then ay = ay + (my/stepratio)
else ay = ay - (my/stepratio)
end if
if dirz = 1 then az = az + (mz/stepratio)
else az = az - (mz/stepratio)
end if
end sub
if someone have a code to do circular interpolation with G02 and G03 i can integrate into the program
for reading gcode it's verry simple i read it line after line
if the 3 first carracters are G00 then rapid move
if G01 the controled speed move
here is the routine to read the values
at the first i read a comlete line into the mmc (the routine is integred in mikrobasic) ans store it in a array of bytes
Code:
sub procedure read_gcode
file = 0
divider = 1
while ((data[pointer]<47) or (data[pointer]>58)) and (pointer > 3)
pointer = pointer - 1
wend
if (data[pointer]>47) and (data[pointer]< 58) and (pointer > 3)
then file = (data[pointer]-48) * 100
end if
pointer = pointer - 1
if (data[pointer]=46) and (pointer>3) then divider = 10
pointer = pointer - 1 end if
if (data[pointer]>47) and (data[pointer]< 58) and (pointer > 3)
then file = file + (data[pointer]-48)*1000
pointer = pointer - 1
end if
if (data[pointer]=46) and (pointer > 3) then divider = 100
pointer = pointer - 1 end if
if (data[pointer]>47) and (data[pointer]< 58) and (pointer > 3)
then file = file + (data[pointer]-48)*10000
pointer = pointer - 1
end if
if (data[pointer]>47) and (data[pointer]< 58) and (pointer > 3)
then file = file + (data[pointer]-48)*100000
pointer = pointer - 1
end if
if (data[pointer]>47) and (data[pointer]< 58) and (pointer > 3)
then file = file + (data[pointer]-48)*1000000
pointer = pointer - 1
end if
if (data[pointer]>47) and (data[pointer]< 58) and (pointer > 3)
then file = file + (data[pointer]-48)*10000000
pointer = pointer - 1
end if
if (data[pointer]=45) and (pointer > 3)
then inv2=1
pointer = pointer - 1
else inv2=-1
end if
file = file /divider
if (data[pointer]=88) and (pointer > 3) then px = file+opx end if
if (data[pointer]=89) and (pointer > 3) then py = file+opy end if
if (data[pointer]=90) and (pointer > 3) then pz = (file*inv2)+opz end if
if (data[pointer]=70) and (pointer > 3) then setspeed = file/10 end if
if (data[pointer]=83) and (pointer > 3) then setrpm = file/100 end if
if (data[pointer]=84) and (pointer > 3) then tool = file/100 end if
file = 0
end sub