多级中断问题

2020-02-10 08:34发布

我想对脉冲的周期进行计时。  方案是 :利用 外部中断 启动和停止计时器 T2, T2定时 300us 中断,对中断次数进行统计。 没有用 ccp 是因为 T1 已经被占用。
  现在又个问题  : 就是 显示时   会闪现 a。 大家快来看看  问题出在那里?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
wujianwen_2005
1楼-- · 2020-02-10 09:34
程序 :

  #INCLUDE                  P16F877A.INC
;====================================================;
#DEFINE             A_1                   PORTB,0
#DEFINE             B_1                                                       PORTB,1
#DEFINE             C_1                                                             PORTB,2
#DEFINE             D_1                                                                   PORTB,3
#DEFINE             E_1                                                                   PORTB,4
#DEFINE             F_1                                                                   PORTB,5
#DEFINE             G_1                                                                   PORTB,6
#DEFINE             H_1                                                                    PORTB,7
#DEFINE             D1                    PORTD,7
#DEFINE             D2                    PORTD,6
#DEFINE             D3                    PORTD,5
#DEFINE             D4                    PORTD,4
#DEFINE             D5                    PORTD,3
#DEFINE             D6                    PORTD,2

;=====================================================================;
W_TEMP              EQU                   20H
STATUS_TEMP         EQU                   21H
PCLATH_TEMP         EQU                   22H
;=====================================================================;
TIME_FLAG           EQU                   23H
TIME_BC             EQU                   24H
TIME_500MS          EQU                   26H
#DEFINE             SJINT                 TIME_FLAG,0
#DEFINE             SJSXSJ                TIME_FLAG,1
#DEFINE             LED_SMSJ              TIME_FLAG,2
;=====================================================================;
LED0W               EQU                   2AH
LED1W               EQU                   2BH
LED2W               EQU                   2CH
LED3W               EQU                   2DH
LED4W               EQU                   2EH
LED5W               EQU                   2FH
LEDSM_FLAG          EQU                   30H
#DEFINE             SM0W                  LEDSM_FLAG,0
#DEFINE             SM1W                  LEDSM_FLAG,1
#DEFINE             SM2W                  LEDSM_FLAG,2
#DEFINE             SM3W                  LEDSM_FLAG,3
#DEFINE             SM4W                  LEDSM_FLAG,4
#DEFINE             SM5W                  LEDSM_FLAG,5
;======================================================================;
FLUX0W              EQU                   31H
FLUX1W              EQU                   32H
FLUX2W              EQU                   33H
FLUX3W              EQU                   34H
FLUX4W              EQU                   35H
FLUX5W              EQU                   36H  
FLUXLL              EQU                   3AH
FLUXHH              EQU                   3BH
FLUX_TEMPH          EQU                   3CH
FLUX_TEMPL          EQU                   3DH
FLUX_FLAG           EQU                   41H
#DEFINE             MCSJCJ_OKW            FLUX_FLAG,0             ; 脉冲采集完标志位
DAT_BUFLL           EQU                   42H
DAT_BUFHH           EQU                   43H
#DEFINE             MAXDAT                .1667

;======================================================================;
  
                    ORG                 0000H
                    GOTO                START
                    ORG                 0004H
                    GOTO                INTERMIT
                    ORG                 0005H
                     
INTERMIT:              
                    MOVWF               W_TEMP
                    SWAPF               STATUS,W
                    MOVWF               STATUS_TEMP
                    CLRF                STATUS
                    MOVF                PCLATH,W
                    BTFSC               INTCON,INTF
                    GOTO                OUTSIDE_INT
                    BTFSC               INTCON,TMR0IF
                    GOTO                TMR0_INT
                    BANKSEL             PIR1
                    BTFSC               PIR1,TMR2IF
                    GOTO                TMR2_INT
                    GOTO                INTERMITOK
TMR0_INT:
                    BTFSS               INTCON,TMR0IF
                    GOTO                INTERMITOK
                    BCF                 INTCON,TMR0IF
                    BSF                 SJINT                    ;2ms中断时间到,置1 标志位
                    INCF                TIME_BC,1
                    MOVLW               .5
                    SUBWF               TIME_BC,W
                    BTFSC               STATUS,C
                    GOTO                TIME_BCBC
                    MOVLW               .9                      ;因为之前的程式到3所以补偿3  
                    MOVWF               TMR0
                    GOTO                INTERMITOK   
TIME_BCBC:
                    CLRF                TIME_BC
                    nop
                    nop  
                    nop
                    nop   
                    nop
                        
                    MOVLW               .10                  ;因为之前的程式到3所以补偿3  
                    MOVWF               TMR0
                    GOTO                INTERMITOK   
                    
;=======================================外部中断程序==========================;                                                   
OUTSIDE_INT:        
                    BTFSS               INTCON,INTF
                    GOTO                INTERMITOK
                    BCF                 INTCON,INTF
                    BTFSS               T2CON,TMR2ON
                    GOTO                START_FLUXCJ
                    GOTO                STOP_FLUXCJ
                    
STOP_FLUXCJ:        
                    
                    BCF                 T2CON,TMR2ON             ;关闭T2 开始计时
                    BSF                 T2CON,0                  ;T2 4 分频
                    BSF                 MCSJCJ_OKW               ;脉冲时间采集完毕标志位  
                    GOTO                INTERMITOK
START_FLUXCJ:      
                    CLRF                FLUXLL
                    CLRF                FLUXHH
                    CLRF                TMR2                     ;清除TMR2
                    BSF                 T2CON,TMR2ON             ;启动T2 停止计时
                    BSF                 T2CON,0                       ;T2 4 分频
                    BCF                 MCSJCJ_OKW
                    GOTO                INTERMITOK  
                    
;============================================================================;
TMR2_INT:           
                    BANKSEL             PIR1
                    BTFSS               PIR1,TMR2IF
                    GOTO                INTERMITOK
                    BCF                 PIR1,TMR2IF
                    CLRF                TMR2
                    BSF                 T2CON,0                       ;T2 4 分频
                    BANKSEL             20H
                    INCF                FLUXLL,1
                    MOVF                FLUXLL,F
                    BTFSC               STATUS,Z
                    INCF                FLUXHH,1  
                    GOTO                INTERMITOK
;============================================================================;
INTERMITOK:                           
                    MOVF                PCLATH_TEMP,W
                    MOVWF               PCLATH                 
                    SWAPF               STATUS_TEMP,W
                    MOVWF               STATUS
                    SWAPF               W_TEMP,F
                    SWAPF               W_TEMP,W  
                    RETFIE         
;===========================================================================;
START:              
                    CLRWDT
                    CLRF                PORTB
                    CLRF                PORTD
                    MOVLW               0XFF
                    MOVWF               PORTA
                    BSF                 INTCON,GIE
                    BSF                 INTCON,PEIE
                    BSF                 INTCON,T0IE  
                    BSF                 INTCON,INTE
                    BSF                 T2CON,0                       ;T2 4 分频  
                    BCF                 T2CON,TMR2ON                  ;关闭T2
                    BANKSEL             PR2
                    MOVLW               .75
                    MOVWF               PR2                           ;定时300us,作为脉冲计时单位
                    BANKSEL             TMR0            
                    MOVLW               .6
                    MOVWF               TMR0
                    BANKSEL             OPTION_REG
                    MOVLW               .2
                    MOVWF               OPTION_REG                    ;2ms定时中断
                    BSF                 OPTION_REG,INTEDG             ;外部中断
                    BANKSEL             TRISB
                    MOVLW               0X01
                    MOVWF               TRISB
                    MOVLW               0X00
                    MOVWF               TRISD
                    MOVLW               07H
                    MOVWF               CMCON
                    MOVLW               06H
                    MOVWF               ADCON1                    
                    MOVLW               0FFH
                    MOVWF               TRISA
                    BSF                 PIE1,TMR2IE                   ;定时器2中断  
                    BANKSEL             20H
                    MOVLW               20H
                    MOVWF               FSR
CLRF_RAM_LOOP:
                    CLRWDT
                    CLRF                INDF
                    INCF                FSR,1
                    BTFSS               FSR,7
                    GOTO                CLRF_RAM_LOOP                    
                    GOTO                MAIN
