'LISTING 1 - BASIC PROGRAM 'LPT1 OUT @ &H378, IN @ &H379 'LPT2 OUT @ &H278, IN @ &H279 '25 WAY D TYPE 'SIGNALS TO CIRCUIT 'PIN 4 D2 (OUT) SCLK 'PIN 5 D3 (OUT) DATA OUT (FROM PC) 'PIN 6 D4 (OUT) CS\ 'SIGNALS FROM CIRCUIT 'PIN 15 D3 (IN) DATA IN (TO PC). ALSO SIGNALS EOC 'PINS 18-25 ARE GROUND 'INTRODUCTION PRINT "WELCOME TO THE MAXIM CURRENT-VOLTAGE CURVE TRACER" PRINT INTRO: PRINT "WHERE IS THE CIRCUIT CONNECTED? ENTER 1 FOR LPT1 OR 2 FOR LPT2" INPUT P% IF P% = 1 THEN PORT& = &H378 'SET LPT1 IF P% = 2 THEN PORT& = &H278 'SET LPT2 IF P% = 1 OR P% = 2 THEN GOTO INTRO1 'TRAP ERROR PRINT "WRONG!!!!!! PLEASE TRY AGAIN" GOTO INTRO INTRO1: ON KEY(1) GOSUB FINISH 'F1 EXITS KEY(1) ON MAIN: 'MAIN BIT OF PROGRAM 'DEFINE SOME VARIABLES DIM Y(512) 'ARRAY TO HOLD PLOT DATA DIM DIN(12) AS INTEGER, DOUT(12) AS INTEGER 'DATA IN AND DATA OUT 'SET UP DISPLAY FOR OUTPUT CLS 0 SCREEN 12 'VGA SCREEN WINDOW (-120, -55)-(520, 435) 'DEFINE WINDOW CO-ORDINATES LINE (0, -5)-(0, 410), 1 'DRAW A FEW LINES LINE (-5, 0)-(512, 0), 1 LINE (512, -5)-(512, 410), 1 LINE (-5, 410)-(512, 410), 1 LINE (-5, 205)-(512, 205), 1 'CENTRAL AXES LINE (256, -5)-(256, 410), 1 LINE (-5, 51)-(0, 51), 1 'MARKERS LINE (-5, 102)-(0, 102), 1 LINE (-5, 153)-(0, 153), 1 LINE (-5, 256)-(0, 256), 1 LINE (-5, 308)-(0, 308), 1 LINE (-5, 359)-(0, 359), 1 LINE (64, -5)-(64, 0), 1 LINE (128, -5)-(128, 0), 1 LINE (192, -5)-(192, 0), 1 LINE (320, -5)-(320, 0), 1 LINE (384, -5)-(384, 0), 1 LINE (448, -5)-(448, 0), 1 COLOR 9 'LABELS LOCATE 1, 1, 0: PRINT "MAXIM CURRENT-VOLTAGE CURVE TRACER" LOCATE 20, 1, 0: PRINT "F1 TERMINATES" LOCATE 2, 12, 0: PRINT "+4V" LOCATE 15, 13, 0: PRINT "0V" LOCATE 27, 12, 0: PRINT "-4V" LOCATE 28, 15, 0: PRINT "-Imax" LOCATE 28, 46, 0: PRINT "0mA" LOCATE 28, 75, 0: PRINT "+Imax" LOCATE 10, 1, 0 PRINT " Rs Imax" PRINT "100R 40mA" PRINT " 1K 4mA" PRINT " 10K 400uA" PRINT "100K 40uA" START: 'START OF PLOT ROUTINE IDATA& = &H10 'INITIALISE PORT, SCLK=0, CS\=1 OUT PORT&, IDATA& Z& = 8 'INITIALISE MAX531 GOSUB IO FOR X& = 1 TO 511 STEP 1 'X& IS X AXIS FOR PLOT Z& = 8 * (X& + 1) 'NEXT VALUE FOR MAX531 GOSUB IO PSET (X&, Y(X&)), 0 'RESET BACKGROUND IF Y(X&) = 0 THEN PSET (X&, Y(X&)), 1 'CATCH BOTTOM LINE AT START IF Y(X&) = 205 THEN PSET (X&, Y(X&)), 1 'CATCH HORIZ CENTRE LINE IF X& = 256 THEN PSET (X&, Y(X&)), 1 'CATCH VERT CENTRE LINE Y(X&) = INT(ODATA& / 10) IF Y(X&) > 408 THEN Y(X&) = 409 'CHECK FOR OVER-RANGES IF Y(X&) < 1 THEN Y(X&) = 1 PSET (X&, Y(X&)), 4 'SET NEW VALUE NEXT X& GOTO START 'AROUND AGAIN IO: 'DATA I/O ROUTINE ODATA& = &H0 IDATA& = IDATA& AND &HEF 'CS\ SET TO 0 OUT PORT&, IDATA& WAIT (PORT& + &H1), &H8 'WAIT FOR EOC FROM CIRCUIT 'SCLK CYCLE TO SHIFT 189 DATA TO DOUT IDATA& = IDATA& OR &H4 'SCLK TO 1 OUT PORT&, IDATA& IDATA& = IDATA& AND &HF3 'SCLK TO 0 OUT PORT&, IDATA& FOR SHIFT = 11 TO 0 STEP -1 DOUT(SHIFT) = (INP(PORT& + &H1) AND &H8) 'GET DATA FROM MAX189 ODATA& = ODATA& + DOUT(SHIFT) * 2 ^ (SHIFT - 3)'COMPILE DATA IDATA& = IDATA& OR ((Z& AND (2 ^ SHIFT)) / (2 ^ SHIFT) * 8) 'DATA TO GO TO MAX531 OUT PORT&, IDATA& IDATA& = IDATA& OR &H4 'SCLK TO 1 OUT PORT&, IDATA& IDATA& = IDATA& AND &HF3 'DATA BIT BACK TO 0, SCLK TO OUT PORT&, IDATA& NEXT SHIFT IDATA& = IDATA& OR &H10 'CS\ SET TO 1 OUT PORT&, IDATA& RETURN FINISH: END