' {$STAMP BS2} ' {$PBASIC 2.5} 'This is the code used TO control the QPD position setup board done in December 2011. Rich AND Sam Abbott 'This version is the one that Alex got working by multiplying by 2 'This version has displayed a shaded rectangle based on a voltage set by 2 calibrators. 'This version moves the dot as you move the laser. 'This version shows the dot, displays, displays "no light" correctly, AND displays power correctly. 'This version does same as last entry, but now has a switch that selects the adc channels between qpd1 and qpd2 'Final Copy '**********Constants adcout CON 0 ' Data from ADC adcin CON 1 ' Data into ADC sclk CON 2 ' Clock pin for ADC cs CON 3 ' ADC chip select pin gain CON 4 ' Gain select bit HI=HI Gain qpdselect CON 5 ' pin 10 on adc gainselect CON 7 ' Pin 12 on adc FpuClk CON 8 ' SPI clock (connects to SCLK/SCL) FpuOut CON 9 ' SPI data out (connects to SIN/SDA) FpuIn CON 9 ' SPI data in (connects to SOUT) loaddac CON 10 ' DAC data loading line sdi CON 11 ' DAC serial data line dclk CON 12 ' DAC clock line cs_dac CON 13 ' DAC chip select line lcdin CON 14 ' Read pin from LCD labeled Rx on LCD lcdout CON 15 ' Write pin to LCD labeled Tx on LCD baud CON $4020 ' 19200 baud, N, 8, 1 init CON 142 ' Binary 10001110 '**********Registers sum CON 10 ' uM-FPU register hor CON 11 ' uM-FPU register vert CON 12 ' uM-FPU register watts CON 5 ' uM-FPU register xbnc CON 6 ybnc CON 7 '************Variables i VAR Byte 'Counter variable ii VAR Byte 'mask temporary variable mask VAR Byte 'Variable to configure ADC anode VAR Word(8) 'Conversion result from ADC nolight VAR Bit xvalue VAR Word ' data word yvalue VAR Word dataByte VAR xvalue.LOWBYTE ' (alternate name) opcode VAR xvalue.HIGHBYTE ' opcode (same as dataHigh) format VAR xvalue.LOWBYTE ' format (same as dataLow) status VAR xvalue.LOWBYTE ' status (same as dataLow) totalpower VAR Word '============================================================================== '-------------------- initialization ------------------------------------------ '============================================================================== Reset: DEBUG CR, "Conversion Example" DEBUG CR, "------------------" '------------------------------------ ' Reset the uM-FPU and print version. '------------------------------------ GOSUB Fpu_Reset ' reset the FPU hardware IF status <> SyncChar THEN DEBUG "uM-FPU not detected." END ELSE 'GOSUB Print_Version ' display the uM-FPU version number DEBUG CR ENDIF '*********** Program DO LOW cs nolight = 0 start: GOSUB lcdinit 'Puts the LCD graph in place. IF IN7 = 1 THEN GOSUB highgaindisplay IF IN7 = 0 THEN GOSUB lowgaindisplay GOSUB display main: IF IN7 = 1 THEN GOSUB gainset ELSE GOSUB gainsetlow ' Sets gain based on switch position. IF IN5 = 1 THEN GOSUB qpd2 ELSE GOSUB qpd1 ' Selects QPD based on switch position. LOOP qpd1: FOR i = 0 TO 3 GOSUB conv NEXT GOSUB math PAUSE 100 RETURN qpd2: FOR i = 4 TO 7 GOSUB conv NEXT GOSUB math2 PAUSE 100 RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' gainset: HIGH gain RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' gainsetlow: LOW gain RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' math: ' sum=anode1+anode2+anode3+anode4 SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, sum, LOADWORD, anode.HIGHBYTE(0*2), anode.LOWBYTE(0*2), FSET0, LOADWORD, anode.HIGHBYTE(1*2), anode.LOWBYTE(1*2), FADD0, LOADWORD, anode.HIGHBYTE(2*2), anode.LOWBYTE(2*2), FADD0, LOADWORD, anode.HIGHBYTE(3*2), anode.LOWBYTE(3*2), FADD0] 'DEBUG CR, "Sum(mV) " GOSUB Print_Float ' hor=((((anode1+anode4)-(anode2+anode3))/(sum))*19)+61 SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, hor, LOADWORD, anode.HIGHBYTE(0*2), anode.LOWBYTE(0*2), FSET0, LOADWORD, anode.HIGHBYTE(3*2), anode.LOWBYTE(3*2), FADD0, LEFT, LOADWORD, anode.HIGHBYTE(1*2), anode.LOWBYTE(1*2), FSET0, LOADWORD, anode.HIGHBYTE(2*2), anode.LOWBYTE(2*2), FADD0, RIGHT, FSUB0, FDIV, sum, FMULI, 19, FADDI, 61] 'DEBUG CR, "hor " GOSUB Print_IntegerX ' vert=((((anode1+anode2)-(anode3+anode4))/(sum))*16)+16 SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, vert, LOADWORD, anode.HIGHBYTE(0*2), anode.LOWBYTE(0*2), FSET0, LOADWORD, anode.HIGHBYTE(1*2), anode.LOWBYTE(1*2), FADD0, LEFT, LOADWORD, anode.HIGHBYTE(2*2), anode.LOWBYTE(2*2), FSET0, LOADWORD, anode.HIGHBYTE(3*2), anode.LOWBYTE(3*2), FADD0, RIGHT, FSUB0, FDIV, sum, FMULI, 16, FADDI, 16] 'DEBUG CR, "vert " GOSUB Print_IntegerY IF xvalue < 65535 AND yvalue < 65535 AND xvalue <> 0 AND yvalue <> 0 THEN GOSUB draw_rectangle ELSE GOSUB nolight_set SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, 0, FSET, sum, FMULI, 100, FDIVI, 81, FIX] GOSUB Fpu_Wait SHIFTOUT FpuOut, FpuClk, MSBFIRST, [LREADWORD] ' DEBUG CR, "totalpower(mW) " SHIFTIN FpuIn, FpuClk, MSBPRE, [totalpower.HIGHBYTE, totalpower.LOWBYTE] 'DEBUG DEC totalpower, CR RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' math2: ' sum=anode1+anode2+anode3+anode4 SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, sum, LOADWORD, anode.HIGHBYTE(4*2), anode.LOWBYTE(4*2), FSET0, LOADWORD, anode.HIGHBYTE(5*2), anode.LOWBYTE(5*2), FADD0, LOADWORD, anode.HIGHBYTE(6*2), anode.LOWBYTE(6*2), FADD0, LOADWORD, anode.HIGHBYTE(7*2), anode.LOWBYTE(7*2), FADD0] 'DEBUG CR, "Sum(mV) " GOSUB Print_Float ' hor=((((anode1+anode4)-(anode2+anode3))/(sum))*19)+61 SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, hor, LOADWORD, anode.HIGHBYTE(4*2), anode.LOWBYTE(4*2), FSET0, LOADWORD, anode.HIGHBYTE(7*2), anode.LOWBYTE(7*2), FADD0, LEFT, LOADWORD, anode.HIGHBYTE(5*2), anode.LOWBYTE(5*2), FSET0, LOADWORD, anode.HIGHBYTE(6*2), anode.LOWBYTE(6*2), FADD0, RIGHT, FSUB0, FDIV, sum, FMULI, 19, FADDI, 61] 'DEBUG CR, "hor " GOSUB Print_IntegerX ' vert=((((anode1+anode2)-(anode3+anode4))/(sum))*16)+16 SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, vert, LOADWORD, anode.HIGHBYTE(4*2), anode.LOWBYTE(4*2), FSET0, LOADWORD, anode.HIGHBYTE(5*2), anode.LOWBYTE(5*2), FADD0, LEFT, LOADWORD, anode.HIGHBYTE(6*2), anode.LOWBYTE(6*2), FSET0, LOADWORD, anode.HIGHBYTE(7*2), anode.LOWBYTE(7*2), FADD0, RIGHT, FSUB0, FDIV, sum, FMULI, 16, FADDI, 16] 'DEBUG CR, "vert " GOSUB Print_IntegerY IF xvalue < 65535 AND yvalue < 65535 AND xvalue <> 0 AND yvalue <> 0 THEN GOSUB draw_rectangle ELSE GOSUB nolight_set SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SELECTA, 0, FSET, sum, FMULI, 100, FDIVI, 81, FIX] GOSUB Fpu_Wait SHIFTOUT FpuOut, FpuClk, MSBFIRST, [LREADWORD] 'DEBUG CR, "totalpower(mW) " SHIFTIN FpuIn, FpuClk, MSBPRE, [totalpower.HIGHBYTE, totalpower.LOWBYTE] 'DEBUG DEC totalpower, CR RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' conv: 'Aquires data from ADC LOOKUP i,[0,%100,%1,%101,%010,%110,%011,%111],ii 'Determines which ADC channel to read ii = ii * 16 'Binary shift left 4 places mask = init | ii 'Constructs the bit pattern for proper ADC configuration LOW cs 'Selects the ADC SHIFTOUT adcin, sclk, 1, [mask\8] 'Writes to ADC for current channel selection SHIFTIN adcout, sclk, 2, [anode(i)\12] 'Reads ADC conversion result for current channel 'DEBUG CR, "volts: ", DEC anode(i), CR HIGH cs RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' display: IF totalpower <= 150 THEN GOTO nolight_set IF totalpower > 150 THEN GOTO print_power RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' draw_rectangle: SEROUT lcdout, baud, [254, 120, 1, xvalue-1, yvalue+1, xvalue+1, yvalue-1] 'Draws rectangle. RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' print_power: nolight = 0 GOSUB display_power RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' display_power: SEROUT lcdout, baud, [254, 71, 1, 1, DEC totalpower] RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' lowgaindisplay: SEROUT lcdout, baud, [254, 71, 1, 2, "E-06"] SEROUT lcdout, baud, [254, 71, 1, 3, "Watts"] RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' highgaindisplay: SEROUT lcdout, baud, [254, 71, 1, 2, "E-07"] SEROUT lcdout, baud, [254, 71, 1, 3, "Watts"] RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' nolight_set: IF nolight = 0 THEN GOTO nolight_write ELSE GOTO main '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' nolight_write: SEROUT lcdout, baud, [254, 88] SEROUT lcdout, baud, ["NO LIGHT"] nolight = 1 GOTO main '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Fpu_Reset: SHIFTOUT FpuOut, FpuClk, MSBFIRST, [$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF] PAUSE 10 ' check for synchronization SHIFTOUT FpuOut, FpuClk, MSBFIRST, [SYNC] GOTO Fpu_Status2 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Fpu_Wait: INPUT FpuIn ' (required for 2-wire interface) '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Fpu_Wait2: IF (FpuIn = 1) THEN GOTO Fpu_Wait2 ' wait until uM-FPU is ready RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Fpu_Status: GOSUB Fpu_Wait ' read status byte SHIFTOUT FpuOut, FpuClk, MSBFIRST, [READSTATUS] '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Fpu_Status2: SHIFTIN FpuIn, FpuClk, MSBPRE, [status] RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_Float: format = 0 ' set format to zero (free format) ' (fall through To Print_FloatFormat) '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_FloatFormat: opcode = FTOA ' convert floating point to formatted ASCII GOTO Print_Format '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_Long: format = 0 ' set format to 0 (free format) ' (fall through to Print_LongFormat) '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_LongFormat: opcode = LTOA ' convert long integer to formatted ASCII GOTO Print_Format '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_IntegerX: SHIFTOUT FpuOut, FpuClk, MSBFIRST, [FIXR] SHIFTOUT FpuOut, FpuClk, MSBFIRST, [LREADWORD] SHIFTIN FpuIn, FpuClk, MSBPRE, [xvalue.HIGHBYTE, xvalue.LOWBYTE] 'DEBUG DEC xvalue RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_IntegerY: SHIFTOUT FpuOut, FpuClk, MSBFIRST, [FIXR] SHIFTOUT FpuOut, FpuClk, MSBFIRST, [LREADWORD] SHIFTIN FpuIn, FpuClk, MSBPRE, [yvalue.HIGHBYTE, yvalue.LOWBYTE] 'DEBUG DEC yvalue, CR RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_Format: ' send conversion command SHIFTOUT FpuOut, FpuClk, MSBFIRST, [opcode, format] '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print_String: GOSUB Fpu_Wait ' wait until uM-FPU is ready SHIFTOUT FpuOut, FpuClk, MSBFIRST, [READSTR] DO ' display zero terminated string SHIFTIN FpuIn, FpuClk, MSBPRE, [dataByte] IF (dataByte = 0 OR dataByte >= 127) THEN EXIT 'DEBUG dataByte LOOP RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' lcdinit: SEROUT lcdout, baud, [254, 88] SEROUT lcdout, baud, [254, 66, 88] 'screen on SEROUT lcdout, baud, [254, 108, 61, 0, 61, 32] 'y line SEROUT lcdout, baud, [254, 108, 41, 16, 80, 16] 'x line RETURN '*** '-------------------- uM-FPU V3 opcodes --------------------------------------- NOP CON $00 ' No operation SELECTA CON $01 ' Select register A SELECTX CON $02 ' Select register X CLR CON $03 ' reg[nn] = 0 CLRA CON $04 ' reg[A] = 0 CLRX CON $05 ' reg[X] = 0, X = X + 1 CLR0 CON $06 ' reg[0] = 0 COPY CON $07 ' reg[nn] = reg[mm] COPYA CON $08 ' reg[nn] = reg[A] COPYX CON $09 ' reg[nn] = reg[X], X = X + 1 LOAD CON $0A ' reg[0] = reg[nn] LOADA CON $0B ' reg[0] = reg[A] LOADX CON $0C ' reg[0] = reg[X], X = X + 1 ALOADX CON $0D ' reg[A] = reg[X], X = X + 1 XSAVE CON $0E ' reg[X] = reg[nn], X = X + 1 XSAVEA CON $0F ' reg[X] = reg[A], X = X + 1 COPY0 CON $10 ' reg[nn] = reg[0] COPYI CON $11 ' reg[nn] = long(unsigned bb) SWAP CON $12 ' Swap reg[nn] and reg[mm] SWAPA CON $13 ' Swap reg[A] and reg[nn] LEFT CON $14 ' Left parenthesis RIGHT CON $15 ' Right parenthesis FWRITE CON $16 ' Write 32-bit float to reg[nn] FWRITEA CON $17 ' Write 32-bit float to reg[A] FWRITEX CON $18 ' Write 32-bit float to reg[X], X = X + 1 FWRITE0 CON $19 ' Write 32-bit float to reg[0] FREAD CON $1A ' Read 32-bit float from reg[nn] FREADA CON $1B ' Read 32-bit float from reg[A] FREADX CON $1C ' Read 32-bit float from reg[X], X = X + 1 FREAD0 CON $1D ' Read 32-bit float from reg[0] ATOF CON $1E ' Convert ASCII to float, store in reg[0] FTOA CON $1F ' Convert float to ASCII FSET CON $20 ' reg[A] = reg[nn] FADD CON $21 ' reg[A] = reg[A] + reg[nn] FSUB CON $22 ' reg[A] = reg[A] - reg[nn] FSUBR CON $23 ' reg[A] = reg[nn] - reg[A] FMUL CON $24 ' reg[A] = reg[A] * reg[nn] FDIV CON $25 ' reg[A] = reg[A] / reg[nn] FDIVR CON $26 ' reg[A] = reg[nn] / reg[A] FPOW CON $27 ' reg[A] = reg[A] ** reg[nn] FCMP CON $28 ' Float compare reg[A] - reg[nn] FSET0 CON $29 ' reg[A] = reg[0] FADD0 CON $2A ' reg[A] = reg[A] + reg[0] FSUB0 CON $2B ' reg[A] = reg[A] - reg[0] FSUBR0 CON $2C ' reg[A] = reg[0] - reg[A] FMUL0 CON $2D ' reg[A] = reg[A] * reg[0] FDIV0 CON $2E ' reg[A] = reg[A] / reg[0] FDIVR0 CON $2F ' reg[A] = reg[0] / reg[A] FPOW0 CON $30 ' reg[A] = reg[A] ** reg[0] FCMP0 CON $31 ' Float compare reg[A] - reg[0] FSETI CON $32 ' reg[A] = float(bb) FADDI CON $33 ' reg[A] = reg[A] + float(bb) FSUBI CON $34 ' reg[A] = reg[A] - float(bb) FSUBRI CON $35 ' reg[A] = float(bb) - reg[A] FMULI CON $36 ' reg[A] = reg[A] * float(bb) FDIVI CON $37 ' reg[A] = reg[A] / float(bb) FDIVRI CON $38 ' reg[A] = float(bb) / reg[A] FPOWI CON $39 ' reg[A] = reg[A] ** bb FCMPI CON $3A ' Float compare reg[A] - float(bb) FSTATUS CON $3B ' Float status of reg[nn] FSTATUSA CON $3C ' Float status of reg[A] FCMP2 CON $3D ' Float compare reg[nn] - reg[mm] FNEG CON $3E ' reg[A] = -reg[A] FABS CON $3F ' reg[A] = | reg[A] | FINV CON $40 ' reg[A] = 1 / reg[A] SQRT CON $41 ' reg[A] = sqrt(reg[A]) ROOT CON $42 ' reg[A] = root(reg[A], reg[nn]) LOG CON $43 ' reg[A] = log(reg[A]) LOG10 CON $44 ' reg[A] = log10(reg[A]) EXP CON $45 ' reg[A] = exp(reg[A]) EXP10 CON $46 ' reg[A] = exp10(reg[A]) FSIN CON $47 ' reg[A] = sin(reg[A]) FCOS CON $48 ' reg[A] = cos(reg[A]) FTAN CON $49 ' reg[A] = tan(reg[A]) ASIN CON $4A ' reg[A] = asin(reg[A]) ACOS CON $4B ' reg[A] = acos(reg[A]) ATAN CON $4C ' reg[A] = atan(reg[A]) ATAN2 CON $4D ' reg[A] = atan2(reg[A], reg[nn]) DEGREES CON $4E ' reg[A] = degrees(reg[A]) RADIANS CON $4F ' reg[A] = radians(reg[A]) FMOD CON $50 ' reg[A] = reg[A] MOD reg[nn] FLOOR CON $51 ' reg[A] = floor(reg[A]) CEIL CON $52 ' reg[A] = ceil(reg[A]) ROUND CON $53 ' reg[A] = round(reg[A]) FMIN CON $54 ' reg[A] = min(reg[A], reg[nn]) FMAX CON $55 ' reg[A] = max(reg[A], reg[nn]) FCNV CON $56 ' reg[A] = conversion(nn, reg[A]) FMAC CON $57 ' reg[A] = reg[A] + (reg[nn] * reg[mm]) FMSC CON $58 ' reg[A] = reg[A] - (reg[nn] * reg[mm]) LOADBYTE CON $59 ' reg[0] = float(signed bb) LOADUBYTE CON $5A ' reg[0] = float(unsigned byte) LOADWORD CON $5B ' reg[0] = float(signed word) LOADUWORD CON $5C ' reg[0] = float(unsigned word) LOADE CON $5D ' reg[0] = 2.7182818 LOADPI CON $5E ' reg[0] = 3.1415927 LOADCON CON $5F ' reg[0] = float constant(nn) FLOAT CON $60 ' reg[A] = float(reg[A]) FIX CON $61 ' reg[A] = fix(reg[A]) FIXR CON $62 ' reg[A] = fix(round(reg[A])) FRAC CON $63 ' reg[A] = fraction(reg[A]) FSPLIT CON $64 ' reg[A] = int(reg[A]), reg[0] = frac(reg[A]) SELECTMA CON $65 ' Select matrix A SELECTMB CON $66 ' Select matrix B SELECTMC CON $67 ' Select matrix C LOADMA CON $68 ' reg[0] = matrix A[bb, bb] LOADMB CON $69 ' reg[0] = matrix B[bb, bb] LOADMC CON $6A ' reg[0] = matrix C[bb, bb] SAVEMA CON $6B ' matrix A[bb, bb] = reg[A] SAVEMB CON $6C ' matrix B[bb, bb] = reg[A] SAVEMC CON $6D ' matrix C[bb, bb] = reg[A] MOP CON $6E ' matrix operation FFT CON $6F ' FFT operation LOADIND CON $7A ' reg[0] = reg[reg[nn]] SAVEIND CON $7B ' reg[reg[nn]] = reg[A] INDA CON $7C ' Select A using reg[nn] INDX CON $7D ' Select X using reg[nn] FCALL CON $7E ' Call user-defined function in Flash memory EECALL CON $7F ' Call user-defined function in EEPROM memory RET CON $80 ' Return from user-defined function BRA CON $81 ' Unconditional branch BRACC CON $82 ' Conditional branch JMP CON $83 ' Unconditional jump JMPCC CON $84 ' Conditional jump TABLE CON $85 ' Table lookup FTABLE CON $86 ' Floating point reverse table lookup LTABLE CON $87 ' Long integer reverse table lookup POLY CON $88 ' reg[A] = nth order polynomial FGOTO CON $89 ' Computed goto LWRITE CON $90 ' Write 32-bit long integer to reg[nn] LWRITEA CON $91 ' Write 32-bit long integer to reg[A] LWRITEX CON $92 ' Write 32-bit long integer to reg[X], X = X + 1 LWRITE0 CON $93 ' Write 32-bit long integer to reg[0] LREAD CON $94 ' Read 32-bit long integer from reg[nn] LREADA CON $95 ' Read 32-bit long integer from reg[A] LREADX CON $96 ' Read 32-bit long integer from reg[X], X = X + 1 LREAD0 CON $97 ' Read 32-bit long integer from reg[0] LREADBYTE CON $98 ' Read lower 8 bits of reg[A] LREADWORD CON $99 ' Read lower 16 bits reg[A] ATOL CON $9A ' Convert ASCII to long integer LTOA CON $9B ' Convert long integer to ASCII LSET CON $9C ' reg[A] = reg[nn] LADD CON $9D ' reg[A] = reg[A] + reg[nn] LSUB CON $9E ' reg[A] = reg[A] - reg[nn] LMUL CON $9F ' reg[A] = reg[A] * reg[nn] LDIV CON $A0 ' reg[A] = reg[A] / reg[nn] LCMP CON $A1 ' Signed long compare reg[A] - reg[nn] LUDIV CON $A2 ' reg[A] = reg[A] / reg[nn] LUCMP CON $A3 ' Unsigned long compare reg[A] - reg[nn] LTST CON $A4 ' Long integer status of reg[A] AND reg[nn] LSET0 CON $A5 ' reg[A] = reg[0] LADD0 CON $A6 ' reg[A] = reg[A] + reg[0] LSUB0 CON $A7 ' reg[A] = reg[A] - reg[0] LMUL0 CON $A8 ' reg[A] = reg[A] * reg[0] LDIV0 CON $A9 ' reg[A] = reg[A] / reg[0] LCMP0 CON $AA ' Signed long compare reg[A] - reg[0] LUDIV0 CON $AB ' reg[A] = reg[A] / reg[0] LUCMP0 CON $AC ' Unsigned long compare reg[A] - reg[0] LTST0 CON $AD ' Long integer status of reg[A] AND reg[0] LSETI CON $AE ' reg[A] = long(bb) LADDI CON $AF ' reg[A] = reg[A] + long(bb) LSUBI CON $B0 ' reg[A] = reg[A] - long(bb) LMULI CON $B1 ' reg[A] = reg[A] * long(bb) LDIVI CON $B2 ' reg[A] = reg[A] / long(bb) LCMPI CON $B3 ' Signed long compare reg[A] - long(bb) LUDIVI CON $B4 ' reg[A] = reg[A] / unsigned long(bb) LUCMPI CON $B5 ' Unsigned long compare reg[A] - ulong(bb) LTSTI CON $B6 ' Long integer status of reg[A] AND ulong(bb) LSTATUS CON $B7 ' Long integer status of reg[nn] LSTATUSA CON $B8 ' Long integer status of reg[A] LCMP2 CON $B9 ' Signed long compare reg[nn] - reg[mm] LUCMP2 CON $BA ' Unsigned long compare reg[nn] - reg[mm] LNEG CON $BB ' reg[A] = -reg[A] LABS CON $BC ' reg[A] = | reg[A] | LINC CON $BD ' reg[nn] = reg[nn] + 1 LDEC CON $BE ' reg[nn] = reg[nn] - 1 LNOT CON $BF ' reg[A] = NOT reg[A] LAND CON $C0 ' reg[A] = reg[A] AND reg[nn] LOR CON $C1 ' reg[A] = reg[A] OR reg[nn] LXOR CON $C2 ' reg[A] = reg[A] XOR reg[nn] LSHIFT CON $C3 ' reg[A] = reg[A] shift reg[nn] LMIN CON $C4 ' reg[A] = min(reg[A], reg[nn]) LMAX CON $C5 ' reg[A] = max(reg[A], reg[nn]) LONGBYTE CON $C6 ' reg[0] = long(signed byte bb) LONGUBYTE CON $C7 ' reg[0] = long(unsigned byte bb) LONGWORD CON $C8 ' reg[0] = long(signed word wwww) LONGUWORD CON $C9 ' reg[0] = long(unsigned word wwww) LONGCON CON $CA ' reg[0] = long constant(nn) SETOUT CON $D0 ' Set OUT1 and OUT2 output pins ADCMODE CON $D1 ' Set A/D trigger mode ADCTRIG CON $D2 ' A/D manual trigger ADCSCALE CON $D3 ' ADCscale[ch] = B ADCLONG CON $D4 ' reg[0] = ADCvalue[ch] ADCLOAD CON $D5 ' reg[0] = float(ADCvalue[ch]) * ADCscale[ch] ADCWAIT CON $D6 ' wait for next A/D sample TIMESET CON $D7 ' time = reg[0] TIMELONG CON $D8 ' reg[0] = time (long) TICKLONG CON $D9 ' reg[0] = ticks (long) EESAVE CON $DA ' EEPROM[nn] = reg[mm] EESAVEA CON $DB ' EEPROM[nn] = reg[A] EELOAD CON $DC ' reg[mm] = EEPROM[nn] EELOADA CON $DD ' reg[A] = EEPROM[nn] EEWRITE CON $DE ' Store bytes in EEPROM EXTSET CON $E0 ' external input count = reg[0] EXTLONG CON $E1 ' reg[0] = external input counter (long) EXTWAIT CON $E2 ' wait for next external input STRSET CON $E3 ' Copy string to string buffer STRSEL CON $E4 ' Set selection point STRINS CON $E5 ' Insert string at selection point STRCMP CON $E6 ' Compare string with string buffer STRFIND CON $E7 ' Find string and set selection point STRFCHR CON $E8 ' Set field separators STRFIELD CON $E9 ' Find field and set selection point STRTOF CON $EA ' Convert string selection to float STRTOL CON $EB ' Convert string selection to long READSEL CON $EC ' Read string selection SYNC CON $F0 ' Get synchronization byte READSTATUS CON $F1 ' Read status byte READSTR CON $F2 ' Read string from string buffer VERSION CON $F3 ' Copy version string to string buffer IEEEMODE CON $F4 ' Set IEEE mode (default) PICMODE CON $F5 ' Set PIC mode CHECKSUM CON $F6 ' Calculate checksum for uM-FPU code BREAK CON $F7 ' Debug breakpoint TRACEOFF CON $F8 ' Turn debug trace off TRACEON CON $F9 ' Turn debug trace on TRACESTR CON $FA ' Send string to debug trace buffer TRACEREG CON $FB ' Send register value to trace buffer READVAR CON $FC ' Read internal variable, store in reg[0] SyncChar CON $5C ' sync character