LISTING 2 'MAX1248 DATA LOGGER BY TERRY MILLWARD - MAXIM UK 22 SEPT 1997 'PLEASE FEEL FREE TO MODIFY AND USE AS YOU LIKE 'CLS 0 'CLEAR SCREEN 'LPT1 OUT @ &H378, IN @ &H379 'LPT2 OUT @ &H278, IN @ &H279 '25 WAY D TYPE 'SIGNALS TO DATA AQ CARD 'PIN 2 D0 (OUT) POWER + 'PIN 3 D1 (OUT) POWER + 'PIN 4 D2 (OUT) SCLK 'PIN 5 D3 (OUT) DATA OUT (FROM PC) 'PIN 6 D4 (OUT) CS\ 'PIN 7 D5 (OUT) TEST STROBE -PULSE AT START OF CHANNEL SCAN 'SIGNALS FROM DATA AQ CARD 'PIN 15 D3 (IN) DATA IN (TO PC) 'PIN 13 D4 (IN) SSTRB 'PINS 18-25 ARE GROUND DIM DIN(8) AS INTEGER, DOUT(12) AS INTEGER 'INITIALISE VALUES 'CONTROL BYTE DIN(0) = 0 'PD0 (LSB) INTERNAL CLOCK MODE DIN(1) = 1 'PD1 INTERNAL CLOCK MODE DIN(2) = 1 'SGL/DIF\ SINGLE END/DIFFERENTIAL DIN(3) = 1 'UNI/BIP\ UNIPOLAR/BIPOLAR DIN(4) = 0 'SEL0 CHANNEL SELECT DIN(5) = 0 'SEL1 CHANNEL SELECT DIN(6) = 0 'SEL2 CHANNEL SELECT DIN(7) = 1 'START START BIT REF = 2.5 'ADC REFERENCE VOLTAGE 'INTRODUCTION PRINT "WELCOME TO THE MAX1248 DATA LOGGER" PRINT INTRO: PRINT "WHERE IS THE MAX1248 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: IDATA& = &H13 'POWER ON, D0=D1=1, CS\=1 OUT PORT&, IDATA& 'SEND DATA PRINT PRINT "ENTER INTERVAL BETWEEN SETS OF SAMPLES IN WHOLE SECONDS" INPUT INTERVAL! INTERVAL& = INT(INTERVAL!) IF INTERVAL& = 0 THEN INTERVAL& = 1 '0 IS NOT ALLOWED PRINT PRINT "TIME INTERVAL IS"; INTERVAL&; IF INTERVAL& = 1 THEN PRINT "SECOND" ELSE PRINT "SECONDS" PRINT INTRO2: PRINT "HOW MANY CHANNELS DO YOU WANT TO SAMPLE? ENTER 1-->4" PRINT PRINT "IF 1 SELECTED CHANNEL 1 MUST BE USED, 2 SELECTED CHANNELS 1 AND 2 ETC" INPUT NOCHANS% IF NOCHANS% > 0 AND NOCHANS% < 5 THEN GOTO INTRO3 PRINT "WRONG!!!!!! PLEASE TRY AGAIN" GOTO INTRO2 INTRO3: PRINT IF NOCHANS% = 1 THEN PRINT "CHANNEL 1 SELECTED" IF NOCHANS% = 2 THEN PRINT "CHANNELS 1 AND 2 SELECTED" IF NOCHANS% = 3 THEN PRINT "CHANNELS 1, 2 AND 3 SELECTED" IF NOCHANS% = 4 THEN PRINT "CHANNELS 1, 2, 3 AND 4 SELECTED" PRINT INTRO4: PRINT "DO YOU WANT TO WRITE DATA TO DISK? (Y/N)" INPUT DISK$ 'FLAG FOR DATA TO DISK DISK$ = UCASE$(DISK$) 'FORCE TO UPPER CASE IF DISK$ = "Y" OR DISK$ = "N" THEN GOTO INTRO5 PRINT "WRONG!!!!!! PLEASE TRY AGAIN" GOTO INTRO4 INTRO5: IF DISK$ = "N" THEN GOTO INTRO7 PRINT PRINT "ENTER DRIVE, PATH AND FILE NAME. EG C:\TEMP\DATA.DAT" INPUT DATAFILE$ ON ERROR GOTO FILEERROR 'TRY TO ESCAPE IF FILE/PATH/DISK ERROR OPEN DATAFILE$ FOR OUTPUT AS #1 INTRO7: PRINT "PRESS Y TO START N TO ABORT " 'WAIT FOR GO" INPUT GO$ GO$ = UCASE$(GO$) 'FORCE TO UPPER CASE IF GO$ = "Y" OR GO$ = "N" THEN GOTO INTRO8 PRINT "WRONG!!!!!! PLEASE TRY AGAIN" GOTO INTRO7 INTRO8: IF GO$ = "N" THEN GOSUB MAINEND MAIN: 'MAIN BIT OF PROGRAM ON KEY(8) GOSUB MAINEND 'F8 CLOSES ANY OPEN FILE KEY(8) ON 'AND EXITS ON KEY(9) GOSUB RST 'F9 RESTARTS WITH SAME SETUP KEY(9) ON 'DEFINE SOME VARIABLES DIM Y(4, 480) 'ARRAY TO HOLD PLOT DATA DIM VDISP(4) AS SINGLE DIM VPLOT(4) AS LONG 'PLOT Y AXIS DIM CH AS INTEGER 'CHANNEL NUMBER DIM COL(4) AS INTEGER 'CHANNEL COLOURS DIM ROW(4) AS INTEGER 'ARRAY FOR VOLT DISPLAY ROW 'SET UP DISPLAY FOR OUTPUT SCREEN 12 'VGA SCREEN WINDOW (-155, -30)-(485, 450) 'DEFINE WINDOW CO-ORDINATES LINE (0, 0)-(0, 411), 1 'DRAW A FEW LINES LINE (0, 0)-(481, 0), 1 LINE (0, 411)-(481, 411), 1 LINE (481, 0)-(481, 411), 1 LINE (0, 0)-(0, -5), 1 LINE (60, 0)-(60, -5), 1 LINE (120, 0)-(120, -5), 1 LINE (180, 0)-(180, -5), 1 LINE (240, 0)-(240, -5), 1 LINE (300, 0)-(300, -5), 1 LINE (360, 0)-(360, -5), 1 LINE (420, 0)-(420, -5), 1 LINE (480, 0)-(480, -5), 1 COLOR 9 LOCATE 30, 40, 0 PRINT INTERVAL& * 60; "SECS PER DIVISION"; LINE (0, 0)-(-5, 0), 1 'Y MARKERS LINE (0, 82)-(-5, 82), 1 LINE (0, 164)-(-5, 164), 1 LINE (0, 246)-(-5, 246), 1 LINE (0, 328)-(-5, 328), 1 LINE (0, 410)-(-5, 410), 1 LOCATE 1, 1, 0 COLOR 9 PRINT "MAX1248 4 CHANNEL DATA LOGGER F8 TO TERMINATE F9 TO RESET" PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT PRINT "TIME ELAPSED" LOCATE 8, 14, O 'LABELS PRINT "+2.OV" LOCATE 18, 14, 0 PRINT "+1.0V" LOCATE 28, 17, 0 PRINT "0V" COL(1) = 14 'CHAN 1 IS YELLOW COL(2) = 4 'CHAN 2 IS RED COL(3) = 2 'CHAN 3 IS GREEN COL(4) = 3 'CHAN 4 IS CYAN ROW(1) = 12: ROW(2) = 16 'ROWS FOR VOLT DISP ROW(3) = 20: ROW(4) = 24 'SETUP TIMER STARTTIME& = TIMER 'NOTE START TIME NOWTIME& = TIMER 'WHAT IS THE TIME? ELAPSED& = 0 'SET ELAPSED TIME TO ZERO START: 'START OF PLOT ROUTINE FOR X = 1 TO 480 NEXTTIME& = NOWTIME& + INTERVAL& 'TIME FOR NEXT SAMPLE IF NEXTTIME& > 86399 THEN NEXTTIME& = NEXTTIME& - 86400 'TRAP MIDNIGHT ROLLOVER HR& = INT(ELAPSED& / 3600) 'WHOLE HOURS HR$ = LTRIM$(STR$(HR&)) IF HR& < 10 THEN HR$ = "0" + HR$ 'FIT LEADING ZERO IF <10 REMSEC& = ELAPSED& - (HR& * 3600) 'SECS AFTER WHOLE HRS SUB'D MIN& = INT(REMSEC& / 60) 'SETUP ELAPSED CLOCK MIN$ = LTRIM$(STR$(MIN&)) IF MIN& < 10 THEN MIN$ = "0" + MIN$ 'FIT LEADING ZERO IF <10 SEC& = REMSEC& - (MIN& * 60) 'SECS AFTER WHOLE MINS SUB'D SEC$ = LTRIM$(STR$(SEC&)) IF SEC& < 10 THEN SEC$ = "0" + SEC$ 'FIT LEADING ZERO IF <10 ELTIME$ = HR$ + ":" + MIN$ + ":" + SEC$ 'CREATE CLOCK LOCATE 10, 1, 0 'SET CURSOR FOR TIME COLOR 9 PRINT ELTIME$ 'TIME DISPLAY IDATA& = IDATA& OR &H20 'TEST STROBE SET TO 1 OUT PORT&, IDATA& 'SEND DATA IDATA& = IDATA& AND &HDF 'TEST STROBE SET TO 0 OUT PORT&, IDATA& 'SEND DATA IF DISK$ = "Y" THEN PRINT #1, ELTIME$; 'PRINT TIME TO DISK HERE FOR CH = 1 TO NOCHANS% GOSUB SETCH 'SET CHANNEL GOSUB VIN 'READ INPUT VPLOT(CH) = INT(VIN& / 10) 'SCALE MAX1248 OUTPUT VDISP(CH) = REF * VIN& / 4096 'SCALE MAX1248 O/P FOR VOLTS PSET (X, Y(CH, X)), 0 'RESET BACKGROUND IF Y(CH, X) = 0 THEN PSET (X, Y(CH, X)), 1 'CATCH BASE LINE Y(CH, X) = VPLOT(CH) PSET (X, Y(CH, X)), COL(CH) 'SET NEW VALUE LOCATE ROW(CH), 1, 0 'SET CURSOR FOR DIGITS COLOR COL(CH) PRINT CH; " "; PRINT USING "+#.####"; VDISP(CH); PRINT "V" IF DISK$ = "Y" THEN PRINT #1, USING " +#.####"; VDISP(CH); 'DATA TO DISK NEXT CH IF DISK$ = "Y" THEN PRINT #1, 'CR FOR DATA TO DISK HOLD: NOWTIME& = TIMER IF NOWTIME& < NEXTTIME& THEN GOTO HOLD ELAPSED& = ELAPSED& + INTERVAL& 'TIME OF NEXT SCAN NEXT X GOTO START 'END OF SCREEN MAINEND: 'ESCAPE ROUTINE IF F8 PRESSED IF DISK$ = "Y" THEN CLOSE #1 IDATA& = &H0 'POWER OFF OUT PORT&, IDATA& GOTO FINISH RETURN 'NEVER GETS HERE RST: 'RESET IF F9 PRESSED IF DISK$ = "Y" THEN CLOSE #1 IF DISK$ = "Y" THEN OPEN DATAFILE$ FOR OUTPUT AS #1 CLS 0 GOTO MAIN RETURN 'NEVER GETS HERE FILEERROR: 'ERROR WHEN ENTERING FILE NAME PRINT PRINT "ERROR ASSOSIATED WITH:" PRINT PRINT "1. NON EXISTANT DISK OR DISK NOT IN DRIVE" PRINT "2. BAD PATHNAME OR NON-EXISTANT PATH" PRINT "3. ILLEGAL FILENAME" PRINT PRINT " PROGRAM ABORTED. FIND PROBLEM AND RESTART" GOTO MAINEND SETCH: 'SETS CHANNEL IF CH = 1 THEN DIN(4) = 1: IF CH = 1 THEN DIN(5) = 0: IF CH = 1 THEN DIN(6) = 0 IF CH = 2 THEN DIN(4) = 1: IF CH = 2 THEN DIN(5) = 0: IF CH = 2 THEN DIN(6) = 1 IF CH = 3 THEN DIN(4) = 0: IF CH = 3 THEN DIN(5) = 1: IF CH = 3 THEN DIN(6) = 0 IF CH = 4 THEN DIN(4) = 0: IF CH = 4 THEN DIN(5) = 1: IF CH = 4 THEN DIN(6) = 1 RETURN VIN: 'CONVERSION 'SEND CONTROL BYTE ODATA& = &H0 IDATA& = IDATA& AND &HEF 'CS\ SET TO 0 OUT PORT&, IDATA& FOR SHIFT = 7 TO 0 STEP -1 IDATA& = IDATA& OR ((DIN(SHIFT) * 8)) 'DATA TO GO TO MAX1248 OUT PORT&, IDATA& IDATA& = IDATA& OR &H4 'SCLK TO 1 OUT PORT&, IDATA& IDATA& = IDATA& AND &HF3 'DATA BIT BACK TO 0, SCLK TO 0 OUT PORT&, IDATA& NEXT SHIFT IDATA& = IDATA& OR &H10 'CS\ SET TO 1 OUT PORT&, IDATA& WAIT (PORT& + &H1), &H10 'WAIT FOR EOC (SSTRB) FROM MAX1248 'GET DATA ODATA& = &H0 IDATA& = IDATA& AND &HEF 'CS\ SET TO 0 OUT PORT&, IDATA& 'SCLK CYCLE TO GET MSB IDATA& = IDATA& OR &H4 'SCLK TO 1 OUT PORT&, IDATA& IDATA& = IDATA& AND &HF3 'DATA BIT BACK TO 0, SCLK TO 0 OUT PORT&, IDATA& FOR SHIFT = 11 TO 0 STEP -1 DOUT(SHIFT) = (INP(PORT& + &H1) AND &H8) 'GET DATA FROM MAX1248 ODATA& = ODATA& + DOUT(SHIFT) * 2 ^ (SHIFT - 3)'COMPILE DATA IDATA& = IDATA& OR &H4 'SCLK TO 1 OUT PORT&, IDATA& IDATA& = IDATA& AND &HF3 'DATA BIT BACK TO 0, SCLK TO 0 OUT PORT&, IDATA& NEXT SHIFT IDATA& = IDATA& OR &H10 'CS\ SET TO 1 OUT PORT&, IDATA& VIN& = ODATA& RETURN FINISH: END