; File: PCA_Freq.A51 Date: 02/27/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE(Frequency Measurements) $ DATE (02-27-92) $ PW(93) PL(60) $ NOMOD51 ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º º ; º Frequency Measurements Using the PCA º ; º º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; PROGRAM ADAPTED FROM MCS(R)-51 REFERENCE MANUAL PAGE 6-112 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; NOTES: ; This program measures the frequency input to P1.3. The ; results are determined by the number of microseconds ; between the time that a positive transition is detected and ; the subsequent positive transition. The number of edges to ; count is determined by the variable "COUNT". The opposite ; polarity may be sampled by swapping the "POS" and "NEG" ; variable declarations. ; Results are stored in internal RAM as follows: ; Channel 0 (P1.3) 1AH, 1BH ; The PCA Interrupt is initialized by the following BASIC ; Statement: ; CALL 7D00H $ EJECT $ NOLIST ; DON'T SHOW IN LIST FILE $ INCLUDE(REGFX.INC) ; INCLUDE 83C51FB REGISTERS $ LIST ; SHOW THE REST IN THE LIST FILE ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ FIXED MEMORY ADDRESS DECLARATIONS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ INITIALIZE EQU 7D00H ; BEGINNING OF INITIALIZATION PCA_INT EQU 4033H ; PCA INTERRUPT VECTOR CAPTURE DATA 18H ; USER MEMORY LOCATIONS PERIOD DATA 1AH SAMPLE_COUNT DATA 1CH ; NO. OF PULSES TO COUNT OVERFLOW DATA 1DH ; HOLD PCA OVERFLOW COUNT FLAG BIT 20H.0 ; USER BIT LOCATION DONE0 BIT 20H.1 ; SET WHEN DONE ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ SYSTEM VARIABLE DECLARATIONS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ POS EQU 21H NEG EQU 11H COUNT EQU 10D ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ BEGINNING OF INITIALIZATION ROUTINE ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; CSEG AT INITIALIZE ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ LOAD PCA INTERRUPT VECTOR ADDRESS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; SINCE 4033H IS NOT IN WRITE-PROTECTABLE RAM, IT IS A GOOD ; IDEA TO LOAD THE VECTOR ADDRESS EACH TIME THAT THE PROGRAM ; IS INITIALLY EXECUTED. MOV DPTR,#PCA_INT ; LOAD VECTOR ADDR MOV A,#02 ; WITH CODE FOR MOVX @DPTR,A ; LJMP INSTRUCTION INC DPTR MOV A,#HIGH PCA_INT_VEC ; POINT TO ADDR MOVX @DPTR,A INC DPTR MOV A,#LOW PCA_INT_VEC MOVX @DPTR,A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ INITIALIZE PARAMETER REGISTERS AND FLAG BITS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ MOV SAMPLE_COUNT,#COUNT ; LOAD THE LOOP COUNT CLR A ; CLEAR PCA REGISTERS MOV CL,A MOV CH,A MOV OVERFLOW,A CLR FLAG CLR DONE0 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ CONFIGURE THE PCA FOR COUNTING PULSES ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ MOV CCAPM0,#POS ; SAMPLE RISING EDGE MOV CMOD,#01 ; OVERFLOW CAUSES AN INTERRUPT SETB EC SETB EA SETB CR ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ LOOP FOR A COMPLETE PERIOD ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ LOOP: MOV A,OVERFLOW ; Get the counter value CJNE A,#15,$+3 ; Wait for a second ; 65,535x15 = 1 sec JNC GET_OUT ; TIMEOUT JNB DONE0,LOOP ; WAIT UNTIL P1.3 IS DONE GET_OUT:CLR CR CLR EA CLR EC CLR A MOV CCAPM0,A RET ; BACK TO BASIC ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ PCA INTERRUPT ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ PCA_INT_VEC: JBC CCF0,MOD_0 ; MAKE SURE MOD 0 INTERRUPT JNB CF,EXIT ; PCA OVERFLOW? CLR CF ; YES INC OVERFLOW ; INCREMENT LOOP COUNTER EXIT: RETI MOD_0: JB FLAG,SECOND_CAPTURE FIRST_CAPTURE: MOV CAPTURE,CCAP0L MOV CAPTURE+1,CCAP0H SETB FLAG RETI SECOND_CAPTURE: DJNZ SAMPLE_COUNT,NOT_THIS_TIME ; PUT TOTAL TIME (IN MICROSECONDS) IN INTERNAL MEMORY LOCATIONS ; PERIOD (LSB) AND PERIOD+1 (MSB). NOTE: MEMORY LOCATION ; OVERFLOW HOLDS ANY PCA OVERFLOW COUNTS. PUSH ACC PUSH PSW CLR C MOV A,CCAP0L ; 16-Bit subtraction to find SUBB A,CAPTURE ; the difference. MOV PERIOD,A MOV A,CCAP0H ; Note: Also check OVERFLOW. SUBB A,CAPTURE+1 MOV PERIOD+1,A MOV CCAPM0,#0 ; DONE WITH MEASUREMENTS SETB DONE0 POP PSW POP ACC NOT_THIS_TIME: RETI ; 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. :107D00009040337402F0A3747DF0A3743CF0751CB2 :107D10000AE4F5E9F5F9F51DC200C20175DA21752D :107D2000D901D2AED2AFD2DEE51DB40F0050033080 :107D300001F6C2DEC2AFC2AEE4F5DA2210D80830D6 :107D4000DF04C2DF051D3220000985EA1885FA1913 :107D5000D20032D51C1AC0E0C0D0C3E5EA9518F5B0 :107D60001AE5FA9519F51B75DA00D201D0D0D0E0EA :017D700032E0 :00000001FF