; File: ADC_16.A51 Date: 10/07/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE(F4 DRIVER PROGRAM) $ DEBUG ERRORPRINT XREF $ PW(99) PL(60) DATE(10-07-92) ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º º ; º READ A 12-BIT ANALOG SIGNAL 16 TIMES AND AVERAGE º ; º º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; Sample BASIC Program: ; 1 REM ADC-12 MODULE Program ; ; REM Initialize variables ; 10 U=255 : V=256 : L=18H : H=L+1 ; ; REM Initialize ADC-12 ; 20 CALL 7E00H ; ; REM Do conversions and print the results ; 30 CALL 7F00H : PH0. DBY(L)+V*DBY(H) : GOTO 30 $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ PARAMETER DEFINITIONS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ DSEG AT 18H ResultX: DS 2 ; HOLDS CONVERSION SUM Counter: DS 1 ; Used as a temp counter CLOCK1: DS 1 ; TIMER REGISTER ; The following label selects which analog channel to convert Channel EQU 0 ; Select Channel 0 CHANNEL_LOOP EQU 16 ; NUMBER OF SAMPLES PER CHANNEL ADC EQU 0D800H ; ADC-12 MEMORY MAPPED ADDRESS HBE_LOW EQU 0D000H HBE_HIGH EQU 0D100H SFR_HIGH EQU 0D200H BOTH_HIGH EQU 0D300H SFR_LOW EQU HBE_HIGH BOTH_LOW EQU HBE_LOW ; Latched output mode, Reset Powerfail Flag, Invoke Calibration CALIBRATE EQU 0000$0011B CALIBRATE_TIME EQU 150 ; WAIT A LONG TIME EXEC_TIME EQU 10 ; INSTRUCTION EXEC TIME ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ BEGINNING OF INITIALIZATION ROUTINE ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; CSEG AT 7E00H ADC7802_INIT: ; INITIALIZE BOTH SFR AND HBE HIGH MOV DPTR,#BOTH_HIGH MOVX @DPTR,A MOV DPTR,#ADC MOV A,#CALIBRATE ; INITIALIZE FOR LATCHED MOVX @DPTR,A ; OUTPUT MODE MOV CLOCK1,#CALIBRATE_TIME DJNZ CLOCK1,$ ; WAIT FOR A WHILE RET ; Back to BASIC ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ BEGINNING OF MAIN PROGRAM LOOP ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; CSEG AT 7F00H ; Convert the channel and add the results Init: MOV Counter,#Channel_Loop ; Intialize Loop Count MOV ResultX,#0 ; Clear ADC Sums MOV ResultX+1,#0 ; Select ADC Channel and store the results Loop: MOV DPTR,#BOTH_LOW MOVX @DPTR,A MOV DPTR,#ADC ; POINT TO ADC MOV A,#Channel ; CONVERT CHANNEL 0 MOVX @DPTR,A ; SELECT CHANNEL MOV CLOCK1,#EXEC_TIME ; WAIT A WHILE DJNZ CLOCK1,$ CLR C MOV DPTR,#ADC ; GET LOW BYTE FIRST MOVX A,@DPTR ; GET RESULT ADD A,ResultX ; Add to previous sum MOV ResultX,A ; STORE IT MOV DPTR,#HBE_HIGH ; GET HIGH BYTE MOVX @DPTR,A MOV DPTR,#ADC MOVX A,@DPTR ; GET RESULT ADDC A,ResultX+1 MOV ResultX+1,A ; STORE IT ; Check if all samples have been taken DJNZ Counter,Loop $ EJECT ; Done taking samples - ; Find the average of the last 16 samples and save MOV A,ResultX ; Start with Low Byte ANL A,#0F0H ; Clear Low Nibble SWAP A MOV ResultX,A MOV A,ResultX+1 ; High Byte Next SWAP A PUSH ACC ; Save it ANL A,#0F0H ; Clear Low Nibble ORL A,ResultX ; Combine the bytes MOV ResultX,A ; Hold on to the value POP ACC ; Get the high byte again ANL A,#0FH ; Clear High Nibble MOV ResultX+1,A ; Hold on to the value RET ; Back to BASIC ; 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. :107E000090D300F090D8007403F0751B96D51BFD3D :017E1000224F :107F0000751A1075180075190090D000F074009063 :107F1000D800F0751B0AD51BFDC390D800E02518CA :107F2000F51890D100F090D800E03519F519D51A60 :107F3000D8E51854F0C4F518E519C4C0E054F0456C :0A7F400018F518D0E0540FF51922CF :00000001FF