NAM DVMDR * * * * ******************************************* * * * * * HP-2401C DIGITAL VOLTMETER DRIVER * * * * * * -- BY -- * * * * * * STEVEN A. STARK * * * HEWLETT-PACKARD * * * PARAMUS, N.J. * * * * * ******************************************* * * * * I. IDENTIFICATION - SAS 0002 REV. 3 12/1/69 * ----------------- * * II. LANGUAGE - ASSEMBLY LANGUAGE, RELOCATABLE * ------------ * * III. TYPE - FORTRAN CALLABLE SUBROUTINE * --------- * * IV. LENGTH - 156 (DECIMAL) WORDS * ---------- * * V. SPECIAL HARDWARE REQUIRED - * ---------------------------- * * A. HP-2401C DIGITAL VOLTMETER * B. HP-12533A 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 SAMPLE PERIOD. THE HOLD-OFF IS THEN REMOVED FROM THE DVM * ALLOWING IT TO PERFORM A MEASUREMENT. THE DRIVER WAITS IN A * PROGRAM LOOP UNTIL THE MEASUREMENT IS COMPLETED AND THEN IT * INPUTS THE BCD DATA FROM THE DVM. THE DRIVER PROCESSES THIS * DATA, CONVERTING THE VOLTMETER READING INTO A FLOATING POINT * NUMBER WHICH IS THEN RETURNED TO THE CALLING PROGRAM. IN THE * EVENT THAT A MEASUREMENT IS NOT COMPLETED WITHIN TEN SECONDS * OR AN OVERLOAD OCCURS, THE DRIVER RETURNS IMMEDIATELY TO THE * CALLING PROGRAM WITH THE APPROPRIATE ERROR INDICATION. * * VII. ENTRY POINTS -IDVM * ----------------- * * VIII. EXTERNAL SUBROUTINES - FADSB, FMP, MPY, FLOAT * -------------------------- .PACK, .ENTR, DLDST, .FLUN HED HP-2401C DIGITAL VOLTMETER DRIVER * * * 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 SAMPLE PERIOD * OF THE DVM, AS SHOWN BELOW- * * ONES DIGIT - RANGE * ------------------ * * 0 AUTORANGE * 1 +10 GAIN, 2411A * 2 0.1 V * 3 1V/1K * 4 10V/10K * 5 100V/100K * 6 1000V/1M * 7 10M * * * TENS DIGIT - FUNCTION * --------------------- * * 0 AC NORMAL * 1 AC FAST * 2 FREQUENCY * 3 PERIOD * 4 DC * 5 OHMS * * HUNDREDS DIGIT - SAMPLE PERIOD * ------------------------------ * * 0 1.0 SEC. * 1 0.1 SEC. * 2 .01 SEC. * * 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 * DSI EQU 12B ASSIGN I/O CHANNEL NUMBERS DVM EQU 14B * * 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 & SAMPLE PERIOD * 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 ENCODE PROGRAM CONTROL COMMAND * 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 STORE THEM FOR LATER USE * CPA D9 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 D2 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 D2 DEC 2 D9 DEC 9 D100 DEC 100 D10K DEC 10000 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$