📄 catcher.asm
字号:
;********************CATCHER********************
;本程序实现用捕捉方式实现方波周期和正脉冲宽度测量。
;入口参数:CCP1引脚上输入方波。
;出口参数:正脉冲宽度在SOUH:SOU中,方波周期在RLTH:RLT中。
;占用资源:W,STATUS,INT,TMR1,023H,024H,025H,028H,029H,二重堆栈。
;说明: 1.使用该程序需在中断入口程序中填入如下两条指令
; BTFSC PIR1,CCP1IF
; GOTO CATINT
; 2.方波周期必须在30*4TOSC~65536*4TOSC之间,
; 正脉冲必须大于10TOSC,否则测量值无效
IFNDEF CATCHER1
#DEFINE CATCHER1
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
CATCHER MOVLW 4
MOVWF SOU
MOVWF RLT
CLRF SOUH
CLRF RLTH
CLRF TMR1H
CLRF TMR1L ;定时器清0
BSF INTCON,PEIE
BSF INTCON,GIE
BSF STATUS,RP0
BCF PIE1,CCP1IE ;关中断
BSF TRISC,2 ;RC2输入
BCF STATUS,RP0
MOVLW B'00000000' ;T1定时器方式,1:1分频
MOVWF T1CON
MOVLW B'00000101' ;设置CCP1为捕捉工作方式,上升沿触发
MOVWF CCP1CON
BCF PIR1,CCP1IF
BTFSS PIR1,CCP1IF ;捕捉到第一个上升沿了吗?
GOTO $-1 ;此过程损失掉4*4TOSC
BSF T1CON,TMR1ON ;开始定时
CLRF CCP1CON
BSF CCP1CON,CCP1M2 ;下降沿捕捉
BCF PIR1,CCP1IF
BSF STATUS,RP0
BSF PIE1,CCP1IE ;开中断
BCF STATUS,RP0
RETURN
;*******************捕捉中断************************
CATINT MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
BTFSC CCP1CON,CCP1M0
GOTO NEXT51
MOVF CCPR1L,W
ADDWF SOU,F ;加上损失掉的4*4TOSC
BTFSC STATUS,C
INCF SOUH,F
MOVF CCPR1H,W
ADDWF SOUH,F ;得到正脉冲宽度
CLRF CCP1CON
MOVLW B'00000101'
MOVWF CCP1CON ;上升沿捕捉
GOTO DONE13
NEXT51 MOVF CCPR1L,W
ADDWF RLT,F ;加上损失掉的4*4TOSC
BTFSC STATUS,C
INCF RLTH,F
MOVF CCPR1H,W
ADDWF RLTH,F ;得到周期数
CLRF CCP1CON ;关闭捕捉功能
BCF T1CON,TMR1ON ;关闭T1
DONE13 BCF PIR1,CCP1IF
SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -