; File: PulseWid.A51 Date: 02/12/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE(Pulse Width Measurements) $ DATE (02-12-92) $ PW(93) PL(60) $ NOMOD51 ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º º ; º Pulse Width Measurements Using the PCA º ; º º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; NOTES: ; This program samples inputs and performs pulse width ; measurements. The results are determined by the number of ; microseconds between the time that a negative transition is ; detected and the subsequent positive transition. The ; opposite polarity may be sampled by swapping the "POS" and ; "NEG" declarations. ; Results are stored as follows: ; Channel 0 (P1.3) 5000H - 5001H ; Channel 1 (P1.4) 5002H - 5003H ; Channel 2 (P1.5) 5004H - 5005H ; Channel 3 (P1.6) 5006H - 5007H ; The PCA Interrupt is initialized (the first time) by the ; following BASIC Statement: ; CALL 7E00H ; Subsequent measurements can be invoked from BASIC by ; CALLing either 7E0EH or 7E11H, depending on whether all or ; selected input channels are to be sampled. Example BASIC ; statements would be: ; CALL 7E0EH : REM Sample all inputs ; Only sample input channels 0 & 2 (P1.3 & P1.5): ; DBY(21H)=0A0H : CALL 7E11H : REM 1&3 "Done" $ EJECT $ NOLIST ; DON'T SHOW IN LIST FILE $ INCLUDE(REGFX.INC) ; INCLUDE 83C51FB REGISTERS $ LIST ; SHOW THE REST IN THE LIST FILE ; --------------- MACRO FOR INTERRUPT ROUTINE ----------------- ; Since each module's interrupt function is identical, a source ; file macro was created to reduce the size of the source file. MODULE MACRO NUM MOD_&NUM: JBC FLAG&NUM,SECOND_CAPTURE&NUM FIRST_CAPTURE&NUM: MOV CAPTURE&NUM,CCAP&NUM&L MOV CAPTURE&NUM+1,CCAP&NUM&H MOV CCAPM&NUM,#POS SETB FLAG&NUM AJMP DONE ; PUT TOTAL TIME (IN MICROSECONDS) IN EXTERNAL MEMORY LOCATIONS ; PULSE&NUM (LSB) AND PULSE&NUM+1 (MSB). SECOND_CAPTURE&NUM: MOV DPTR,#PULSE&NUM CLR C MOV A,CCAP&NUM&L SUBB A,CAPTURE&NUM MOVX @DPTR,A INC DPTR MOV A,CCAP&NUM&H SUBB A,CAPTURE&NUM+1 MOVX @DPTR,A MOV CCAPM&NUM,#0 ; DONE WITH MEASUREMENTS SETB DONE&NUM ENDM $ EJECT INITIALIZE EQU 7E00H ; BEGINNING OF INITIALIZATION PCA_INT EQU 4033H ; PCA INTERRUPT VECTOR DSEG AT 18H CAPTURE0: DS 2 ; USER MEMORY LOCATIONS CAPTURE1: DS 2 CAPTURE2: DS 2 CAPTURE3: DS 2 CLOCK_HOLD: DS 1 ; Add another counter ALL_BITS: DS 1 ; Point to all user bits BSEG AT 8 FLAG0: DBIT 1 ; USER BIT LOCATIONS FLAG1: DBIT 1 FLAG2: DBIT 1 FLAG3: DBIT 1 DONE0: DBIT 1 DONE1: DBIT 1 DONE2: DBIT 1 DONE3: DBIT 1 XSEG AT 5000H PULSE0: DS 2 ; STORE RESULTS HERE PULSE1: DS 2 PULSE2: DS 2 PULSE3: DS 2 POS EQU 21H NEG EQU 11H ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ $ EJECT ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ 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 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ INITIALIZE PARAMETER REGISTERS AND FLAG BITS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ALL_4: CLR A MOV ALL_BITS,A ; Clear the "DONE" Bits ; Clear out all of the previous results Clear: MOV DPTR,#PULSE0 ; Point to first results MOV CLOCK_HOLD,#8 ; Loop 8 times CLR A CLEAR_LOOP: MOVX @DPTR,A ; Clear the results INC DPTR DJNZ CLOCK_HOLD,CLEAR_LOOP MOV CCON,A MOV CL,A MOV CH,A MOV CMOD,#01 ; PCA Overflow causes interrupt $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ CONFIGURE THE PCA FOR COUNTING PULSES ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ MOV CCAPM0,#NEG MOV CCAPM1,#NEG MOV CCAPM2,#NEG MOV CCAPM3,#NEG SETB EC SETB EA SETB CR ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ LOOP UNTIL ALL PULSES RECEIVED ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ LOOP: MOV A,CLOCK_HOLD ; 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 JNB DONE1,LOOP ; WAIT UNTIL P1.4 IS DONE JNB DONE2,LOOP ; WAIT UNTIL P1.5 IS DONE JNB DONE3,LOOP ; WAIT UNTIL P1.6 IS DONE GET_OUT:CLR CR CLR EA CLR EC CLR A MOV CCAPM0,A MOV CCAPM1,A MOV CCAPM2,A MOV CCAPM3,A RET ; BACK TO BASIC ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ PCA INTERRUPT ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ PCA_INT_VEC: PUSH ACC PUSH PSW PUSH DPH PUSH DPL JBC CCF0,MOD_0 ; FIGURE OUT WHICH INTERRUPT JBC CCF1,MOD_1 JBC CCF2,MOD_2 JBC CCF3,MOD_3 JNB CF,OVER_F ; Check for PCA overflow CLR CF ; Clear overflow flag INC CLOCK_HOLD OVER_F: AJMP DONE $ EJECT MODULE 0 SJMP DONE MODULE 1 SJMP DONE MODULE 2 SJMP DONE MODULE 3 DONE: POP DPL POP DPH POP PSW POP ACC 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. :107E00009040337402F0A3747EF0A3745BF0E4F549 :107E100021905000752008E4F0A3D520FBF5D8F59B :107E2000E9F5F975D90175DA1175DB1175DC117594 :107E3000DD11D2AED2AFD2DEE520B40F00500C304F :107E40000CF6300DF3300EF0300FEDC2DEC2AFC2D3 :107E5000AEE4F5DAF5DBF5DCF5DD22C0E0C0D0C03C :107E600083C08210D81210D93510DA5810DB7B305D :107E7000DF04C2DF0520E10E10080D85EA1885FA3F :107E80001975DA21D208E10E905000C3E5EA951881 :107E9000F0A3E5FA9519F075DA00D20C807010099C :107EA0000D85EB1A85FB1B75DB21D209E10E905085 :107EB00002C3E5EB951AF0A3E5FB951BF075DB001B :107EC000D20D804A100A0D85EC1C85FC1D75DC2145 :107ED000D20AE10E905004C3E5EC951CF0A3E5FC3A :107EE000951DF075DC00D20E8024100B0D85ED1E63 :107EF00085FD1F75DD21D20BE10E905006C3E5ED27 :107F0000951EF0A3E5FD951FF075DD00D20FD08220 :077F1000D083D0D0D0E03295 :00000001FF