HED 2311 VERIFICATION TEST SUBROUTINE ADCON (REV D AUG. 71) *TEST SUBROUTINE MAY BE CALLED BY A FORTRAN PROGRAM * *CALL STATEMENT: * * CALL ADCON(IMODE,IPACE,ICNUM,ICADD,IBUFF,ISCAN,IOLOC) * *DEFINITION OF CALL PARAMETERS: * * IMODE = MODE SELECTION * =0 SEQUENTIAL MODE * STARTS AT CHANNEL 000 AND SEQUENTIALLY * SCANS THE NUMBER OF CHANNELS REQUESTED. * * =1 RANDOM MODE * SCANS THE NUMBER OF CHANNELS REQUESTED * IN THE REQUESTED SQUENCE. * * =2 SINGLE CHANNEL MONITOR ONLY MODE * SCANS ONLY REQUESTED CHANNEL * * IPACE = EXTERNAL PACER SELECTION * (AVAILABLE IN ONLY SEQUENTIAL OR MONITOR MODES) * * =0 EXTERNAL PACER NOT USED IN ENCODE LINE * * =1 EXTERNAL PACER USED IN ENCODE LINE. * (FOR 2116 - 50KHZ MAX) * (FOR 2114/2115 - 40KHZ MAX) * (FOR 2100 - 53KHZ MAX) * * ICNUM = NUMBER OF CHANNELS TO BE SCANNED. * * ICADD = TABLE OF MULTIPLEXER CHANNEL ADDRESSES * TO BE SCANNED. * * IBUFF = DATA BUFFER * * ISCAN = NUMBER OF SCANS ON EACH REQUESTED * SET OF CHANNELS. * * IOLOC = COMPUTER I/O LOCATION OF A/D CONVERTER * INTERFACE CARD. * * THROUGHPUT RATES FOR THIS TEST SUBROUTINE (WITHOUT PACER) * * COMPUTER ----------------------- 2116 2115/2114 2100 * RANDOM MODE ------------------ 30KHZ 24KHZ 35KHZ * SEQUENTIAL MODE -------------- 50KHZ 40KHZ 53KHZ * SINGLE CHANNEL MONITOR MODE -- 50KHZ 40KHZ 53KHZ * * * NAM ADCON * ENT ADCON EXT .ENTR,.IOC.,ENDIO IMODE NOP MODE- SEQ=0 RAND=1 MONTR=2 IPACE NOP EXT. PACER. 0=NO 1=YES ICNUM NOP NUMBER OF CHANS TO BE SCANNED ICADD NOP TABLE OF CH. ADDRS TO BE SCANNED IBUFF NOP DATA BUFFER ISCAN NOP NUMBER OF SCANS FOR EACH CHAN IOLOC NOP INTERFACE CARD I/O LOCATION * ADCON NOP ENTER AND EXIT ADCON SUBROUTINE JSB .ENTR PASS FORTRAN PARAMETERS DEF IMODE JSB ENDIO WAIT FOR ALL I/O TO BE COMPLETED DEF *+1 CLF 0 DISABLE INTERRUPT SYSTEM * *CONFIGURE ALL I/O INSTRUCTIONS * LDA IOLOC,I FETCH I/O SELECT CODE IOR STC1 FORM STC SC,C INSTR STA RSTC1 STA RSTC2 STA SSTC1 STA SSTC2 STA MSTC1 STA MSTC2 * LDA IOLOC,I FETCH I/O SELECT CODE IOR SFS1 FORM SFS SC INSTR STA RSFS1 STA RSFS2 STA SSFS1 STA SSFS2 STA MSFS1 STA MSFS2 STA MSFS3 STA CSFS1 * LDA IOLOC,I FETCH I/O SELECT CODE IOR LIA1 FORM LIA SC INSTR STA RLIA1 STA SLIA1 STA MLIA1 * LDA IOLOC,I FETCH I/O SELECT CODE IOR OTA1 FORM OTA SC INSTR STA ROTA1 STA ROTA2 STA SOTA1 STA SOTA2 STA MOTA1 STA MOTA2 STA MOTA3 * LDA IBUFF FETCH ADDRESS OF DATA BUFFER CMA,INA SUBTRACT ONE CMA AND STA .DATA STORE DECREMENTED ADD AS POINTER LDA ISCAN,I FETCH NUMBER OF SCANS REQUESTED CMA SUBTRACT 1 AND STA SCTR STORE AS NEGATIVE COUNTER * *TEST FOR MODE SELECTION * LDA IMODE,I FETCH REQUESTED MODE SLA RANDOM MODE? JMP RAND YES RAR SLA MONITOR ONLY MODE? JMP MONTR YES JMP SEQ SEQUENTIAL MODE * *RANDOM MODE TEST DRIVER * RAND LDA ICADD FETCH CHANNEL BUFFER ADDRESS STA .CHAN STORE AS POINTER LDA .CHAN,I FETCH 1ST CHAN # FROM BUFFER ROTA1 OTA 0B OUTPUT CHAN # TO A/D CONV LDA ICNUM,I FETCH NUMBER OF CHANS IN BUFFER CMA SUBTRACT 1 AND STA CHCTR STORE AS NEGATIVE COUNTER ISZ SCTR REQUESTED SCANS COMPLETED? JMP *+2 NO * JMP CLEAN YES * RSFS1 SFS 0B READY FOR SCANNING? JMP *-1 NO * RSTC1 STC 0B,C YES. ENCODE, START FIRST SCAN LDA A TIME DELAY JMP *+3 * RSTC2 STC 0B,C START NEXT SCAN STA .DATA,I STORE DATA IN BUFFER ISZ CHCTR ALL REQUESTED CHANS SCANNED? JMP *+2 NO * JMP RAND YES * ISZ .CHAN INCR. CHAN BUFFER POINTER LDA .CHAN,I FETCH NEXT CHANNEL NUMBER AND =B17 ROTA2 OTA 0B OUTPUT CHAN # TO A/D CONV ISZ .DATA INCR. DATA BUFFER POINTER RSFS2 SFS 0B DATA READY? JMP *-1 NO * RLIA1 LIA 0B YES. READ DATA JMP RSTC2 * *SEQUENTIAL MODE TEST DRIVER * SEQ CLA FORM RESET COMMAND SSFS1 SFS 0B READY FOR SCANNING? JMP *-1 NO. SOTA1 OTA 0B YES. RESET A/D * LDA ICNUM,I YES. FETCH NUMBER OF CHANS CMA SUBTRACT 1 AND STA CHCTR STORE AS NEGATIVE POINTER ISZ SCTR REQUESTED SCANS COMPLETED? JMP *+2 NO * JMP CLEAN YES LDA SQM FETCH SEQ COMMAND WORD LDB IPACE,I FETCH PACER WORD. 0=NO 1=YES RBR,RBR ROTATE PACER BIT RBR,RBR TO BIT 12 ADA B ADD PACER BIT TO SEQ COMMAND WD SOTA2 OTA 0B OUTPUT SEQ COMMAND WORD SSTC1 STC 0B,C ENCODE. START SCANS ON CH. 000 LDA A TIME DELAY JMP *+3 * SSTC2 STC 0B,C START NEXT SCAN STA .DATA,I STORE DATA IN BUFFER ISZ CHCTR ALL REQUESTED CHS. SCANNED JMP *+2 NO * JMP SEQ YES * ISZ .DATA INCR DATA BUFFER ADDR POINTER SSFS2 SFS 0B DATA READY? JMP *-1 NO * SLIA1 LIA 0B YES. READ DATA JMP SSTC2 * *MONITOR ONLY TEST DRIVER * MONTR LDA ICADD,I FETCH CHANNEL # FROM BUFFER MOTA3 OTA 0 SET ADC CHANNEL ADDRESS LDB IPACE,I FETCH PACER WORD. 0=NO 1=YES RBR,RBR ROTATE PACER BIT RBR,RBR TO BIT 12 ADA B ADD PACER BIT TO COMMAND WORD MSFS1 SFS 0B READY FOR SCANNING? JMP *-1 NO * MOTA1 OTA 0B YES. OUTPUT COMMAND WORD MSTC1 STC 0B,C START SCANS LDA A TIME DELAY JMP *+3 * MSTC2 STC 0B,C START NEXT SCAN STA .DATA,I STORE DATA IN BUFFER ISZ SCTR REQUESTED SCANS COMPLETED? JMP MONT1 NO. * CLA YES. FORM RESET COMMAND MSFS3 SFS 0B SCANNING COMPLETED? JMP *-1 NO. MOTA2 OTA 0B YES. RESET A/D INA SET REQUESTED # OF CHANNELS TO 1 JMP CLEAN+1 * MONT1 ISZ .DATA INCR DATA BUFFER POINTER MSFS2 SFS 0B DATA READY? JMP *-1 NO * MLIA1 LIA 0B YES. READ DATA JMP MSTC2 * *EXIT SUBROUTINE * CLEAN LDA ICNUM,I FETCH NUMBER OF CHANNELS IN BUFF CMA,INA STORE AS A STA CHCTR NEGATIVE COUNTER LDA .DATA FETCH END ADDRESS OF DATA BUFFR INA INCR. STA CDATA STORE AS START ADDR OF CH BUFFR LDA IBUFF FETCH START ADDR OF DATA BUFFER STA .DATA STORE AS POINTER * LOOP LDA .DATA,I FETCH FIRST OR NEXT DATA WORD AND =B17 MASK OUT BCD CH. NUMBER ADA =D-10 CONVERT SSA,RSS CH. # ADA =B366 TO ADA =A0: ASCII STA CDATA,I STORE ASCII CH. NUMBER ISZ CDATA INCR CH. BUFFER POINTER ISZ .DATA INCR DATA BUFFER POINTER ISZ CHCTR ALL CH. # CONVERTED? JMP LOOP NO * CSFS1 SFS 0B YES. A/D OPERATION COMPLETED JMP *-1 NO * CLC 0 YES. JMP ADCON,I EXIT SUBROUTINE. * * * *CONSTANTS AND WORKING AREA * * A EQU 0 B EQU 1 CDATA NOP ASCII CH # BUFFER POINTER CHCTR NOP REQUESTED # OF CHS. COUNTER LIA1 LIA 0 LIA OTA1 OTA 0 OTA SCTR NOP REQUESTED # OF SCANS COUNTER SQM OCT 040000 SEQ. MODE COMMAND WORD SFS1 SFS 0 SFS STC1 STC 0,C STC .CHAN NOP CHANNEL BUFFER POINTER .DATA NOP DATA BUFFER POINTER END FTN,B,L PROGRAM TEST DIMENSION IBUFF(128),ICADD(16),OUT(7),IN(7) C C 5 PAUSE C C REPEAT SAME TEST PARAMETERS? YES-48, NO-10 IF(ISSW(3)) 48,10 C C SUPPRESS INITIAL PRINTOUT? YES-20, NO-15 C 10 IF(ISSW(0)) 20,15 15 WRITE(2,100) C C BYPASS INITIALIZING OF IOLOC AND F.S. VOLTS? YES-30,NO-25 C 20 IF(ISSW(2)) 30,25 25 WRITE(2,200) READ(1,*)IOLOC WRITE(2,930) READ(1,*)VOLT C 30 WRITE(2,300) READ(1,*)IMODE WRITE(2,400) READ(1,*)ISCAN ISN1=ISCAN DO 32 IC=1,16 32 ICADD(IC)=0 C C CHECK REQUESTED MODE. SEQ. TO 45, RAND. TO 40, MONT. TO 35 C IF(IMODE-1)45,40,35 35 WRITE(2,500) READ(1,*)ICADD(1) ICNUM=ISN1 ISN1=1 WRITE(2,920) READ(1,*)IPACE GO TO 55 C 40 WRITE(2,500) READ(1,*)ICADD GO TO 47 C 45 WRITE(2,920) READ(1,*)IPACE 47 WRITE(2,600) READ(1,*)ICNUM 48 DO 50 I=1,7 50 IN(I)=I C ZERO DATA BUFFER C 55 DO 60 IO=1,128 60 IBUFF(IO)=0 C C CALL ADCON SUBROUTINE TO READ DATA C 65 CALL ADCON(IMODE,IPACE,ICNUM,ICADD,IBUFF,ISCAN,IOLOC) C C BYPASS DATA PRINTOUT? YES-95, NO-66 C IF(ISSW(1)) 95,66 66 IF(IMODE-2)67,68 67 WRITE(2,700)(IN(I),I=1,ISCAN) GO TO 69 C 68 WRITE(2,910) 69 DO 90 K=1,ICNUM IY=K DO 80 I=1,ISN1 70 IA=177700B ID=IAND(IBUFF(IY),IA) OUT(I)=FLOAT(ID)*VOLT/32768. IF(IMODE-2)75,80 75 IY=IY+ICNUM 80 IX=IY IF(IMODE-2)90,85 85 IX=ICNUM+1 90 WRITE(2,800)(IBUFF(IX),(OUT(I),I=1,ISN1)) 95 WRITE(2,900) GO TO 5 C C 100 FORMAT(23X"2311A VERIFICATION TEST"// 1/"PARAMETERS TO BE ENTERED:"//3X"1) I/O LOCATION OF A/D 1 INTERFACE CARD"/8X"IOLOC=@XX (2 DIGIT OCTAL #)"//3X"2) 1 FULL SCALE INPUT VOLTS"/8X"F.S. VOLTS=XX.X (3 1 DIGIT DEC #)"//3X"3) MODE"/8X"SEQUENTIAL------------ 1IMODE=0"/8X"RANDOM----------------IMODE=1"/8X"SINGLE 1 CHAN MONITOR---IMODE=2"//3X"4) PACER"/8X" 1NOT USED--IPACE=0"/8X"USED------IPACE=1"//3X 1"5) # OF SCANS ON EACH SET OF CHANS"/8X"ISCAN=XXX (3 1 DIGIT DEC #)"/15X"7 MAX FOR SEQUENTIAL OR 1 RANDOM MODES"/15X"112 MAX FOR CHAN MONITOR 1 MODE"//3X"6) CHAN ADDRESSES TO BE SCANNED"/8X"ICADD 1=XX,XX,--,(16 MAX, 2 DIGIT DEC #, 0-15)"//3X 1"7) # OF CHANS TO BE SCANNED"/8X"ICNUM=XX (2 DIGIT DEC 1 #)"///"COMPUTER SWITCH OPTIONS"//3X"SW(0)=1 BYPASS THIS 1 PRINTOUT"/3X"SW(1)=1 BYPASS DATA PRINTOUT" 1/3X"SW(2)=1 BYPASS INITIALIZING IOLOC AND F.S. 1 VOLTS"/3X"SW(3)=1 REPEAT TEST" 1//) 200 FORMAT("IOLOC= _") 300 FORMAT("IMODE= _") 400 FORMAT("ISCAN= _") 500 FORMAT("ICADD= _") 600 FORMAT("ICNUM= _") 700 FORMAT(//"CHAN#",3X,7(I1," SCAN",3X)) 800 FORMAT(2X,A2,1X,7F9.4) 900 FORMAT("END OF TEST") 910 FORMAT("CHAN # VALUE") 920 FORMAT("IPACE= _") 930 FORMAT("F.S. VOLTS= _") END END$