*FILE MEMBER=ADC_CONVERT LIBRARY=SNOMAN LANGUAGE=FORTRAN77 DATE=16:Oct:1997 <<< SUBROUTINE ADC_CONVERT(CON_TYPE,ADC_WORD,CON_WORD) * SNOMAN: Convert ADC 2's complement into range 0-4095, or visa versa. * Contact: R.G. Van de Water (Penn) * Parameters:- * ========== * Common Block Access:- * =================== * (ignoring internal and environmental access) * None. * Specification:- * ============= * o For CON_TYPE= CON_FROM_ADC, convert ADC_WORD (2s complement) to * CON_WORD (0-4095). * o For CON_TYPE= CON_TO_ADC, convert CON_WORD (0-4095) to ADC_WORD * (2s complement). * Program Notes:- * ============= * o CERNLIB: CALL SBYT(IA,IX,J,NBITS) COPIES THE BYTE (OF LENGTH NBITS) * AT 1 OF IA INTO THE BYTE AT J OF IX * o CERNLIB: IX= JBYT(IW,J,NBITS) RETURNS IN IX THE RIGHT-JUSTIFIED * BYTE (OF LENGTH NBITS) AT J IN IW * Revision History:- * ================ * 3.01 R.G. Van de Water First Version. * IMPLICIT NONE INCLUDE 'bank_zdab_pmt.inc' INCLUDE 'zunit.inc' * Argument Declarations:- * ===================== INTEGER CON_TYPE INTEGER ADC_WORD !ADC 2s COMPLEMENT WORD INTEGER CON_WORD !CONVERTED WORD FOR ANALYSIS, RANGE 0-4095 * Local Variable Declarations:- * =========================== INTEGER JBYT INTEGER SIGN1,SIGN2,VAL1,VAL2 INTEGER TVAL1,TVAL2,TEMP * ENDHEADER IF(CON_TYPE .EQ. CON_FROM_ADC)THEN TEMP= ADC_WORD C UNPACK ADC WORDS SIGN1= JBYT(TEMP,12,1) !LOWER WORD SIGN BIT SIGN2= JBYT(TEMP,28,1) !UPPER WORD SIGN BIT VAL1= JBYT(TEMP,1,11) !LOWER WORD VALUE VAL2= JBYT(TEMP,17,11) !UPPER WORD VALUE C FIND NEGATIVE IF SIGN BIT SET IF(SIGN1.EQ.1)VAL1= VAL1-2048 IF(SIGN2.EQ.1)VAL2= VAL2-2048 C ADD OFFSET SO RANGE IS 0 TO 4095 VAL1= VAL1+2048 VAL2= VAL2+2048 C REPACK CON_WORD= ADC_WORD CALL SBYT(VAL1,CON_WORD,1,12) CALL SBYT(VAL2,CON_WORD,17,12) ELSE IF(CON_TYPE .EQ. CON_TO_ADC)THEN TEMP= CON_WORD C UNPACK CON WORDS TVAL1= JBYT(TEMP,1,12) !LOWER WORD VALUE TVAL2= JBYT(TEMP,17,12) !UPPER WORD VALUE C SUBTRACT OFFSET SO RANGE IS -2048 TO 2047 TVAL1= TVAL1-2048 TVAL2= TVAL2-2048 C SET SIGN BIT SIGN1= 0 SIGN2= 0 IF(TVAL1.LT.0)SIGN1= 1 IF(TVAL2.LT.0)SIGN2= 1 C PEEL OFF THE VALUE VAL1= JBYT(TVAL1,1,11) VAL2= JBYT(TVAL2,1,11) C REPACK ADC_WORD= CON_WORD CALL SBYT(SIGN1,ADC_WORD,12,1) CALL SBYT(SIGN2,ADC_WORD,28,1) CALL SBYT(VAL1,ADC_WORD,1,11) CALL SBYT(VAL2,ADC_WORD,17,11) ELSE WRITE(IQLOG,*) ' ADC_CONVERT: NO CONVERSION TYPE SPECIFIED.' ENDIF RETURN END *ENDFILE MEMBER=ADC_CONVERT