NAM DVMDR * * * * ******************************************* * * * * * HP-3460A DIGITAL VOLTMETER DRIVER * * * * * * -- BY -- * * * * * * STEVEN A. STARK * * * HEWLETT-PACKARD * * * PARAMUS, N.J. * * * * * ******************************************* * * * * I. IDENTIFICATION - SAS 0005 REV. 1 12/1/69 * ----------------- * * II. LANGUAGE - ASSEMBLY LANGUAGE, RELOCATABLE * ------------ * * III. TYPE - FORTRAN CALLABLE SUBROUTINE * --------- * * IV. LENGTH - 157 (DECIMAL) WORDS * ---------- * * V. SPECIAL HARDWARE REQUIRED - * ---------------------------- * * A. HP-3460A DIGITAL VOLTMETER * B. HP-12534A DVM PROGRAMMING INTERFACE KIT * C. HP-12604B DATA SOURCE INTERFACE KIT * * VI. DESCRIPTION - * --------------- * * WHEN CALLED, THE DRIVER FIRST OUTPUTS A PROGRAM CONTROL WORD * TO THE DVM, WHICH PROGRAMS IT FOR THE DESIRED RANGE,FUNCTION * AND GATE TIME. IT WILL THEN REMOVE THE HOLD-OFF AND SEND AN * ENCODE COMMAND TO THE DVM WHICH WILL INITIATE A MEASUREMENT. * THE DRIVER WAITS IN A PROGRAM LOOP UNTIL THE MEASUREMENT IS * COMPLETED,AT WHICH TIME IT INPUTS THE BCD DATA FROM THE DVM. * THE DRIVER THEN PROCESSES THE DATA, CONVERTING THE VOLTMETER * READING TO A FLOATING POINT NUMBER WHICH IS RETURNED TO THE * CALLING PROGRAM. IN THE EVENT THAT THE DVM IS OVERLOADED OR * A MEASUREMENT IS NOT COMPLETED WITHIN TEN SECONDS,THE DRIVER * WILL RETURN TO THE CALLING PROGRAM WITH AN APPROPRIATE ERROR * INDICATION. * * VII. ENTRY POINTS -IDVM * ----------------- * HED HP-3460A DIGITAL VOLTMETER DRIVER * * * VIII. EXTERNAL SUBROUTINES - FADSB, FMP, MPY, FLOAT, * -------------------------- .PACK, .ENTR, DLDST, .FLUN * * IX. CALLING INFORMATION - * ----------------------- * * THE DRIVER IS CALLED FROM FORTRAN AS: * * CALL IDVM (DATA, IRFM) * * OR I = IDVM (DATA, IRFM) * * OR IF (IDVM (DATA, IRFM)) 10,20,30 * * WHERE DATA - A FLOATING POINT VARIABLE SET TO * THE VALUE OF THE DVM READING UPON * RETURN TO THE CALLING PROGRAM. * * IRFM - A THREE DIGIT OCTAL VARIABLE OR * CONSTANT SPECIFYING THE DESIRED * RANGE, FUNCTION AND GATE TIME OF * THE DVM, AS SHOWN BELOW- * * ONES DIGIT - RANGE * ------------------ * * 0 AUTORANGE * 2 0.1 VAC/100 OHMS * 3 1V/1K * 4 10V/10K * 5 100V/100K * 6 1000V/1M * 7 10M * * * TENS DIGIT - FUNCTION * --------------------- * * 0 AC NORMAL * 1 AC FAST * 4 DC * 5 OHMS * * HUNDREDS DIGIT - GATE TIME * -------------------------- * * 0 NORMAL * 3 1/60 SECOND * * AND WHERE THE VALUE OF THE FUNCTION UPON EXIT IS: * * -1 NO RESPONSE * 0 NORMAL RESPONSE * +1 OVERLOAD SKP * * * X. PROGRAMMING NOTES - * -------------------- * * 1. THIS PROGRAM IS ALSO INTENDED FOR USE WITH THE * HP-12541A DATA SOURCE INTERFACE KIT. * * XI. PROGRAM LISTING - * ------------------- * ENT IDVM EXT .ENTR,FLOAT * DVM EQU 17B ASSIGN I/O CHANNEL NUMBERS DSI EQU 16B * * IDVM ENTRY POINT * DATA1 BSS 1 IRFM1 BSS 1 IDVM NOP RETURN ADDRESS JSB .ENTR GET PARAMETER ADDRESSES DEF DATA1 * LDA INST1 PUT CLC IN TRAP CELLS STA DSI LDA INST2 STA DVM * * PROGRAM DVM FOR DESIRED RANGE, FUNCTION & GATE TIME * BEGIN DVM READING & WAIT UNTIL COMPLETED * LDA IRFM1,I LOAD PROGRAM CONTROL WORD INTO A & OTA DVM OUTPUT IT TO PROGRAMMING CARD STC DSI,C REMOVE HOLD-OFF FROM DVM AND STC DVM SEND ENCODE COMMAND TO IT * CLA SET A & B REGS TO 0 CLB WAIT INB INCREMENT B-REG CPB D10K HAVE 10000 LOOPS BEEN COMPLETED? JMP *+4 YES, CHECK FOR 10 SECONDS SFS DSI HAS DVM FINNISHED READING? JMP WAIT NO, RETURN & INCREMENT B-REG JMP INDAT YES, GO ON & LOAD DATA IN * INA INCREMENT A-REG CPA D100 HAS 10 SECONDS ELAPSED? JMP FAIL YES, GO TO FAIL ROUTINE JMP WAIT-1 NO, RETURN & LOOP AGAIN * INDAT LIB DSI LOAD BCD DATA INTO A & B REGS LIA DSI SKP * * PROCESS RANGE AND FUNCTION DIGITS * STA SAVA STORE CONTENTS OF A FOR LATER USE ALF SHIFT RANGE BITS TO BITS 0-3 AND M17 AND ISOLATE THEM STA RANGE STORE THEN FOR LATER USE * LDA SAVA RELOAD A WITH ORIGINAL CONTENTS ALF,ALF SHIFT FUNCTION BITS TO BITS 0-3 AND M17 AND ISOLATE THEM STA IFUN SAVE THEM FOR LATER USE * ADA DM8 SUBTRACT 8 FROM FUNCTION CODE SSA,RSS IS FUNCTION AN OVERLOAD? JMP OVER YES, GO TO OVERLOAD ROUTINE * SKP * * PROCESS DATA DIGITS * LDA 1 LOAD A WITH 4 LS BCD DIGITS & JSB BCDTB CONVERT THEM TO FLOATING POINT DST TEMP1 STORE THEM TEMPORARILY * LDA SAVA LOAD A WITH 2 MS BCD DIGITS & AND M377 ELIMINATE RANGE & FUNCTION BITS JSB BCDTB CONVERT 2 MS DIGITS TO FLOAT. PT. FMP .D10K MULTIPLY BY DEC 10000 AND FAD TEMP1 ADD IN LS RESULT TO GET TOTAL DST TEMP1 STORE TOTAL VALUE TEMPORARILY * LDA ADDR2 GET NEG. POWER OF 10 TABLE ADA RANGE STARTING ADDRESS AND ADD ADA RANGE RANGE X 2 TO FORM POINTER STA PNTR SAVE IT FOR INDIRECT ADDRESS DLD PNTR,I GET CORRESPONDING NEG. PWR. OF 10 FMP TEMP1 MULTIPLY IT BY TOTAL VALUE TO GET DST TEMP1 TRUE DECIMAL VALUE & SAVE IT * LDA IFUN RELOAD FUNCTION BITS INTO A CPA D1 IS FUNCTION -VDC? RSS JMP END NO, SKIP THIS PART DLD TEMP1 YES, RELOAD DATA VALUE & CHANGE FMP .DM1 SIGN TO NEGATIVE JMP *+3 END DLD TEMP1 RELOAD DATA VALUE DST DATA1,I STORE DATA VALUE BACK IN PROGRAM CLA SET A-REG TO 0 (NORMAL RESPONSE) JMP IDVM,I RETURN TO MAIN PROGRAM SKP * * FAIL AND OVERLOAD ROUTINES * FAIL JSB CLEAR SET DATA STORAGE LOCATIONS TO 0 CMA SET A-REG TO -1 (NO RESPONSE) JMP IDVM,I RETURN TO CALLING PROGRAM * OVER JSB CLEAR SET DATA STORAGE LOCATIONS TO 0 INA SET A-REG TO +1 (OVERLOAD) JMP IDVM,I RETURN TO CALLING PROGRAM * CLEAR NOP CLA SET A & B REGS TO 0 CLB DST DATA1,I STORE A & B IN DATA STORAGE LOCAT. JMP CLEAR,I RETURN TO MAIN PROGRAM * * BCD TO BINARY CONVERSION * BCDTB NOP RETURN ADDRESS LDB DM16 INITIALIZE BIT COUNTER TO -16 STB CNTR LDB ADDR1 GET TABLE STARTING ADDRESS STB PNTR SAVE IT FOR INDIRECT ADDRESS CLB LOOP1 SLA IS LSB = 0? ADB PNTR,I YES, ADD EQUIV. OCTAL VALUE TO B ISZ PNTR NO, INCREMENT CONVERSION POINTER RAR SHIFT NEXT BIT TO LSB ISZ CNTR INCREMENT BIT COUNTER, IS IT = 0? JMP LOOP1 NO, RETURN & CONVERT NEXT BIT LDA 1 YES, LOAD OCTAL EQUIV. INTO A JSB FLOAT AND CONVERT IT TO FLOATING POINT JMP BCDTB,I RETURN TO MAIN PROGRAM * SKP * * CONSTANTS * SAVA BSS 1 RANGE BSS 1 IFUN BSS 1 TEMP1 BSS 2 PNTR BSS 1 CNTR BSS 1 * M17 OCT 17 M377 OCT 377 D1 DEC 1 D100 DEC 100 D10K DEC 10000 DM8 DEC -8 DM16 DEC -16 .D10K DEC 10000. .DM1 DEC -1. * INST1 CLC DSI INST2 CLC DVM * SKP * * TABLES * * A. BCD-TO-BINARY CONVERSION TABLE * ADDR1 DEF *+1 DEC 1,2,4,8,10,20,40,80 DEC 100,200,400,800,1000,2000,4000,8000 * * B. RANGE CONVERSION TABLE * ADDR2 DEF *+1 DEC 1.,1.E-01,1.E-02,1.E-03 DEC 1.E-04,1.E-05,1.E-06,1.E-07 END FTN,B,L PROGRAM TEST2 C C THIS IS A SHORT PROGRAM TO TEST THE FOLLOWING DIGITAL VOLTMETER C DRIVER PROGRAMS: HP-2401C, HP-2402A, HP-3460A C C PRINT HEADINGS C WRITE (2,10) 10 FORMAT(////12X"**** DIGITAL VOLTMETER DRIVER TEST PROGRAM X ****"///) C C GET PROGRAM CONTROL WORD C 20 WRITE (2,30) 30 FORMAT(//"ENTER PROGRAM CONTROL WORD..._") READ (1,*) IPROG C C TAKE A READING WITH DVM C IF (IDVM (DATA, IPROG)) 40,80,60 C C TRANSFER HERE IF NO RESPONSE FROM DVM C 40 WRITE (2,50) 50 FORMAT(//5X"...NO RESPONSE FROM DVM...") PAUSE 1 GO TO 20 C C TRANSFER HERE IF DVM OVERLOADED C 60 WRITE (2,70) 70 FORMAT(//5X"...DVM OVERLOADED...") PAUSE 2 GO TO 20 C C TRANSFER HERE IF NORMAL READING C 80 WRITE (2,90) DATA 90 FORMAT(//5X"VOLTMETER READING = "F12.6) GO TO 20 C END END$