MAIN:                 
                    CALL                FENSHI                        ;系统分时
                    CALL                FLUX_DEAL
                    CALL                LED_SM                        ;数码扫描显示
                    GOTO                MAIN
;==================================================================;
;函 数 名:          FENSHI
;功    能:         实现 分时 功能   
;输入说明:          标志位:SJINT (本设计为500US中断标志)  
;输出说明:          SJ500US        : 高电平时间单元标志  
;                   LED_SMSJ       : LED扫描时间
;空间说明:          TIME_2MS,TIME_10MS,TIME_500MS     
;==================================================================;                    
FENSHI:            
                    CLRWDT
                    BTFSS               SJINT
                    GOTO                FENSHI_OK
                    BCF                 SJINT
                    BSF                 LED_SMSJ
                    INCF                TIME_500MS,1
                    MOVLW               .250
                    SUBWF               TIME_500MS,W
                    BTFSS               STATUS,C
                    GOTO                FENSHI_OK
                    CLRF                TIME_500MS  
                    BSF                 SJSXSJ                    ;数据刷新时间
                    GOTO                FENSHI_OK
FENSHI_OK:          RETURN
;================================================================;
;函 数 名:         FLUX_DEAL
;功    能:         对脉冲高电平时间进行采集
;执行标志:         SJ500US
;                  START_FLUXCJW        1: 高电平状态,开始采集
;                                       0:低电平状态,停止采集         
;数据空间:         FLUXHH:FLUXLL         : 采集数据空间         
;                  FLUX_TEMPH:FLUX_TEMPL :数据暂存
;说    明:         采集高电平期间有多少个500us
;=================================================================;   
FLUX_DEAL:         CLRWDT
                   BTFSS                MCSJCJ_OKW                     ;一周期脉冲时间采集完成位
                   GOTO                 FLUX_DEAL_OK
                   BCF                  MCSJCJ_OKW
                   MOVLW                HIGH(MAXDAT)                   ;判断是否0.5秒,即数据为1000
                   SUBWF                FLUXHH,W                       ;>,判定为无效数据
                   BTFSS                STATUS,C
                   GOTO                 FLUXSJ_DEAL_NEXT
                   BTFSS                STATUS,Z
                   GOTO                 FLUX_DEAL_OK                   ;>放弃该值
                   MOVLW                LOW(MAXDAT)
                   SUBWF                FLUXLL,W
                   BTFSS                STATUS,C
                   GOTO                 FLUXSJ_DEAL_NEXT
                   GOTO                 FLUX_DEAL_OK                 
FLUXSJ_DEAL_NEXT:  
                   BTFSS                SJSXSJ                      ;刷新数据时间
                   GOTO                 FLUX_DEAL_OK
                   BCF                  SJSXSJ
                   CLRF                 FLUX_TEMPL
                   CLRF                 FLUX_TEMPH   
                   MOVF                 FLUXLL,W
                   MOVWF                FLUX_TEMPL
                   MOVF                 FLUXHH,W
                   MOVWF                FLUX_TEMPH
                   CALL                 BCD16BIT                    ;进行BCD转化  
                   GOTO                 FLUX_DEAL_OK
FLUX_DEAL_OK:      RETURN            
;===============================================================;
;函数名:           BCD16BIT                             
;功能  :           16位BCD转换                             
;转换前:           DAT_BUFHH:DAT_BUFLL
;转换结果:         WANWEI_BUF,QIANWEI_BUF,BAIWEI_BUF,SHIWEI_BUF,GEWEI_BUF
;==============================================================;
                           
BCD16BIT:           CLRWDT
                    CLRF                FLUX1W
                    CLRF                FLUX2W
                    CLRF                FLUX3W
                    CLRF                FLUX4W
                    CLRF                FLUX5W
                    MOVF                FLUX_TEMPL,W      
                    MOVWF               DAT_BUFLL
                    MOVF                FLUX_TEMPH,W      
                    MOVWF               DAT_BUFHH
