; File: PCACount.A51 Date: 07/23/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE(PCA PULSE COUNTER) $ DATE (07-23-92) $ DEBUG XREF ERRORPRINT $ PW(93) PL(60) $ NOMOD51 ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º COUNT PULSES USING THE PCA º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; NOTES: ; This program counts pulses on the P1.2 input using the PCA. ; The number of pulses can be found by reading the PCA ; operator from BASIC. Overflow counts can be found in ; internal RAM location 18H ; The PCA Interrupt is initialized by the following BASIC ; Statement: ; CALL 7F00H ; The number of counts received would then be read by: ; COUNTS=PCA+65536*DBY(18H) ; NOTE: The same features can be implemented, with a limit of ; 65,535 counts (no overflow detect) by the following program: ; 10 PCA=0 : CMOD=6 : TIME=0 : DBY(47H)=0 : L=0 ; 20 CLOCK1 : CCON=40H : ONTIME 1,50 : REM Set up Timer & PCA ; 30 IDLE : REM Low power wait for interrupt (60 times) ; 40 IF TIME<60 THEN 30 ELSE CLOCK0 : CCON=0 : END ; 50 A=PCA : REM Read the pulse counter register ; 60 X=A : A=A-L : IF A<0 THEN A=A+65536 ; 70 L=X : PRINT A : REM Print the number of pulses counted ; 80 ONTIME TIME+1,50 : RETI : REM Set up next interrupt $ NOLIST ; DON'T SHOW IN LIST FILE $ INCLUDE(REGFX.INC) ; INCLUDE 83C51FB REGISTERS $ LIST ; SHOW THE REST IN THE LIST FILE $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ FIXED MEMORY ADDRESS DECLARATIONS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ PCA_INT EQU 4033H ; PCA INTERRUPT VECTOR OVERFLOW DATA 18H ; HOLD PCA OVERFLOW COUNT ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ BEGINNING OF INITIALIZATION ROUTINE ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; ------------ 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. CSEG AT 7F00H 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 ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CLR A ; CLEAR PCA REGISTERS MOV CL,A MOV CH,A MOV OVERFLOW,A ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ CONFIGURE THE PCA FOR COUNTING PULSES ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ MOV CMOD,#0111B ; OVERFLOW CAUSES AN INTERRUPT SETB EC SETB EA SETB CR RET ; BACK TO BASIC $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ PCA INTERRUPT ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ PCA_INT_VEC: JBC CF,PCA_OK ; PCA OVERFLOW? RETI PCA_OK: INC OVERFLOW ; YES, INCREMENT LOOP COUNTER RETI ; END OF PROGRAM END ; Following is the source file derived from the MONITOR-51 ; listing. This can be used for directly loading the program ; via MONITOR-51 and almost any terminal program. A 7F00 MOV DPTR,#4033 MOV A,#02 MOVX @DPTR,A INC DPTR MOV A,#7F MOVX @DPTR,A INC DPTR MOV A,#1F MOVX @DPTR,A CLR A MOV E9,A MOV F9,A MOV 18,A MOV D9,#07 SETB AE SETB EAL SETB DE RET JBC DF,7F23 RETI INC 18 RETI . ; 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. :107F00009040337402F0A3747FF0A3741FF0E4F583 :107F1000E9F5F9F51875D907D2AED2AFD2DE221045 :067F2000DF0132051832FA :00000001FF