; File: ADC3X100.A51 Date: 01/24/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE(HIGH SPEED 3 CHANNEL A/D) $ DATE (01-24-92) $ PW(93) $ PL(60) ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º º ; º STORE AN ARRAY OF ANALOG DATA º ; º º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; NOTES: ; This program demonstrates how to read three channels of the ; A/D Convertor and store the results in memory beginning at ; address 5000H (Channel 1), 5100H (Channel 2), and 5200H ; (Channel 3). ; Data is collected at a rate of one sample every 167 micro- ; seconds, resulting in exactly 100 samples in 1/60 sec. ; The data collection process can be invoked by the ; following BASIC statement: ; 10 CALL 7D00H ; Results are stored as follows: ; CHANNEL1 5000H-5063H ; CHANNEL2 5100H-5163H ; CHANNEL3 5200H-5263H ; Note: The sampling rate and number of samples can be varied ; by altering the following program constants: PERIOD EQU 167 ; NUMBER OF MICROSECONDS/SAMPLE COUNT EQU 100 ; NUMBER OF DATA POINTS TO TAKE BSEG AT 0 DONE_YET: DBIT 1 ; SET WHEN DONE DSEG AT 18H NEXT_ADC: DS 1 ; NEXT CHANNEL TO CONVERT POINTER: DS 1 ; POINT TO STORAGE LOCATION ADC_HOLD: DS 1 ; TEMP HOLDING LOCATION ; ADC Points to the Analog to Digital Converter ADC EQU 0FF00H CH0 EQU 9 CH1 EQU CH0+1 CH2 EQU CH1+1 ADC_RESULTS EQU 5000H CH1_RESULTS EQU ADC_RESULTS ; ADC RESULTS ARRAY CH2_RESULTS EQU CH1_RESULTS+100H CH3_RESULTS EQU CH2_RESULTS+100H ; -------------- INITIALIZE TIMER INTERRUPT ------------------- CSEG AT 7D00H Initialize: PUSH ACC PUSH PSW PUSH DPH PUSH DPL MOV DPTR,#400BH ; Stuff "LJMP XXXXH" into MOV A,#2 ; mirrored Timer 0 overflow MOVX @DPTR,A ; vector at address 400BH. INC DPTR MOV A,#HIGH Timer0Int ; Location of Timer 0 MOVX @DPTR,A ; interrupt routine. INC DPTR MOV A,#LOW Timer0Int MOVX @DPTR,A CLR A MOV POINTER,A ; INITIALIZE TO ZERO MOV NEXT_ADC,A ; CONVERT CHANNEL 0 FIRST MOV DPTR,#ADC MOV A,#CH0 MOVX @DPTR,A $ EJECT ; ------------ SET UP TIMER0 FOR A TIMED INTERRUPT ------------ ; Timer 0 is a 16 bit timer used to generate an interrupt. ; The input to both Timers is the internal system clock ; The frequency is OSC/12 = 1 MHz. (1uS) MOV A,TL0 ; Reload Timer 0 for 165 uS ADD A,#LOW -(PERIOD-2) ; (Less 2uS to compensate MOV TL0,A ; for ADD & MOV latency.) MOV TH0,#HIGH -(PERIOD-2) ; TMOD: ; Timer 1 Timer 0 ; ÃÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÅÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ´ ; ³ GAT ³ C/T ³ M1 ³ M0 ³ GAT ³ C/T ³ M1 ³ M0 ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 0 0 0 1 0 0 0 1 PUSH TMOD ; STORE CURRENT STATUS MOV TMOD,#11H ; TIMER/CNTR MODE CTRL REGISTER ; TCON: ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; ³ TF1 ³ TR1 ³ TF0 ³ TR0 ³ IE1 ³ IT1 ³ IE0 ³ IT0 ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 0 0 0 1 0 0 0 0 SETB TR0 ; Start Timer ; IE: ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; ³ EA ³ EC ³ ET2 ³ ES ³ ET1 ³ EX1 ³ ET0 ³ EX0 ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 1 0 0 0 0 0 1 0 SETB ET0 ; Timer 0 interrupt enable SETB EA ; Global interrupt enable CLR DONE_YET ; NOT DONE YET JNB DONE_YET,$ ; LOOP HERE UNTIL DONE CLR ET0 ; RESTORE TO ORIGINAL STATUS CLR EA POP TMOD POP DPL POP DPH POP PSW POP ACC RET ; BACK TO BASIC $ EJECT Timer0Int: MOV A,TL0 ; Reload Timer 0 for 165 uS ADD A,#LOW -(PERIOD-2) ; (Less 2uS to compensate MOV TL0,A ; for ADD & MOV latency.) MOV TH0,#HIGH -(PERIOD-2) MOV DPTR,#ADC MOV A,#CH1 MOVX @DPTR,A ; INVOKE NEXT CONVERSION ACALL GET_AND_STORE INC NEXT_ADC MOV DPTR,#ADC MOV A,#CH2 MOVX @DPTR,A ; INVOKE NEXT CONVERSION ACALL GET_AND_STORE INC NEXT_ADC MOV DPTR,#ADC MOV A,#CH0 MOVX @DPTR,A ; INVOKE NEXT CONVERSION ACALL GET_AND_STORE MOV NEXT_ADC,#0 ; CONVERT CHANNEL ZERO NEXT INC POINTER MOV A,POINTER CJNE A,#COUNT,ADC_OK ; DONE YET? SETB DONE_YET ; YES!! ADC_OK: RETI ; BACK TO WAIT LOOP GET_AND_STORE: MOVX A,@DPTR ; GET RESULTS FROM LAST TIME MOV ADC_HOLD,A ; SAVE IT MOV DPTR,#ADC_RESULTS MOV DPL,POINTER ; LOAD CORRECT POINTER MOV A,NEXT_ADC ADD A,DPH MOV DPH,A ; POINT TO CORRECT OFFSET MOV A,ADC_HOLD MOVX @DPTR,A ; SAVE VALUE MOV A,#5 ; WAIT FOR A WHILE DJNZ ACC,$ RET ; END OF PROGRAM END ; Following is the HEX file derived from the assembled source ; file. This can be used for directly loading the program via ; MONITOR-51 and almost any terminal program. :107D0000C0E0C0D0C083C08290400B7402F0A37466 :107D10007DF0A37449F0E4F519F51890FF0074099B :107D2000F0E58A245BF58A758CFFC089758911D2CC :107D30008CD2A9D2AFC2003000FDC2A9C2AFD08997 :107D4000D082D083D0D0D0E022E58A245BF58A753A :107D50008CFF90FF00740AF0B17B051890FF00744F :107D60000BF0B17B051890FF007409F0B17B75181A :107D7000000519E519B46402D20032E0F51A9050FA :107D800000851982E5182583F583E51AF07405D579 :037D9000E0FD22F1 :00000001FF