BAIWEI:             MOVLW               D'100'         
                    SUBWF               DAT_BUFLL,W      
                    BTFSS               STATUS,C        
                    GOTO                SHIWEI           
                    MOVWF               DAT_BUFLL        
                    INCF                FLUX3W,1   
                    GOTO                BAIWEI         
SHIWEI:             MOVLW               D'10'
                    SUBWF               DAT_BUFLL,W
                    BTFSS               STATUS,C
                    GOTO                GEWEI
                    MOVWF               DAT_BUFLL
                    INCF                FLUX4W,1
                    GOTO                SHIWEI
GEWEI:              MOVF                DAT_BUFLL,W
                    ADDWF               FLUX5W,F
LOOPH:              MOVF                DAT_BUFHH,F
                    BTFSC               STATUS,Z
                    GOTO                BCD_OK
                    DECF                DAT_BUFHH,1
CHULI_GEWEI:        MOVLW               .6
                    ADDWF               FLUX5W,F
                    MOVLW               .10
                    SUBWF               FLUX5W,W
                    BTFSS               STATUS,C
                    GOTO                CHULI_SHIWEI
                    INCF                FLUX4W,1
                    MOVLW               .10
                    SUBWF               FLUX5W,F
CHULI_SHIWEI:       MOVLW               .5
                    ADDWF               FLUX4W,F
                    MOVLW               .10
                    SUBWF               FLUX4W,W
                    BTFSS               STATUS,C
                    GOTO                CHULI_BAIWEI
                    INCF                FLUX3W,1
                    MOVLW               .10
                    SUBWF               FLUX4W,F
CHULI_BAIWEI:       MOVLW               .2
                    ADDWF               FLUX3W,F
                    MOVLW               .10
                    SUBWF               FLUX3W,W
                    BTFSS               STATUS,C
                    GOTO                CHULI_QIANWEI
                    INCF                FLUX2W,1
                    MOVLW               .10
                    SUBWF               FLUX3W,F
CHULI_QIANWEI:      MOVLW               .10
                    SUBWF               FLUX2W,W
                    BTFSS               STATUS,C
                    GOTO                LOOPH                                 
                    INCF                FLUX1W,1                  
                    MOVLW               .10
                    SUBWF               FLUX2W,F
                    GOTO                LOOPH
BCD_OK:              
                    RETURN                                
;======================================================================;
;程序名:           LED_SM
;功  能:           动态扫描显示
;说  明:           扫描时间:     2MS
;                  扫描时间标志: LED_SMSJ
;                  显示数据空间:LED0W,LED1W,LED2W
;                                LED3W,LED4W,LED5W
;=======================================================================;                                 
LED_SM:            
                   CLRWDT
                   BTFSS                 LED_SMSJ
                   GOTO                  LED_SM_OK
                   BCF                   LED_SMSJ
                   GOTO                  SM_FLUX              
                   GOTO                  LED_SM_OK
SM_FLUX:         
                   MOVF                  FLUX0W,W
                   MOVWF                 LED0W
                   MOVF                  FLUX1W,W
                   MOVWF                 LED1W
                   MOVF                  FLUX2W,W
                   MOVWF                 LED2W   
                   MOVF                  FLUX3W,W
                   MOVWF                 LED3W
                   MOVF                  FLUX4W,W
                   MOVWF                 LED4W
                   MOVF                  FLUX5W,W
                   MOVWF                 LED5W
                   MOVF                  LED0W,F
                   BTFSS                 STATUS,Z      
                   GOTO                  SMSMSM
                   MOVLW                 .17
                   MOVWF                 LED0W
                   MOVF                  LED1W,F
                   BTFSS                 STATUS,Z      
                   GOTO                  SMSMSM
                   MOVLW                 .17
                   MOVWF                 LED1W
                   MOVF                  LED2W,F
                   BTFSS                 STATUS,Z      
                   GOTO                  SMSMSM
                   MOVLW                 .17
                   MOVWF                 LED2W
                   MOVF                  LED3W,F
                   BTFSS                 STATUS,Z      
                   GOTO                  SMSMSM
                   MOVLW                 .17
                   MOVWF                 LED3W
                   MOVF                  LED4W,F
                   BTFSS                 STATUS,Z      
                   GOTO                  SMSMSM
                   MOVLW                 .17
                   MOVWF                 LED4W
                   GOTO                  SMSMSM
                   GOTO                  LED_SM_OK
