$STACK 32766 1 ' History ' Original ' SUPER STEPPER 1.0 ' 10 AUG 1997 ' Kevin Carroll's Beta Release ' Super Stepper 1.1 ' 12/20/99 ' Added white space and comments just ' so I could read this thing ' Format change spaces to tabs ' In editor set tab size to 6 or 8 ' Minor changes to display positions ' Super Stepper 1.2 ' 01/01/00 ' Fixes (2) to plane 3 variable names ' Super Stepper 1.3 ' 01/05/00 ' Overide keys F2 and F3 in manual mode corrected ' Current ' Super Stepper 1.4 ' 01/10/00 ' Backlash compensation in G2 and G3 arc operations ' fixed by adding "arc" flag and IF THEN ELSE statements ' Linear backlash also fixed ' Known or suspected problems ' When in auto mode F6 does not return us to main menu. ' Noticed when debuging arc backlash that quadrant test ' routines seem to do extra arc moves. Also seems to ' show up when cutting perfect cir. ' There is a problem with manual mode jog. Until you ' do a F7 change jog amount the screen shows 0000 and ' it jogs a different amount depending on direction. ' Should be an easy fix. ' File name handling in auto mode is kinda clunky ' Begin the program CLS WIDTH 40 COLOR 15, 0 LOCATE 3, 2: PRINT " Stepster, Version .979" LOCATE 5, 2: PRINT "Copyright 1997 by Haberle Machine Co." LOCATE 7, 2: PRINT " Written by Kevin Carroll" ' DELAY 2 CLS LOCATE 3, 2: PRINT " This is a Beta Version" LOCATE 5, 2: PRINT " NOT FOR DISTRIBUTION" DELAY 3 2 ' We set up arrays and set defaults DIM t(10) DIM g(30) DIM misc(5, 2) hold = 0 CoSys = 1 'The coordinate system variable, G53 to G55 cycle = 0 jds = 1 hold = 0 'Hold operation (freeze) plane = 1 'Which plane is active (xy, xz, yz) firstmove = 0 g90 = 1 g90.1 = 1 pi = 3.141592654# pt = 127 5 CLS lines = 0 CLOSE OVR = 1 WIDTH 40 mX = 10 mY = 10 mZ = 1 KEY 19, CHR$(0) + CHR$(74) KEY 20, CHR$(0) + CHR$(78) '+ - KEY 21, CHR$(0) + CHR$(20) KEY 22, CHR$(0) + CHR$(45) 'T - X KEY 23, CHR$(0) + CHR$(21) KEY 24, CHR$(0) + CHR$(44) 'Y - Z ON KEY(21) GOSUB 700 ON KEY(22) GOSUB 710 ON KEY(23) GOSUB 720 'T X Y ON KEY(24) GOSUB 730 ON KEY(12) GOSUB 740 ON KEY(13) GOSUB 750 'Z L-R ON KEY(11) GOSUB 760 ON KEY(14) GOSUB 770 ON KEY(19) GOSUB 780 'U-D + ON KEY(20) GOSUB 790 '- ' Read our first data file OPEN "exec.dat" FOR INPUT AS #2 LINE INPUT #2, port$: port = VAL(port$) ' lpt port LINE INPUT #2, port2off$: port2off = VAL(port2off$) ' offset for input LINE INPUT #2, mX$: mX1 = VAL(mX$) ' motor step X (axis movement per step) LINE INPUT #2, mY$: mY1 = VAL(mY$) ' motor step Y LINE INPUT #2, mZ$: mZ1 = VAL(mZ$) ' motor step Z LINE INPUT #2, Xb$: Xb = VAL(Xb$) ' X backlash LINE INPUT #2, Yb$: Yb = VAL(Yb$) ' Y backlash LINE INPUT #2, Zb$: Zb = VAL(Zb$) ' Z backlash LINE INPUT #2, panel$: panel = VAL(panel$) ' contol panel present =1 LINE INPUT #2, IJ$: IJ = VAL(IJ$) ' I&J incremental = 1 LINE INPUT #2, pX$: pX = VAL(pX$) ' pin for X step pulse LINE INPUT #2, nX$: nX = VAL(nX$) ' pin for X direction signal LINE INPUT #2, pY$: pY = VAL(pY$) ' Y step pulse LINE INPUT #2, nY$: nY = VAL(nY$) ' Y direction LINE INPUT #2, pZ$: pZ = VAL(pZ$) ' Z step pulse LINE INPUT #2, nZ$: nZ = VAL(nZ$) ' Z direction LINE INPUT #2, rA$: rA = VAL(rA$) ' pin for relay A LINE INPUT #2, rB$: rB = VAL(rB$) ' relay B LINE INPUT #2, rapid$: rapid = VAL(rapid$) 'IPM G0 CLOSE #2 ' We now know where the lpt1 parallel port is so ' turn off the relays and prep panel on lpt2 OUT port, 255 AND NOT rA + rB ' turn relays off port1 = port + 1 port2 = port + 2 OUT port1, 255 OUT port2, 4 'prepare panel port2 = port2 + port2off ' some lpt ports input 1 byte higher ' Read the second data file OPEN "speed.dat" FOR INPUT AS #2 LINE INPUT #2, compspeed$: compspeed = VAL(compspeed$) ' LINE INPUT #2, accf$: accf = VAL(accf$) 'accel / decel factor LINE INPUT #2, accd$: accd = VAL(accd$) ' accel / decel distance LINE INPUT #2, rapid$: rpd = VAL(rapid$) ' limit rapid traverse LINE INPUT #2, backX$: backX = VAL(backX$) ' back up after homing X LINE INPUT #2, backY$: backY = VAL(backY$) LINE INPUT #2, backZ$: backZ = VAL(backZ$) CLOSE #2 ' Set more variables based on data files FRF = compspeed / 100 rapid = rapid - 2 mX = mX1 mY = mY1 mZ = mZ1 g(16) = 1 g(17) = 1 g(18) = 1 IF IJ = 1 THEN g90.1 = 0 ELSE g90.1 = 1 end if ' Read the third data file OPEN "color.dat" FOR INPUT AS #3 LINE INPUT #3, bground$: bground = VAL(bground$) ' LINE INPUT #3, axis$: axis = VAL(axis$) 'axis display LINE INPUT #3, action$: action = VAL(action$) ' feed, overide, run, block LINE INPUT #3, gee$: gee = VAL(gee$) ' active G codes LINE INPUT #3, en$: en = VAL(en$) ' current line (N) LINE INPUT #3, prompt$: prompt = VAL(prompt$) ' screen prompts CLOSE #3 ' Put the background on the screen CLS COLOR axis, bground FOR p = 1 TO 25 PRINT " " NEXT p ' Write the foreground (menu) on the screen LOCATE 2, 14: PRINT "X" LOCATE 4, 14: PRINT "Y" LOCATE 6, 14: PRINT "Z" COLOR action LOCATE 8, 7: PRINT "F" LOCATE 8, 9: PRINT "100 " LOCATE 10, 7: PRINT "%" LOCATE 10, 9: PRINT "100" COLOR axis LOCATE 6, 36: PRINT "T 0 " COLOR gee LOCATE 2, 1: PRINT "G"; 50 rot = 0 150 ' Entry point for main menu CLOSE '??? What are we closing ??? can = 0 H2 = 0 homing = 0 HomeX = 0 HomeY = 0 HomeZ = 0 KEY(1) OFF KEY(2) OFF COLOR axis, bground LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 LOCATE 6, 1: PRINT "G"; LOCATE 6, 2: IF g90 = 1 THEN PRINT 90; " " LOCATE 6, 2: IF g90.1 = 1 THEN PRINT "90.1" LOCATE 6, 2: IF g90 = 0 THEN PRINT 90 plane = 1 LOCATE 2, 36: PRINT "G 17" goX = 0 goY = 0 goZ = 0 X$ = " " FOR R = 8 TO 23 LOCATE R, 1 PRINT space$(40); NEXT R OUT port, 255 AND NOT rA + rB ' turn off relays POKE &H417, PEEK(&H417 OR &H40) ' kill caps lock POKE &H417, PEEK(&H417 OR &H20) ' kill num lock COLOR prompt LOCATE 21, 1: PRINT " F1 F2 F3 F9 " LOCATE 22, 1: PRINT " AUTO MANUAL MDI DOS " COLOR action ' Tell them which version they're running LOCATE 20, 1: PRINT " Stepster Version 1.4 1/10/00 " 260 ' Loop here until we get a F1, F2, F3 or F9 keystroke ON KEY(1) GOSUB 400 'Go do Auto Mode (execute g code from a file) ON KEY(2) GOSUB 405 'Go do Manual Mode (move and jog from keyboard) ON KEY(3) GOSUB 410 'Go do MDI Mode (execute g code from keyboard) ON KEY(9) GOSUB 415 'Exit program and return to DOS KEY(1) ON KEY(2) ON KEY(3) ON KEY(9) ON KEY(7) OFF KEY(8) OFF KEY(15) OFF KEY(16) OFF KEY(17) OFF KEY(18) OFF KEY(19) OFF KEY(20) OFF KEY(21) OFF KEY(22) OFF KEY(23) OFF KEY(24) OFF 270 IF panel = 0 THEN GOTO 260 'Loop back looking for a keystroke GOSUB 20000 'read panel IF rot = 0 THEN GOTO 400 IF rot = 7 THEN GOTO 410 IF rot <> 0 AND rot <> 7 THEN GOTO 500 GOTO 270 400 ' Entry for Auto Mode KEY(9) OFF MDI = 0 goX = 0 goY = 0 goZ = 0 hey = hey + 1 '??? code fragment, seems not used ??? GOTO 2000 'Auto Mode code section 405 ' Entry for Manual Mode KEY(9) OFF MDI = 0 GOTO 500 'Manual Mode code section 410 ' Entry for MDI Mode KEY(9) OFF MDI = 1 block = 0 GOTO 1000 'MDI Mode code 415 ' Entry for quiting the program CLS 'clear the screen ' Print some statistics PRINT FRE(""); FRE(-1); FRE(-2) SYSTEM 'Exit back to DOS 500 ' Enter here for Manual Mode g90 = 1 'Set absolute positioning g(2) = 1 'Set G01 linear feed g(9) = 100 'Set default feedrate to 100 COLOR action LOCATE 8, 28: PRINT "JOG" COLOR prompt LOCATE 14, 1: PRINT " Press 'X' 'Y' 'Z' to zero" LOCATE 15, 1: PRINT " " LOCATE 17, 2: PRINT CHR$(27); " "; CHR$(26); " "; CHR$(24); " "; PRINT CHR$(25); " - + T F7 F8" LOCATE 18, 1: PRINT " X Y Z TOOL# JOG# MENU" LOCATE 21, 1: PRINT " F1 F2 F3 F4 F5 F6 " LOCATE 22, 1: PRINT "HOLD -OVERIDE+ GOTO XY0 GOTO T0 STOP" ON KEY(2) GOSUB 7984 'Decrease feedrate ON KEY(3) GOSUB 7982 'Increase feedrate KEY(2) ON KEY(3) ON KEY(4) OFF ON KEY(4) GOSUB 810 'Move both x an y to zero KEY(5) OFF ON KEY(5) GOSUB 820 'Change tool to tool zero, zero z axis 580 ' Stop everything, keep values but go back to main menu ON KEY(6) GOSUB 7900 ON KEY(7) GOSUB 800 'Go change the jog amount ON KEY(8) GOSUB 850 'Go back to main menu 585 KEY(7) ON KEY(8) ON KEY(11) ON KEY(12) ON KEY(13) ON KEY(14) ON KEY(19) ON KEY(20) ON KEY(21) ON KEY(22) ON KEY(23) ON KEY(24) ON KEY(4) ON KEY(5) ON KEY(6) ON IF panel = 0 THEN GOTO 600 GOSUB 20000 'read panel IF rot = 0 THEN GOTO 400 IF rot = 7 THEN GOTO 410 IF rot <> 0 AND rot <> 7 THEN GOTO 500 600 KEY(2) STOP KEY(3) STOP KEY(4) STOP KEY(5) STOP KEY(6) STOP COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn COLOR action LOCATE 8, 7: PRINT "F RAPID" LOCATE 10, 7: PRINT "% "; : PRINT USING "###"; OVR * 100 LOCATE 10, 28: PRINT USING "#.####"; jd / 10000; : PRINT " " KEY(2) ON KEY(3) ON KEY(4) ON KEY(5) ON KEY(8) ON IF panel = 1 THEN GOSUB 900 IF gojog = 0 THEN GOTO 585 KEY(7) OFF KEY(8) OFF KEY(11) OFF KEY(12) OFF KEY(13) OFF KEY(14) OFF KEY(19) OFF KEY(20) OFF KEY(21) OFF KEY(22) OFF KEY(23) OFF cycle = 1 hold = 0 mode = 1 GOSUB 6700 'backlash setup then move loop goX = 0 goY = 0 goZ = 0 gojog = 0 cycle = 0 GOTO 585 'Go back to Manual Mode menu and wait for keystroke 700 tn = tn + 1 IF tn > 10 THEN tn = 0 'cycle Tool 705 IF CoSys = 1 THEN bZ = cZ - t(tn) IF CoSys = 2 THEN bZ = cZ + Z54off - t(tn) IF CoSys = 3 THEN bZ = cZ + Z55off - t(tn) RETURN 710 IF CoSys = 1 THEN cX = 0 bX = 0 RETURN 'zero X 720 IF CoSys = 1 THEN cX = 0 bY = 0 RETURN 'zero Y 730 IF tn = 0 THEN cZ = 0 else t(tn) = cZ end if GOTO 705 'zero tool 740 IF mX >= jd THEN jd = mX ELSE jd = jds end if goX = jd * -1 gojog = 1 RETURN 'X- 750 IF mX >= jd THEN jd = mX ELSE jd = jds end if goX = jd gojog = 1 RETURN 'X+ 760 IF mY >= jd THEN jd = mY ELSE jd = jds end if goY = jd gojog = 1 RETURN 'Y+ 770 IF mY >= jd THEN jd = mY ELSE jd = jds end if goY = jd * -1 gojog = 1 RETURN 'Y- 780 IF mZ >= jd THEN jd = mZ ELSE jd = jds end if goZ = jd * -1 gojog = 1 RETURN 'Z+ 790 IF mZ >= jd THEN jd = mZ ELSE jd = jds end if goZ = jd gojog = 1 RETURN 'Z- 800 ' Enter here on a F8 jog, change amount jds = jds / 10 'divide current value by 10 IF jds < 1 THEN jds = 10000 end if jd = jds RETURN 810 ' Move both x and y to zero KEY(4) OFF goX = bX * -1 goY = bY * -1 gojog = 1 'goto XY zero KEY(4) OFF RETURN 820 ' Change tool to tool zero, set z to zero tn = 0 goZ = cZ * -1 gojog = 1 ' call T0, goto Z zero KEY(5) OFF RETURN 850 GOTO 150 'go to menu GOTO 580 900 ' manual panel "gosub 20000" reads switches at LPT port GOSUB 20000 IF rot = 6 THEN IF button = butpress THEN FOR slow = 1 TO 10000 NEXT slow end if IF button = 1 THEN GOSUB 7982 IF button = 2 THEN GOSUB 7984 butpress = button END IF IF rot = 5 THEN IF butpress = button THEN 915 IF button = 1 THEN tn = tn - 1 IF tn < 0 THEN tn = 0 end if end if IF button = 2 THEN tn = tn + 1 IF tn > 10 THEN tn = 10 end if end if bZ = cZ - t(tn) IF button = 3 THEN t(tn) = cZ bZ = cZ - t(tn) end if butpress = button END IF 915 IF rot = 1 THEN 'Jog amount IF butpress = button THEN 920 IF button = 1 THEN jd = jd / 10 IF jd < 1 THEN jd = 1 end if end if IF button = 2 THEN jd = jd * 10 IF jd > 10000 THEN jd = 10000 end if end if butpress = button END IF 920 IF rot = 2 THEN 'Jog x IF button = 1 THEN goX = mX * jd * -1 gojog = 1 end if IF button = 2 THEN goX = mX * jd gojog = 1 end if IF button = 3 THEN bX = 0 END IF IF rot = 3 THEN 'Jog y IF button = 1 THEN goY = mY * jd * -1 gojog = 1 end if IF button = 2 THEN goY = mY * jd gojog = 1 end if IF button = 3 THEN bY = 0 END IF IF rot = 4 THEN 'Jog z IF button = 1 THEN goZ = mZ * jd * -1 gojog = 1 end if IF button = 2 THEN goZ = mZ * jd gojog = 1 end if IF button = 3 THEN t(tn) = cZ bZ = cZ - t(tn) end if END IF IF rot = 7 OR rot = 0 THEN goto 150 'Go to main menu end if RETURN 1000 ' Enter here for MDI Mode KEY(2) STOP KEY(3) STOP KEY(4) STOP g90 = 1 ON KEY(2) GOSUB 7984 ON KEY(3) GOSUB 7982 KEY(2) ON KEY(3) ON COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 38: PRINT tn LOCATE 10, 28 LOCATE 2, 14: PRINT "X" LOCATE 4, 14: PRINT "Y" LOCATE 6, 14: PRINT "Z" COLOR action LOCATE 8, 7: PRINT "F" LOCATE 10, 7: PRINT "%"; : PRINT " " COLOR prompt LOCATE 21, 1: PRINT " F1 F2 F3 F4 F5 F6 " LOCATE 22, 1: PRINT "HOLD -OVERIDE+ BLOCK START STOP" 1500 LOCATE 16, 1: PRINT " " COLOR en ' Get the line of g code LOCATE 16, 1: INPUT l$ goX = 0 goY = 0 goZ = 0 ' If they don't type in anything ' go back to main menu IF l$ = "" THEN MDI = 0 GOTO 150 end if COLOR action IF block = 1 THEN COLOR action LOCATE 10, 28: PRINT "BLOCK MODE" GOTO 1900 end if COLOR action LOCATE 10, 28: PRINT "NORMAL MODE" 1900 cycle = 1 ' Go parse the line GOSUB 3000 ' Get the next line GOTO 1500 STOP 2000 ' AUTO Mode (Read and run a g code file) ON ERROR GOTO 2020 ' Find out which file we last ran on auto mode OPEN "last.dat" FOR INPUT AS #4 LINE INPUT #4, oldfile$ CLOSE #4 GOTO 2021 2020 RESUME 2021 2021 ' CLOSE ON ERROR GOTO 2070 'Trap file name errors GOTO 2100 2070 PRINT PRINT " FILE NOT FOUND" PRINT GOTO 5 2100 ' LOCATE 21, 1: PRINT " " LOCATE 22, 1: PRINT " " file$ = "" COLOR prompt LOCATE 22, 1: PRINT " File to run? "; oldfile$ 2150 ' Give them a chance type a new file name f$ = INKEY$ IF f$ = "" THEN 2150 IF (f$) <> CHR$(13) THEN file$ = file$ + f$ LOCATE 21, 18: PRINT " " LOCATE 21, 18: PRINT file$ GOTO 2150 end if ' If they want to stick with the old file IF file$ = "" THEN file$ = oldfile$ ON ERROR GOTO 2210 CLOSE OPEN file$ FOR INPUT AS #1 lines = 0 ON ERROR GOTO 2200 OPEN "last.dat" FOR OUTPUT AS #4 PRINT #4, file$ CLOSE #4 2180 INPUT #1, lines$ lines = lines + 1 LOCATE 19, 12: PRINT lines GOTO 2180 2200 CLOSE #1 RESUME 2220 2210 CLOSE #1 RESUME 2100 2220 ON ERROR GOTO 150 2310 CLOSE #1 ON KEY(2) GOSUB 7984 ON KEY(3) GOSUB 7982 KEY(2) ON KEY(3) ON OPEN file$ FOR INPUT AS #1 ' CLS : WIDTH 40 COLOR axis LOCATE 2, 14: PRINT "X" LOCATE 4, 14: PRINT "Y" LOCATE 6, 14: PRINT "Z" COLOR action LOCATE 8, 7: PRINT "F" LOCATE 10, 7: PRINT "%": ' " COLOR prompt LOCATE 21, 1: PRINT " F1 F2 F3 F4 F5 F6 " LOCATE 22, 1: PRINT "HOLD -OVERIDE+ BLOCK START STOP" ON KEY(4) GOSUB 2505 'Go toggle block mode KEY(4) ON GOTO 2520 2505 ' Set or clear block mode here IF block = 0 THEN block = 1 ELSE block = 0 end if ' Update block section of screen to show normal mode COLOR action IF block = 1 THEN COLOR action LOCATE 10, 28: PRINT "BLOCK MODE " RETURN end if COLOR action LOCATE 10, 28: PRINT "NORMAL MODE" RETURN 2520 ' Update block section to screen to show block mode IF block = 1 THEN COLOR action LOCATE 10, 28: PRINT "BLOCK MODE" GOTO 2530 end if COLOR action LOCATE 10, 28: PRINT "NORMAL MODE" 2530 ' Begin executing the g code file ON KEY(5) GOSUB 2545 GOTO 2550 2545 cycle = 1 RETURN 2550 ' Stop execution and go to main menu ON KEY(6) GOSUB 2555 GOTO 2560 2555 cycle = 0 RETURN 2560 ' ' FOR linecount = 1 TO lines goX = 0 goY = 0 goZ = 0 goI = 0 goJ = 0 goK = 0 LINE INPUT #1, l$ COLOR prompt LOCATE 19, 2: PRINT "Block " LOCATE 19, 7: PRINT USING "######"; linecount LOCATE 19, 14: PRINT "OF " LOCATE 19, 16: PRINT USING "######"; lines 3000 ' Enter here to parse a line of g code ' (from either Auto or Manual Modes) FOR letter = 1 TO LEN(l$) Q$ = MID$(l$, letter, 1) IF Q$ = "(" THEN COLOR en LOCATE 17, 1: PRINT " " LOCATE 18, 1: PRINT " " LOCATE 17, 1: PRINT "("; RIGHT$(l$, LEN(l$) - letter) GOTO 3500 END IF ' Read the first letter and then ' decide what to do IF Q$ <> " " THEN IF Q$ = "N" THEN place = 1: GOTO 5000 IF Q$ = "G" THEN place = 2: GOTO 5000 IF Q$ = "X" THEN place = 3: GOTO 5000 IF Q$ = "Y" THEN place = 4: GOTO 5000 IF Q$ = "Z" THEN place = 5: GOTO 5000 IF Q$ = "I" THEN place = 6: GOTO 5000 IF Q$ = "J" THEN place = 7: GOTO 5000 IF Q$ = "K" THEN place = 8: GOTO 5000 IF Q$ = "F" THEN place = 9: GOTO 5000 IF Q$ = "M" THEN place = 10: GOTO 5000 IF Q$ = "S" THEN place = 11: GOTO 5000 IF Q$ = "T" THEN place = 12: GOTO 5000 IF Q$ = "L" THEN place = 14: GOTO 5000 IF Q$ = "P" THEN place = 15: GOTO 5000 IF Q$ = "U" THEN place = 16: GOTO 5000 IF Q$ = "V" THEN place = 17: GOTO 5000 IF Q$ = "W" THEN place = 18: GOTO 5000 IF Q$ = "R" THEN place = 19: GOTO 5000 IF Q$ = "n" THEN place = 1: GOTO 5000 IF Q$ = "g" THEN place = 2: GOTO 5000 IF Q$ = "x" THEN place = 3: GOTO 5000 IF Q$ = "y" THEN place = 4: GOTO 5000 IF Q$ = "z" THEN place = 5: GOTO 5000 IF Q$ = "i" THEN place = 6: GOTO 5000 IF Q$ = "j" THEN place = 7: GOTO 5000 IF Q$ = "k" THEN place = 8: GOTO 5000 IF Q$ = "f" THEN place = 9: GOTO 5000 IF Q$ = "m" THEN place = 10: GOTO 5000 IF Q$ = "s" THEN place = 11: GOTO 5000 IF Q$ = "t" THEN place = 12: GOTO 5000 IF Q$ = "\" THEN place = 13: GOTO 5030 IF Q$ = "l" THEN place = 14: GOTO 5000 IF Q$ = "p" THEN place = 15: GOTO 5000 IF Q$ = "u" THEN place = 16: GOTO 5000 IF Q$ = "v" THEN place = 17: GOTO 5000 IF Q$ = "w" THEN place = 18: GOTO 5000 IF Q$ = "r" THEN place = 19: GOTO 5000 end if 3400 NEXT letter 3500 ' POST PARSER GUIDE ' epa = end point angle, cpa = center point angle IF rot = 1 AND mode < 5 THEN 'rotation G53 'convert to polar coords, add angle, convert back X = g(3) Y = g(4) I = g(6) J = g(7) U = g(16) V = g(17) R = g(19) IF g90 = 0 THEN X = bX + g(3) Y = bY + g(4) end if IF g90.1 = 0 THEN I = oldX + g(6) J = oldY + g(7) end if exx = ABS(X - U) wye = ABS(Y - V) eye = ABS(I - U) jay = ABS(J - V) IF exx = 0 THEN epa = pi / 2 IF wye = 0 THEN epa = 0 IF exx <> 0 AND wye <> 0 THEN epa = ATN(wye / exx) IF eye = 0 THEN cpa = pi / 2 IF jay = 0 THEN cpa = 0 IF eye <> 0 AND jay <> 0 THEN cpa = ATN(jay / eye) 'should the following sections be" pi /2 + epa", etc.? NO, WORKS OK IF X < U AND Y > V THEN epa = pi - epa IF X <= U AND Y <= V THEN epa = pi + epa IF X > U AND Y <= V THEN epa = 2 * pi - epa IF I <= U AND J > V THEN cpa = pi - cpa IF I <= U AND J <= V THEN cpa = pi + cpa IF I > U AND J <= V THEN cpa = 2 * pi - cpa epr = SQR(exx * exx + wye * wye) 'end point radius cpr = SQR(eye * eye + jay * jay) ' center point radius epa = epa + (R * pi / 180)' radians/degrees cpa = cpa + (R * pi / 180) Xa = epr * COS(epa) Ya = epr * SIN(epa) Ia = cpr * COS(cpa) Ja = cpr * SIN(cpa) goX = Xa * 10000 - bX goY = Ya * 10000 - bY goI = Ia * 10000 - bX goJ = Ja * 10000 - bY ' I & J need to be based off of old X and Y oldX = X oldY = Y END IF KEY(6) STOP ON KEY(6) GOSUB 7900 'POST PARSER COLOR action IF hold = 0 AND cycle = 1 THEN LOCATE 8, 28: PRINT "RUN " end if IF cycle = 0 THEN LOCATE 8, 28: PRINT "STOP " end if IF block <> 0 THEN cycle = 0 end if 3505 LOCATE 14, 1: PRINT " " LOCATE 15, 1: PRINT " " COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 38: PRINT tn COLOR en LOCATE 14, 1: PRINT l$ COLOR action LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT " " KEY(5) ON KEY(6) ON IF hold = 0 AND cycle = 1 THEN LOCATE 8, 28: PRINT "RUN " end if IF cycle = 0 THEN LOCATE 8, 28: PRINT "STOP " end if do 'Just keep going around! loop while cycle = 0 ' Go do the operation specified by mode ON mode GOSUB 6700, 6700, 8000, 8000, 3625, 3650, 3600, 3700, 3550, 3750 ' rapid line G2 G3 dwell g92 readT loadT null,scaling ' 1 2 3 4 5 6 7 8 9 10 ' Return here after doing the operaton IF HomeX = 1 THEN HomeX = 0 H2 = 1 '2nd Homing Move. mode = 1 goX = backX GOSUB 6700 H2 = 0 cX = 0 bX = 0 mode = 9 GOTO 3505 END IF IF HomeY = 1 THEN HomeY = 0 H2 = 1 'Home Y mode = 1 goY = backY GOSUB 6700 H2 = 0 cY = 0 bY = 0 mode = 9 GOTO 3505 END IF IF HomeZ = 1 THEN HomeZ = 0 H2 = 1 'Home Z mode = 1 goZ = backZ GOSUB 6700 H2 = 0 cZ = 0 bZ = 0 mode = 9 GOTO 3505 END IF ' G81 drill cycle IF can = 1 THEN IF g90 = 1 THEN goZ = g(5) * 10000 - bZ IF g90 = 0 THEN goZ = g(5) * 10000 mode = 2 goX = 0 goY = 0 GOSUB 6700 IF g90 = 1 THEN goZ = g(19) * 10000 - bZ IF g90 = 0 THEN goZ = g(19) * 10000 mode = 1 goX = 0 goY = 0 GOSUB 6700 END IF tread = 0 3550 IF MDI = 1 THEN cycle = 0 GOTO 1500 end if NEXT linecount LOCATE 14, 1: PRINT " " cycle = 0 GOTO 150 ' 2310: '150 'end post parser 3600 ' Tool Data Read MODE 7 tn = g(12) t(tn) = g(14) * 10000 mode = 9 RETURN 3625 ' Dwell MODE 4 do 'just idle here loop while cycle = 0 DELAY g(15) RETURN 3650 ' G92 G53 MODE 6 IF CoSys = 2 THEN ' G92 G54 bX = g(3) * 10000 bY = g(4) * 10000 bZ = g(5) * 10000 X54off = cX - bX Y54off = cY - bY Z54off = cZ - bZ COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 mode = 9 RETURN end if IF CoSys = 3 THEN ' G92 G55 bX = g(3) * 10000 bY = g(4) * 10000 bZ = g(5) * 10000 X55off = cX - bX Y55off = cY - bY Z55off = cZ - bZ COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 mode = 9 RETURN end if CoSys = 1 cX = g(3) * 10000 cY = g(4) * 10000 cZ = g(5) * 10000 t(0) = cZ bX = cX bY = cY bZ = cZ COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn mode = 8 COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 RETURN STOP 3700 ' Tool Data Load MODE 8 IF CoSys = 1 THEN bZ = cZ - t(tn1) IF CoSys = 2 THEN bZ = cZ + Z54off - t(tn1) IF CoSys = 3 THEN bZ = cZ + Z55off - t(tn1) COLOR axis LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 mode = 9 RETURN 3750 ' Scaling MODE 10 COLOR gee LOCATE 2, 1: PRINT "G"; g(2) IF g(2) = 51 THEN IF g(16) = 0 THEN g(16) = 1 'U IF g(17) = 0 THEN g(17) = 1 'V IF g(18) = 0 THEN g(18) = 1 'W g(16) = ABS(g(16)) g(17) = ABS(g(17)) g(18) = ABS(g(18)) mX = mX1 / g(16) mY = mY1 / g(17) mZ = mZ1 / g(18) COLOR gee LOCATE 2, 7: PRINT " " LOCATE 2, 7: PRINT USING "###"; g(16) * 100; : PRINT "%" LOCATE 4, 7: PRINT " " LOCATE 4, 7: PRINT USING "###"; g(17) * 100; : PRINT "%" LOCATE 6, 7: PRINT " " LOCATE 6, 7: PRINT USING "###"; g(18) * 100; : PRINT "%" RETURN END IF ' Unscaling IF g(2) = 50 THEN rot = 0 mX = mX1 mY = mY1 mZ = mZ1 g(16) = 1 g(17) = 1 g(18) = 1 LOCATE 2, 7: PRINT " " LOCATE 4, 7: PRINT " " LOCATE 6, 7: PRINT " " LOCATE 4, 35: PRINT " " RETURN END IF IF g(2) = 52 THEN rot = 1 COLOR gee LOCATE 4, 35: PRINT "R "; : PRINT USING "###"; g(19) RETURN END IF 5000 ' PARSER IF MID$(l$, letter + 1, 2) = "- " THEN MID$(l$, letter + 1, 2) = " -" end if g(place) = VAL(MID$(l$, letter + 1, 10)) letter = letter + 1 5030 ON place GOTO 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6425, 6450, 6475, 6500, 6550 ' N G X Y Z I J K F M S T \ L P U V W R ' g( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 stop 5100 ' PARSE N GOTO 3400 'next letter 5200 ' PARSE G 'trap g92, g90, g91 ,g04 ' G00 Rapid traverse IF g(2) = 0 THEN mode = 1 can = 0 GOTO 3400 'Get next letter end if ' G01 Linear feed move IF g(2) = 1 THEN mode = 2 can = 0 GOTO 3400 end if ' G02 Clockwise arc IF g(2) = 2 THEN mode = 3 can = 0 GOTO 3400 end if ' G03 Counter clockwise arc IF g(2) = 3 THEN mode = 4 can = 0 GOTO 3400 end if ' G04 Dwell (in seconds) IF g(2) = 4 THEN mode = 5 GOTO 3400 end if ' G17 Arcs are in the xy plane IF g(2) = 17 THEN COLOR gee plane = 1 LOCATE 2, 36: PRINT "G 17" GOTO 3400 END IF ' G18 Arcs are in the xz plane IF g(2) = 18 THEN COLOR gee plane = 2 LOCATE 2, 36: PRINT "G 18" GOTO 3400 END IF ' G19 Arcs are in the yz plane IF g(2) = 19 THEN COLOR gee plane = 3 LOCATE 2, 36: PRINT "G 19" GOTO 3400 END IF ' G50 Cancel scaling IF g(2) = 50 THEN mode = 10 GOTO 3400 end if ' G51 Use scaling IF g(2) = 51 THEN mode = 10 GOTO 3400 end if ' G52 Rotate xy about z IF g(2) = 52 THEN mode = 10 GOTO 3400 end if ' G53 Machine coordinate system IF g(2) <> 53 THEN goto 5250 end if CoSys = 1 bX = cX bY = cY bZ = cZ - t(tn) COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 mode = 9 ' null mode GOTO 3400 5250 ' G54 Work coordiante system #1 IF g(2) <> 54 THEN goto 5260 end if CoSys = 2 bX = cX - X54off bY = cY - Y54off bZ = cZ - Z54off - t(tn) COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn mode = 9 COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 GOTO 3400 5260 ' G55 Work coordinate system #2 IF g(2) <> 55 THEN goto 5270 end if CoSys = 3 bX = cX - X55off bY = cY - Y55off bZ = cZ - Z55off - t(tn) COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 LOCATE 6, 36: PRINT "T"; tn mode = 9 COLOR gee LOCATE 4, 1: PRINT "G"; CoSys + 52 GOTO 3400 5270 ' G81 Canned drill cycle IF g(2) = 81 THEN can = 1 mode = 1 GOTO 3400 end if ' G90 Absolute positioning IF g(2) = 90 THEN g90 = 1 g90.1 = 0 mode = 9 COLOR gee LOCATE 6, 1: PRINT "G 90 " GOTO 3400 END IF ' G91 Incremental positioning IF g(2) = 91 THEN ' xxxxxx bug? g90 = 0 g90.1 = 0 mode = 9 COLOR gee LOCATE 6, 1: PRINT "G 91 " GOTO 3400 END IF ' G90.1 Absolute positioning IF g(2) = 90.1 THEN ' xxxx bug? should g90 be set to 0? g90.1 = 1 g90 = 1 mode = 9 COLOR gee LOCATE 6, 1: PRINT "G90.1" GOTO 3400 END IF ' G92 Relocate origin, absolute zero IF g(2) = 92 THEN mode = 6 ' \ = tlength = mode 7 ' T= mode 8= load tool offset ' mode 9 = null GOTO 3400 'next letter 5300 ' PARSE X IF g90 = 1 THEN goX = g(3) * 10000 - bX GOTO 3400 end if IF g90 = 0 THEN goX = g(3) * 10000 GOTO 3400 end if 5400 ' PARSE Y IF g90 = 1 THEN goY = g(4) * 10000 - bY GOTO 3400 end if IF g90 = 0 THEN goY = g(4) * 10000 GOTO 3400 end if 5500 ' PARSE Z IF can = 1 THEN goZ = 0 GOTO 3400 end if IF g90 = 1 THEN goZ = g(5) * 10000 - bZ GOTO 3400 end if IF g90 = 0 THEN goZ = g(5) * 10000 GOTO 3400 end if 5600 ' PARSE I IF g90.1 = 0 THEN goI = g(6) * 10000 GOTO 3400 end if IF g90.1 = 1 THEN goI = g(6) * 10000 - bX GOTO 3400 end if goI = ABS(goI) 5700 ' PARSE J IF g90.1 = 0 THEN goJ = g(7) * 10000 GOTO 3400 end if IF g90.1 = 1 THEN goJ = g(7) * 10000 - bY GOTO 3400 end if goJ = ABS(goJ) 5800 ' PARSE K IF g90.1 = 0 THEN goK = g(8) * 10000 GOTO 3400 end if IF g90.1 = 1 THEN goK = g(8) * 10000 - bZ GOTO 3400 end if goK = ABS(goK) 5900 ' PARSE F GOTO 3400 6000 ' PARSE M IF g(10) = 101 THEN HomeX = 1 homing = 1 GOTO 3400 end if IF g(10) = 102 THEN HomeY = 1 homing = 1 GOTO 3400 end if IF g(10) = 103 THEN HomeZ = 1 homing = 1 GOTO 3400 end if IF g(10) = 0 THEN cycle = 0 p7 = rA p8 = rB end if IF g(10) = 2 THEN cycle = 0 p7 = rA p8 = rB GOTO 150 end if IF g(10) = 3 THEN p7 = 0 ' 0 for on, r? for off end if IF g(10) = 5 THEN p7 = rA end if IF g(10) = 6 THEN p7 = rA p8 = rB cycle = 0 end if IF g(10) = 8 THEN p8 = 0 end if IF g(10) = 9 THEN p8 = rB end if IF g(10) = 30 THEN p7 = rA p8 = rB cycle = 0 linecount = 1 GOTO 2310 end if OUT port, 255 AND NOT p7 + p8 GOTO 3400 6100 ' PARSE S GOTO 3400 6200 ' PARSE T tn1 = g(12) IF mode <> 7 THEN mode = 8 tn = g(12) end if GOTO 3400 6300 ' PARSE \ -set tool length mode = 7 GOTO 3400 6400 ' PARSE L g(14) = ABS(g(14)) GOTO 3400 6425 ' Parse P g(15) = ABS(g(15)) GOTO 3400 6450 ' parse U GOTO 3400 6475 ' Parse V GOTO 3400 6500 ' Parse W GOTO 3400 6550 ' Parse R GOTO 3400 6700 ' Linear move ' Enter here from parser or Manual Mode menu ' to do a linear move arc = 0 'Clear flag to indicate this is a linear move ' First do backlash setup & execution ' Figure out which direction - or + we ' need to move each axis IF goX < 0 THEN Xdir = -1 ELSE Xdir = 1 IF goY < 0 THEN Ydir = -1 ELSE Ydir = 1 IF goZ < 0 THEN Zdir = -1 ELSE Zdir = 1 ' Don't do any backlash if this is our first ' move during this session IF firstmove = 0 THEN firstmove = 1 GOTO 6790 end if ' Otherwise, see if we should do backlash comp Xtemp = goX Ytemp = goY Ztemp = goZ goX = 0 goY = 0 goZ = 0 ' Check to see if there's been a change in direction IF Xdir <> oldXdir THEN goX = Xb * Xdir bkl = 1 end if IF Ydir <> oldYdir THEN goY = Yb * Ydir bkl = 1 end if IF Zdir <> oldZdir THEN goZ = Zb * Zdir bkl = 1 end if IF bkl = 1 THEN GOSUB 7000 'If change then do backlash end if ' Restore variables bkl = 0 goX = Xtemp goY = Ytemp goZ = Ztemp 6790 GOSUB 7000 RETURN 'to parser or manual 7000 ' Straight linear move ' ON ERROR GOTO 150 'main menu KEY(1) OFF ON KEY(1) GOSUB 7901 'hold ON KEY(2) GOSUB 7984 'feed - ON KEY(3) GOSUB 7982 'feed + KEY(1) ON KEY(2) ON KEY(3) ON 7100 ' Enter here from arc backlash routines ' Arc backlash is just a linear move ' Figure out acceleration and deceleration ' distances, adjusted for any scaling that ' might be in effect Ad = INT(g(9)) * accd 'Feedrate times distance Dd = INT(g(9)) * accd IF g(9) = 0 THEN g(9) = .1 Frn = ABS(g(9)) Fdr = Frn IF Fdr = 0 THEN Fdr = 1 end if END IF go = 0 IF bkl = 1 THEN Fdr = 100 ELSE Fdr = ABS(g(9)) end if IF mode = 1 THEN Fdr = 100 end if IF bkl = 1 OR mode = 1 THEN Ad = 100 * accd Dd = 100 * accd end if Finv = Fdr * .01 ' * OVR goX = ABS(goX) goY = ABS(goY) goZ = ABS(goZ) ' Figure out how many steps need to be taken ' to get where we want to go IF goX = 0 THEN stX = 0 ELSE stX = goX / mX IF goY = 0 THEN stY = 0 ELSE stY = goY / mY IF goZ = 0 THEN stZ = 0 ELSE stZ = goZ / mZ stX = ABS(stX) stY = ABS(stY) stZ = ABS(stZ) ' Arc routines call the linear move routine to do ' backlash comp. We need to make sure we're using ' the right variable to set the direction pin so ' we don't get the wrong directions pt = 255 AND NOT p7 + p8 'preset direction pins IF arc = 0 THEN 'We have come from a linear move IF Xdir = -1 THEN pt = pt AND NOT nX IF Ydir = -1 THEN pt = pt AND NOT nY IF Zdir = -1 THEN pt = pt AND NOT nZ ELSE 'We're doing backlash from G2 or G3 IF CosDir = -1 THEN pt = pt AND NOT CosDirPin ' leave direction pins on IF SinDir = -1 THEN pt = pt AND NOT SinDirPin IF LinDir = -1 THEN pt = pt AND NOT LinDirPin END IF OUT port, pt ' Figure out which axis has the longer to move ' then set our loop counter to it, cycles to step IF stX >= stY AND stX >= stZ THEN cts = stX GOTO 7230 end if IF stY >= stZ AND stY >= stX THEN cts = stY GOTO 7230 end if IF stZ >= stY AND stZ >= stY THEN cts = stZ GOTO 7230 end if 7230 ' Figure the percentage (per) of each axis ' we have to move IF goX = 0 THEN perX = 0 ELSE perX = goX / cts IF goY = 0 THEN perY = 0 ELSE perY = goY / cts IF goZ = 0 THEN perZ = 0 ELSE perZ = goZ / cts ' The t (travel) variable tracks how far each ' axis is moved while in move loop tX = 0 tY = 0 tZ = 0 start = 1 cnt = 0 'Counts actual number of passes through move loop half = cts / 2 ct = 0 IF hold = 1 THEN COLOR action LOCATE 8, 28: PRINT "HOLD" end if COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 COLOR action LOCATE 8, 9: PRINT USING "###"; Fdr; : PRINT " " IF Fdr = 100 AND bkl = 0 THEN LOCATE 8, 9: PRINT "RAPID " END IF IF bkl = 1 THEN LOCATE 8, 9: PRINT "SLACK" end if ON KEY(6) GOSUB 150 KEY(6) ON 7260 IF panel <> 0 THEN GOSUB 20000 'Panel IF button = 4 THEN hold = 1 GOSUB 7915 ' hold end if IF button = 1 THEN GOSUB 7984 ' ovr - end if IF button = 2 THEN GOSUB 7982 ' ovr + end if end if ' KEY(5) OFF KEY(6) OFF ON KEY(6) GOSUB 7900 KEY(6) ON 'hold & stop IF hold = 0 AND cycle = 1 THEN COLOR action LOCATE 8, 28: PRINT "RUN " end if IF hold = 1 THEN 7260 ' IF cycle = 0 THEN GOTO 7260 IF goX < mX THEN goX = 0 IF goY < mY THEN goY = 0 IF goZ < mZ THEN goZ = 0 OUT port2, 4 hold = 0 ' Main Move Loop ' DO WHILE goX > tX OR goY > tY OR goZ > tZ 'BEGIN MOVE LOOP FOR L1 = 0 TO cts 'cycles to step ' Check to see if we should move this axis ' Move if distance we want to go is greater ' than distance already traveled IF tX >= goX THEN GOTO 7345 'X Axis ' Check to see if we can fit the distance ' left to go in a step length Xe = cnt * perX - tX IF Xe < mX THEN GOTO 7345 'X= actual X, cX = machine X, bX = absolute X tX = tX + mX pt = pt AND NOT pX IF bkl = 0 THEN IF Xdir = -1 THEN bX = bX - mX cX = cX - mX1 ELSE bX = bX + mX cX = cX + mX1 end if END IF 7345 COLOR axis LOCATE 2, 16: PRINT USING "######.####"; INT(bX) / 10000 IF tY >= goY THEN GOTO 7400 'Y Axis Ye = cnt * perY - tY IF Ye < mY THEN GOTO 7400 tY = tY + mY pt = pt AND NOT pY IF bkl = 0 THEN IF Ydir = -1 THEN bY = bY - mY cY = cY - mY1 ELSE bY = bY + mY cY = cY + mY1 end if END IF 7400 COLOR axis LOCATE 4, 16: PRINT USING "######.####"; INT(bY) / 10000 IF tZ >= goZ THEN GOTO 7485 'Z Axis Ze = cnt * perZ - tZ IF Ze < mZ THEN GOTO 7485 tZ = tZ + mZ pt = pt AND NOT pZ IF bkl = 0 THEN IF Zdir = -1 THEN bZ = bZ - mZ cZ = cZ - mZ1 ELSE bZ = bZ + mZ cZ = cZ + mZ1 end if END IF 7485 COLOR axis LOCATE 6, 16: PRINT USING "######.####"; INT(bZ) / 10000 'Limit Switches IF INP(port2) = 236 THEN hold = 1 GOSUB 7915 end if ' Finally, output the step pulse OUT port, pt ' LOCATE 8, 9: PRINT " " ' LOCATE 8, 9 ' IF mode = 2 THEN ' COLOR action: PRINT USING "###"; g(9) ' ELSE : COLOR action: PRINT "RAPID" ' END IF KEY(1) ON KEY(2) ON KEY(3) ON ' acceleration loop IF (go > Ad OR go > half) or hold = 1 THEN goto 7600 end if FOR c = Ad - ct TO 1 STEP accf * -1 NEXT c ct = ct + 1 7600 ' deceleration loop IF (cnt < cts - Dd OR cnt < half) or hold = 1 THEN goto 7625 end if FOR c = cnt - (cts - Dd) TO 1 STEP accf * -1 ' cnt = current count; cts= total counts; Dd=decel distance ' accf = accel / decel factor, from setspeed NEXT c 7625 ' SLOW TO HOLD IF hold = 0 THEN goto 7670 end if FOR h = htg TO hl STEP accf NEXT h htg = htg - 1 7645 IF panel <> 0 THEN GOSUB 20000 IF button = 3 THEN hold = 0 end if IF button = 1 THEN GOSUB 7984 end if IF button = 2 THEN GOSUB 7982 end if IF rot > 1 AND rot < 6 AND htg < 0 THEN goto 150 end if end if KEY(1) ON KEY(2) ON KEY(3) ON IF htg < 0 AND hold = 1 THEN IF homing = 1 THEN homing = 0 hold = 0 GOTO 7827 end if GOTO 7645 END IF 7670 ' FEED FOR SLO = Fdr * FRF TO (compspeed / OVR + rpd) / Finv NEXT SLO ' KEY(1) STOP KEY(2) STOP KEY(3) STOP ' Reset port, bring the step signals back inactive pt = 255 AND NOT p7 + p8 ' leave relays on IF arc = 0 THEN 'We have come from a linear move IF Xdir = -1 THEN pt = pt AND NOT nX IF Ydir = -1 THEN pt = pt AND NOT nY IF Zdir = -1 THEN pt = pt AND NOT nZ ELSE 'We're doing backlash from G2 or G3 IF CosDir = -1 THEN pt = pt AND NOT CosDirPin ' leave direction pins on IF SinDir = -1 THEN pt = pt AND NOT SinDirPin IF LinDir = -1 THEN pt = pt AND NOT LinDirPin END IF OUT port, pt IF panel <> 0 THEN GOSUB 20000 'button IF button = 4 THEN hold = 1 GOSUB 7915 ' hold end if IF button = 1 THEN GOSUB 7984 ' ovr - IF button = 2 THEN GOSUB 7982 ' ovr + end if cnt = cnt + 1 go = go + 1 ' Loop NEXT L1 7827 ' Clean up and Get Out ' Changes here to fix broken ' linear backlash ' IF bkl = 0 THEN IF Xdir < 0 THEN oldXdir = -1 ELSE oldXdir = 1 IF Ydir < 0 THEN oldYdir = -1 ELSE oldYdir = 1 IF Zdir < 0 THEN oldZdir = -1 ELSE oldZdir = 1 ' END IF RETURN 'to backlash section or arc quadrant direction selection section 7900 ' Enter here to stop, keep xyz and tool values ' but return to main menu cycle = 0 GOTO 150 'stop is immediate and non recoverable 7901 ' Toggle the hold flag IF hold = 1 THEN hold = 0 ELSE hold = 1 end if IF hold = 0 THEN goto 7950 'Unhold if on hold end if 7915 IF H2 = 1 THEN hold = 0 RETURN end if IF cnt < cts - Dd THEN hl = Dd / 2 GOTO 7925 end if hl = cts - cnt 7925 htg = hl COLOR action LOCATE 8, 28: PRINT "HOLD " IF cycle = 1 THEN RETURN end if RETURN 7950 ' unhold IF cnt < cts - (Ad + Dd) THEN reaccel = Ad GOTO 7970 end if reaccel = (cts - cnt) / 2 half = cts + reaccel go = 0 ct = 1 7970 COLOR action LOCATE 8, 28: PRINT "RUN " RETURN ' Feedrate overide 7982 ' Increase the feedrate OVR = OVR + .01 GOTO 7985 7984 ' Decrease the feedrate OVR = OVR - .01 IF OVR < .01 THEN OVR = .01 end if 7985 IF OVR > 1 THEN OVR = 1 COLOR action ' Write the new feedrate to screen LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT " " RETURN 8000 ' Enter here to perform G02 or G03 arc operations arc = 1 'Let anyone who cares know we're doing arc operations Ad = INT(g(9)) * accd Dd = (g(9)) * accd 'ARC SETUP Frn = ABS(g(9)) Fdr = Frn FinvArc = ABS(g(9)) * .01 IF Fdr = 0 THEN Fdr = 1 IF plane = 1 THEN goCos = goX goSin = goY goLin = goZ CosOff = goI SinOff = goJ CosM = mX SinM = mY LinM = mZ CosM1 = mX1 SinM1 = mY1 LinM1 = mZ1 CosDirPin = nX SinDirPin = nY LinDirPin = nZ CosStepPin = pX SinStepPin = pY LinStepPin = pZ CosLoc = 2 SinLoc = 4 LinLoc = 6 oldCosDir = oldXdir oldSinDir = oldYdir oldLinDir = oldZdir END IF IF plane = 2 THEN goCos = goX goSin = goZ goLin = goY CosOff = goI SinOff = goK CosM = mX SinM = mZ LinM = mY CosM1 = mX1 SinM1 = mZ1 LinM1 = mY1 CosDirPin = nX SinDirPin = nZ LinDirPin = nY CosStepPin = pX SinStepPin = pZ LinStepPin = pY CosLoc = 2 SinLoc = 6 LinLoc = 4 oldCosDir = oldXdir oldSinDir = oldZdir oldLinDir = oldYdir END IF IF plane = 3 THEN goCos = goY goSin = goZ goLin = goX CosOff = goJ SinOff = goK CosM = mY SinM = mZ LinM = mX CosM1 = mY1 SinM1 = mZ1 LinM1 = mX1 CosDirPin = nY SinDirPin = nZ LinDirPin = nX CosStepPin = pY SinStepPin = pZ LinStepPin = pX CosLoc = 4 SinLoc = 6 LinLoc = 2 oldCosDir = oldYdir oldSinDir = oldZdir oldLinDir = oldXdir END IF ' Calculate arc angles accel = 100 togo = 101 decel = 100 ct = 0 tohold = -1 R1 = SQR(CosOff * CosOff + SinOff * SinOff) IF g90.1 = 1 THEN I1 = CosOff - goCos J1 = SinOff - goSin else ' new I & J routine uses SIGNED I and J I1 = goCos + CosOff * -1 J1 = goSin + SinOff * -1 I1 = I1 * -1 J1 = J1 * -1 end if IF CosOff = 0 THEN CosOff = .00001 end if IF I1 = 0 THEN I1 = .00001 end if stangle = ATN(SinOff / CosOff) endangle = ATN(J1 / I1) IF g(2) = 3 THEN 'Conter clockwise arc IF CosOff >= 0 AND SinOff >= 0 THEN stangle = pi + stangle 'OK 247,202 IF CosOff >= 0 AND SinOff < 0 THEN stangle = pi + stangle '158,112 IF CosOff < 0 AND SinOff < 0 THEN stangle = stangle + 0 'OK 68, IF CosOff < 0 AND SinOff >= 0 THEN stangle = stangle + pi * 2 'OK 338 IF I1 < 0 AND J1 >= 0 THEN endangle = endangle + pi * 2 'OK 338,292 IF I1 < 0 AND J1 < 0 THEN endangle = endangle + 0 'OK 68, IF I1 >= 0 AND J1 < 0 THEN endangle = endangle + pi 'OK 158,112 IF I1 >= 0 AND J1 >= 0 THEN endangle = pi + endangle 'OK 202 deg IF endangle <= stangle THEN endangle = endangle + pi * 2 sweep = endangle - stangle END IF IF g(2) = 2 THEN 'Clockwise arc ' >= needs checked IF CosOff >= 0 AND SinOff >= 0 THEN stangle = pi + stangle 'OK 247,202 IF CosOff >= 0 AND SinOff < 0 THEN stangle = pi + stangle '158,112 IF CosOff < 0 AND SinOff < 0 THEN stangle = stangle + 0 'OK 68, IF CosOff < 0 AND SinOff >= 0 THEN stangle = stangle + pi * 2 'OK 338 IF I1 < 0 AND J1 >= 0 THEN endangle = endangle + pi * 2 'OK 338,292 IF I1 < 0 AND J1 < 0 THEN endangle = endangle + 0 'OK 68, IF I1 >= 0 AND J1 < 0 THEN endangle = endangle + pi 'OK 158,112 IF I1 >= 0 AND J1 >= 0 THEN endangle = pi + endangle 'OK 202 deg IF endangle >= stangle THEN stangle = stangle + pi * 2 sweep = stangle - endangle END IF CosAct = COS(stangle) * R1 SinAct = SIN(stangle) * R1 IF ABS(CosAct) < .00001 THEN CosAct = 0 IF ABS(SinAct) < .00001 THEN SinAct = 0 Ang = stangle CosDelta = ATN(CosM / R1) SinDelta = ATN(SinM / R1) IF CosDelta >= SinDelta THEN Delta = SinDelta ELSE Delta = CosDelta end if 8345 cts = INT(sweep / Delta) togo = cts LinReps = cts half = cts / 2 count = 0 go = 0 IF goLin = 0 THEN LinSteps = 0 ELSE LinSteps = goLin / LinM ' steps for Z axis move end if IF LinSteps > cts THEN Delta = Delta / 2 GOTO 8345 end if ' make sure Z move can finish LinPer = ABS(goLin / LinReps) ' amount z axis must move per iteration LinAct = 0 ' actual pos (incremental) set to zero IF goLin < 0 THEN LinDir = -1 ELSE LinDir = 1 end if goLin = ABS(goLin) KEY(1) OFF KEY(2) OFF KEY(3) OFF ON KEY(1) GOSUB 9905 ON KEY(2) GOSUB 9984 ON KEY(3) GOSUB 9982 ON KEY(6) GOSUB 9900 KEY(1) ON KEY(2) ON KEY(3) ON KEY(6) ON COLOR action LOCATE 8, 9: PRINT USING "###"; g(9) LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT " "; ON KEY(6) GOSUB 150 KEY(6) ON IF panel <> 0 THEN do GOSUB 20000 IF button = 4 THEN hold = 1 GOSUB 9915 'hold panel end if IF button = 1 THEN GOSUB 9984 ' ovr - IF button = 2 THEN GOSUB 9982 ' ovr + IF panel AND button = 3 THEN cycle = 1 end if loop while cycle = 0 end if IF g(2) <> 3 THEN '************************************************************************ 'check the G02 (clockwise) Quadrants CosIs = 1 CosDir = -1 SinIs = -1 SinDir = -1 '4 ok GOSUB 8905 'Preset the direction pins for any moves in this quad ' Check to see if we're on a quadrant boundary and if we are go ' do backlash compensation IF Ang > pi * 3.5 AND Ang <= pi * 4 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * 3.5 'If angle is in this quad GOSUB 9000 'Go do an arc move 'Repeat until through the quadrant loop 'quad 3 CosIs = -1 CosDir = -1 SinIs = -1 SinDir = 1 '3 ok GOSUB 8905 IF Ang > pi * 3 AND Ang <= pi * 3.5 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * 3 GOSUB 9000 loop '8555 Quad 2 CosIs = -1 CosDir = 1 SinIs = 1 SinDir = 1 '2 ok GOSUB 8905 IF Ang > pi * 2.5 AND Ang <= pi * 3 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * 2.5 gosub 9000 loop '8580 Quad 1 CosIs = 1 CosDir = 1 SinIs = 1 SinDir = -1 '1 ok GOSUB 8905 IF Ang > pi * 2 AND Ang <= pi * 2.5 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * 2 GOSUB 9000 loop '8605 Quad 4 CosIs = 1 CosDir = -1 SinIs = -1 SinDir = -1 '4 GOSUB 8905 IF Ang > pi * 1.5 AND Ang <= pi * 2 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * 1.5 GOSUB 9000 loop '8630 CosIs = -1 CosDir = -1 SinIs = -1 SinDir = 1 GOSUB 8905 IF Ang > pi * 1 AND Ang <= pi * 1.5 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * 1 GOSUB 9000 loop '8655 CosIs = -1 CosDir = 1 SinIs = 1 SinDir = 1 GOSUB 8905 IF Ang > pi * .5 AND Ang <= pi * 1 THEN bkl = 1 GOSUB 10000 end if do while Ang => pi * .5 GOSUB 9000 loop '8680 CosIs = 1 CosDir = 1 SinIs = 1 SinDir = -1 GOSUB 8905 IF Ang > 0 AND Ang <= pi * .5 THEN bkl = 1 GOSUB 10000 end if do while Ang > 0 gosub 9000 loop else ' Check G03 (counter clockwise) quadrants CosIs = 1 CosDir = -1 SinIs = 1 SinDir = 1 '1 OK GOSUB 8905 IF Ang >= 0 AND Ang <= pi * .5 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * .5 gosub 9000 loop CosIs = -1 CosDir = -1 SinIs = 1 SinDir = -1 ' 2 OK GOSUB 8905 IF Ang > pi * .5 AND Ang <= pi * 1 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 1 gosub 9000 loop CosIs = -1 CosDir = 1 SinIs = -1 SinDir = -1 ' 3 OK GOSUB 8905 IF Ang > pi * 1 AND Ang <= pi * 1.5 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 1.5 gosub 9000 loop CosIs = 1 CosDir = 1 SinIs = -1 SinDir = 1 '4 OK GOSUB 8905 IF Ang > pi * 1.5 AND Ang <= pi * 2 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 2 gosub 9000 loop CosIs = 1 CosDir = -1 SinIs = 1 SinDir = 1 GOSUB 8905 IF Ang > pi * 2 AND Ang <= pi * 2.5 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 2.5 gosub 9000 loop CosIs = -1 CosDir = -1 SinIs = 1 SinDir = -1 GOSUB 8905 IF Ang > pi * 2.5 AND Ang <= pi * 3 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 3 gosub 9000 loop CosIs = -1 CosDir = 1 SinIs = -1 SinDir = -1 GOSUB 8905 IF Ang > pi * 3 AND Ang <= pi * 3.5 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 3.5 gosub 9000 loop CosIs = 1 CosDir = 1 SinIs = -1 SinDir = 1 GOSUB 8905 IF Ang > pi * 3.5 AND Ang <= pi * 4 THEN bkl = 1 GOSUB 10000 end if do until Ang > pi * 4 gosub 9000 loop end if return 'to the parser '************************************************************************************ 8905 ' preset direction pins pt = 255 OR p7 + p8 IF CosDir = -1 THEN pt = pt AND NOT CosPinDir IF SinDir = -1 THEN pt = pt AND NOT SinPinDir IF LinDir = -1 THEN pt = pt AND NOT LinPinDir OUT port, pt RETURN 9000 IF panel <> 0 THEN GOSUB 20000 IF button = 4 THEN hold = 1 GOSUB 9915 'hold panel end if IF button = 1 THEN GOSUB 9984 ' ovr - IF button = 2 THEN GOSUB 9982 ' ovr + end if KEY(1) STOP KEY(2) STOP KEY(3) STOP xCos = ABS(COS(Ang)) * R1 * CosIs 'COSINE AXIS (x) CosErr = ABS(xCos - CosAct) + .45 * CosM IF CosErr < CosM THEN CosDsp = 0 else CosAct = CosAct + (CosM * CosDir) pt = pt AND NOT CosStepPin IF CosDir = -1 THEN CosDsp = -1 ELSE CosDsp = 1 end if end if xSin = ABS(SIN(Ang)) * R1 * SinIs 'Sine Axis (y) ' SINE AXIS SinErr = ABS(xSin - SinAct) + .45 * SinM IF SinErr < SinM THEN SinDsp = 0 else SinAct = SinAct + (SinM * SinDir) pt = pt AND NOT SinStepPin IF SinDir = -1 THEN SinDsp = -1 ELSE SinDsp = 1 end if end if 'LINEAR AXIS IF LinAct <= goLin THEN LinErr = count * LinPer - LinAct IF LinErr + .45 => LinM THEN LinAct = LinAct + LinM pt = pt AND NOT LinStepPin IF LinDir = -1 THEN LinDsp = -1 ELSE LinDsp = 1 end if end if end if ' Finally output the step pulse OUT port, pt GOSUB 10500 'display and position registers count = count + 1 CosDsp = 0 SinDsp = 0 LinDsp = 0 togo = togo - 1 KEY(1) ON KEY(2) ON KEY(3) ON 'ACCEL IF (go <= Ad) and (go <= half) THEN IF hold = 1 THEN goto 9400 end if FOR c = Ad - ct TO 1 STEP accf * -1 NEXT c end if IF (togo <= Dd) and (togo <= half) AND (hold <> 1 ) THEN FOR c = 0 TO Dd - togo STEP accf NEXT c end if 9400 IF hold <> 0 THEN 'SLOW TO HOLD FOR h = htg TO hl STEP 1 NEXT h htg = htg - 1 IF panel <> 0 THEN GOSUB 20000 IF button = 3 THEN hold = 0 end if IF button = 1 THEN GOSUB 7984 end if IF button = 2 THEN GOSUB 7982 end if IF rot > 1 AND rot < 6 AND htg < 0 THEN goto 150 end if end if do KEY(1) ON KEY(2) ON KEY(3) ON loop while htg < 0 AND hold = 1 end if IF INP(port2) = 236 THEN hold = 1 GOSUB 9915 end if do IF panel <> 0 THEN GOSUB 20000 IF button = 3 THEN hold = 0 GOSUB 9950 ' unhold panel end if IF button = 1 THEN GOSUB 9984 ' ovr - end if IF button = 2 THEN GOSUB 9982 ' ovr + end if end if loop while htg < 0 AND hold = 1 ' FEED FOR SLO = Fdr * FRF TO (compspeed / OVR + rpd) / FinvArc NEXT SLO ' Reset the port, bring the step signal inactive pt = 255 AND NOT p7 + p8 IF CosDir = -1 THEN pt = pt AND NOT CosDirPin ' leave direction pins on IF SinDir = -1 THEN pt = pt AND NOT SinDirPin IF LinDir = -1 THEN pt = pt AND NOT LinDirPin OUT port, pt go = go + 1 LinReps = LinReps + .5 IF g(2) = 3 THEN Ang = Ang + Delta 'increment Angle & check for end IF Ang > endangle THEN Ang = pi * 6 oldSinDir = SinDir oldCosDir = CosDir oldLinDir = LinDir ' Set up the direction bits in case next operation is linear move IF plane = 1 THEN oldXdir = CosDir oldYdir = SinDir oldZdir = LinDir end if IF plane = 2 THEN oldXdir = CosDir oldYdir = LinDir oldZdir = SinDir end if IF plane = 3 THEN oldXdir = LinDir oldYdir = CosDir oldZdir = SinDir end if RETURN END IF END IF IF g(2) = 2 THEN Ang = Ang - Delta IF Ang < endangle THEN Ang = pi * -1 oldSinDir = SinDir oldCosDir = CosDir oldLinDir = LinDir ' Set up the direction bits in case next operation is linear move IF plane = 1 THEN oldXdir = CosDir oldYdir = SinDir oldZdir = LinDir end if IF plane = 2 THEN oldXdir = CosDir oldYdir = LinDir oldZdir = SinDir end if IF plane = 3 THEN oldXdir = LinDir oldYdir = CosDir oldZdir = SinDir end if RETURN END IF END IF RETURN 'From arc move 9880 STOP KEY(1) OFF KEY(2) OFF KEY(3) OFF KEY(6) OFF CosAbs = INT(CosAbs) SinAbs = INT(SinAbs) RETURN 9900 cycle = 0 GOTO 150 'HOLD 9905 IF hold = 1 THEN hold = 0 ELSE hold = 1 END IF IF hold <> 0 THEN 9915 IF ct < cts - Dd THEN hl = Dd / 2 ELSE hl = cts - cnt END IF htg = hl COLOR action LOCATE 8, 28: PRINT "HOLD" IF cycle = 1 THEN RETURN END IF RETURN END IF 9950 ' UNHOLD IF togo < cts - (Ad + Dd) THEN reaccel = Ad ELSE reaccel = (cts - togo) / 2 end if half = cts + reaccel go = 0 ct = 1 COLOR action LOCATE 8, 28: PRINT "RUN " RETURN ' Feedrate overide 9982 OVR = OVR + .01 GOTO 9985 9984 OVR = OVR - .01 IF OVR < 0 THEN OVR = 0 end if 9985 IF OVR > 1 THEN OVR = 1 end if Fdr = Frn * OVR COLOR action LOCATE 10, 9: PRINT USING "###"; OVR * 100; : PRINT " " RETURN 10000 ' Backlash for Arc goX = 0 goY = 0 goZ = 0 bkl = 0 ON plane GOTO 10100, 10200, 10300 10100 ' we should only perform backlash on an axis if there's ' a change in direction of that axis. ' Check to see if any axis is changing direction ' If there is, set the distance to travel = backlash ' amount from setup file and set a flag. IF CosDir <> oldCosDir THEN goX = Xb * CosDir bkl = 1 'G17 backlash end if IF SinDir <> oldSinDir THEN goY = Yb * SinDir bkl = 1 end if IF LinDir <> oldLinDir THEN goZ = Zb * LinDir bkl = 1 end if IF bkl = 1 THEN GOSUB 7100 'Go perform backlash compensation end if Frn = ABS(g(9)) Fdr = Frn * OVR go = 0 COLOR action LOCATE 8, 9: PRINT USING "###"; g(9); : PRINT " " bkl = 0 RETURN ' to quadrant direction selection section 10200 IF CosDir <> oldCosDir THEN goX = Xb * CosDir bkl = 1 'G18 backlash end if IF SinDir <> oldSinDir THEN goZ = Zb * SinDir bkl = 1 end if IF LinDir <> oldLinDir THEN goY = Yb * LinDir bkl = 1 end if IF bkl = 1 THEN GOSUB 7100 Frn = ABS(g(9)) Fdr = Fdn * OVR go = 0 COLOR action LOCATE 8, 9: PRINT USING "###"; g(9); : PRINT " " bkl = 0 RETURN ' to quadrant direction selection section 10300 IF CosDir <> oldCosDir THEN goY = Yb * CosDir bkl = 1 'G19 backlash end if IF SinDir <> oldSinDir THEN goZ = Zb * SinDir bkl = 1 end if IF LinDir <> oldLinDir THEN goX = Xb * LinDir bkl = 1 end if IF bkl = 1 THEN GOSUB 7100 Frn = ABS(g(9)) Fdr = Fdn * OVR go = 0 COLOR action LOCATE 8, 9: PRINT USING "###"; g(9); : PRINT " " bkl = 0 RETURN ' to quadrant direction selection section 10500 ' Display & position ON plane GOTO 10600, 10700, 10800 10600 bX = bX + CosDsp * mX bY = bY + SinDsp * mY bZ = bZ + LinDsp * mZ cX = cX + CosDsp * mX1 cY = cY + SinDsp * mY1 cZ = cZ + LinDsp * mZ1 GOTO 10900 10700 bX = bX + CosDsp * mX bZ = bZ + SinDsp * mZ bY = bY + LinDsp * mY cX = cX + CosDsp * mX1 cZ = cZ + SinDsp * mZ1 cY = cY + LinDsp * mY1 GOTO 10900 10800 bY = bY + CosDsp * mY bZ = bZ + SinDsp * mZ bX = bX + LinDsp * mX cY = cY + CosDsp * mY1 cZ = cZ + SinDsp * mZ1 cX = cX + LinDsp * mX1 GOTO 10900 10900 ' display COLOR axis LOCATE 2, 16: PRINT USING "######.####"; (INT(bX)) / 10000 LOCATE 4, 16: PRINT USING "######.####"; (INT(bY)) / 10000 LOCATE 6, 16: PRINT USING "######.####"; (INT(bZ)) / 10000 RETURN 20000 ' Read Panel ' read rotary rot = 0 IF NOT INP(port1) AND 64 THEN rot = 1 ' pin 10 IF INP(port1) AND 128 THEN rot = rot + 2 ' pin 11 IF NOT INP(port1) AND 32 THEN rot = rot + 4 ' pin 12 20100 ' read buttons button = 0 IF INP(port2) AND 1 THEN button = 1 'ovr -, pin 1 IF INP(port2) AND 2 THEN button = 2 'ovr +, pin 14 IF NOT INP(port2) AND 4 THEN button = 3 'start, pin 16 IF INP(port2) AND 8 THEN button = 4 'Hold, pin 17 RETURN