;===========================================================================;                                      
SMSMSM:           CLRWDT
                  BTFSS                 SM0W
                  GOTO                  SM_LED0W
                  BTFSS                 SM1W
                  GOTO                  SM_LED1W
                  BTFSS                 SM2W
                  GOTO                  SM_LED2W
                  BTFSS                 SM3W
                  GOTO                  SM_LED3W
                  BTFSS                 SM4W
                  GOTO                  SM_LED4W
                  GOTO                  SM_LED5W
SM_LED0W:         
                   BSF                  SM0W
                   BCF                  D1
                   MOVLW                HIGH(TABLE)
                   MOVWF                PCLATH
                   MOVF                 LED0W,W  
                   CALL                 TABLE
                   MOVWF                PORTB
                   BSF                  PORTD,1
                   BSF                  D6
                   GOTO                 LED_SM_OK
SM_LED1W:         
                   BSF                  SM1W
                   BCF                  D6
                   MOVLW                HIGH(TABLE)
                   MOVWF                PCLATH
                   MOVF                 LED1W,W
                   CALL                 TABLE
                   MOVWF                PORTB
                   BSF                  PORTD,1
                   BSF                  D5
                   GOTO                 LED_SM_OK
SM_LED2W:         
                   BSF                  SM2W
                   BCF                  D5
                   MOVLW                HIGH(TABLE)
                   MOVWF                PCLATH
                   MOVF                 LED2W,W
NEXT1:             CALL                 TABLE
                   MOVWF                PORTB
                   BSF                  PORTD,1
                   BSF                  D4  
                   GOTO                 LED_SM_OK
SM_LED3W:         
                   BSF                  SM3W
                   BCF                  D4
                   MOVLW                HIGH(TABLE)
                   MOVWF                PCLATH
                   MOVF                 LED3W,W
NEXT2:             CALL                 TABLE
                   MOVWF                PORTB
                   BSF                  PORTD,1
                   BSF                  D3
                   GOTO                 LED_SM_OK                                                        
SM_LED4W:         
                   BSF                  SM4W
                   BCF                  D3
                   MOVLW                HIGH(TABLE)
                   MOVWF                PCLATH
                   MOVF                 LED4W,W
NEXT3:             CALL                 TABLE
                   MOVWF                PORTB
                   BSF                  PORTD,1
                   BSF                  D2
                   GOTO                 LED_SM_OK                                       
SM_LED5W:         
                   MOVLW                B'11000000'
                   ANDWF                LEDSM_FLAG,F
                   BCF                  D2
                   MOVLW                HIGH(TABLE)
                   MOVWF                PCLATH
                   MOVF                 LED5W,W
NEXT4:             CALL                 TABLE
                   MOVWF                PORTB
                   BSF                  PORTD,1
                   BSF                  D1
                   GOTO                 LED_SM_OK
LED_SM_OK:         
                   RETURN  
                  
                    ORG           400H
TABLE:
                    ADDWF               PCL,F
                   ;RETLW               B'ABCDEFGH'  
                    RETLW               B'00000011'         ;0            
                    RETLW               B'10011111'         ;1
                    RETLW               B'00100101'         ;2
                    RETLW               B'00001101'         ;3
                    RETLW               B'10011001'         ;4
                    RETLW               B'01001001'         ;5
                    RETLW               B'01000001'         ;6
                    RETLW               B'00011111'         ;7
                    RETLW               B'00000001'         ;8
                    RETLW               B'00001001'         ;9
                    RETLW               B'00010001'         ;A
                    RETLW               B'11000001'         ;B
                    RETLW               B'01100011'         ;C
                    RETLW               B'10000101'         ;D
                    RETLW               B'01100001'         ;E
                    RETLW               B'01110001'         ;F
                    RETLW               B'11100011'         ;L
                    RETLW               B'11111111'         ;灭
                    END
wujianwen_2005
2楼-- · 2020-02-10 11:10
 精彩回答 2  元偷偷看……

一周热门 更多>