⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic_rtos.asm.bak

📁 基于PIC16F72的超声波清洗机源程序(汇编).
💻 BAK
字号:
 
     
;**********************************************************************
;中断处理部分
                      ; Begining of Program space for interrupt
        
INTZ    BCF     S_STA,C
        BTFSC   STATUS,C
        BSF     S_STA,C
        BCF     S_STA,Z
        BTFSC   STATUS,Z
        BSF     S_STA,Z
        MOVWF   W_STA          
        MOVF    FSR,0
        MOVWF   F_STA          ;现场保护
        MOVF    PCLATH,0
        MOVWF   PCH_STA    
        CLRWDT                 ;清开门狗

        BTFSS   INTCON,T0IE
        GOTO    INT_EX
        BTFSC   INTCON,T0IF    ;如果T0完成定时,则转T1处理 
        CALL    INTZ_T0   
              
INT_EX  BTFSS   INTCON,INTE
        GOTO    INT_T1
        BTFSC   INTCON,INTF    ;如果T0完成定时,则转T1处理 
        CALL    EXI_CL      
  
INT_T1  BSF     STATUS,RP0
        BTFSS   PIE1,TMR1IE
        GOTO    INTZE
        BCF     STATUS,RP0
        BTFSC   PIR1,TMR1IF    ;如果T1完成定时, 则转(时基)
        CALL    SYS_T1        

INTZE   BCF     STATUS,RP0
        MOVF    F_STA,0
        MOVWF   FSR
        MOVF    PCH_STA,0
        MOVWF   PCLATH
        MOVF    W_STA,0
        BCF     STATUS,C
        BTFSC   S_STA,C
        BSF     STATUS,C
        BCF     STATUS,Z
        BTFSC   S_STA,Z
        BSF     STATUS,Z        ;现场恢复
        RETFIE    
    
;***********************************************************************              
;T1中断服务程序,用于时基(10MS)
SYS_T1  BSF     STATUS,RP0
        BCF     PIE1,TMR1IE
        BCF     STATUS,RP0
        BCF     PIR1,TMR1IF      ;清T1中断申请标志
        MOVLW   SPERL            ;10MS定时
        MOVWF   TMR1L            ;初始化定时器
        MOVLW   SPERH            ;10MS定时
        MOVWF   TMR1H            ;初始化定时器        
        BSF     STATUS,RP0
        BSF     PIE1,TMR1IE
        BCF     STATUS,RP0       ;置T1中断有效标志

        MOVLW   TIM_ADD
        MOVWF   FSR              ;初始化

        MOVLW   TIM_SUM
        MOVWF   TIM_CU

        MOVLW   D'1'
        MOVWF   TIM_PC
        
SYS_T11 MOVF    TIM_EN,0        ;取各定时器的使能状态位
        ANDWF   TIM_PC,0        ;两者相与,结果为0,则说明该定时器禁止
        BTFSC   STATUS,Z
        GOTO    TO_CU           ;Z=1,该定时器位未就绪,则转,指向下个定时器

        MOVF    INDF,0          ;如果当前定时器有效,则判别定时是否完成
        BTFSC   STATUS,Z
        GOTO    TO_S            ;如果已完成,则转
        DECF    INDF,1          ;如果定时未完成,则递减,并指向下个定时器 
        GOTO    TO_CU           ;
        
        
TO_S    MOVF    TIM_OV,0        ;如果当前定时器完成,则判别当前定时器是否空闲
        ANDWF   TIM_PC,0
        BTFSS   STATUS,Z
        GOTO    TO_TY_P         ;如果该定时器忙,则判别任务类型
        
        MOVF    TIM_PC,0
        IORWF   TIM_OV,1        ;如果定时空闲,则置相应的定时器完成标志
TO_TY_P        
        MOVF    TIM_TY,0
        ANDWF   TIM_PC,0
        BTFSS   STATUS,Z       
        GOTO    TO_R          
;如果定时器类型是单次,则禁止该定时器        
TO_C    COMF    TIM_PC,0       ;取指针的反码
        ANDWF   TIM_EN,1       ;禁止该定时器
        
;如果定时器类型是周期,则恢复该定时器周期        
TO_R    BSF     FSR,7          ;BANK1:A0--A7为各定时器周期备份
        MOVF    INDF,0
        BCF     FSR,7
        MOVWF   INDF

TO_CU   INCF    FSR,1           ;指向下一个定时器
        BCF     STATUS,C
        RLF     TIM_PC,1
        
        DECFSZ  TIM_CU          ;检索完成个数
        GOTO    SYS_T11
        RETURN                  ;完成全部定时器的判别后退出。
;*********************************************************************
;T0中断处理 (50us中断间隔)    
INTZ_T0 BCF     INTCON,T0IE
        BCF     INTCON,T0IF
        MOVLW   D'54'
        MOVWF   TMR0
        BSF     INTCON,T0IE
        IF      USE_T0
        GOTO    T0_CL
        END IF
        RETURN
        
EXI_CL  
        IF      USE_T0 
        GOTO    EX_CL 
        END IF
        RETURN    
;*********************************************************************
;启动定时器0
EN_T0
        BSF    INTCON,T0IE     ;允许T0中断
        RETURN
;禁止定时器0
DS_T0
        BCF    INTCON,T0IE     ;允许T0中断
        RETURN        
;************************************************************************        
;任务建立
;参数:TASKID:任务号
;     TASKTM:任务周期 
;     TASKTY:任务工作类型  
;        0:单周期任务准备  1:循环任务准备    2:单周期任务启动     3:循环任务启动 
;        4:挂起任务        6:启动任务 
BUD_STAK
       MOVF    TASKID,0
       ADDLW   TIM_ADD
       MOVWF   FSR       ;指向设定定时器  
       MOVF    TASKTM,0 
       MOVWF   INDF      ;设置周期
       BSF     FSR,7     
       MOVWF   INDF      ;设置周期备份
TASK_SET
       MOVLW   01
       MOVWF   TASKPC
BUD_RO MOVF    TASKID,0
       BTFSC   STATUS,Z
       GOTO    BUD_STAK_PC  ;取当前任务的指针
       BCF     STATUS,C
       RLF     TASKPC,1
       DECF    TASKID,1
       GOTO    BUD_RO       
BUD_STAK_PC
       BTFSC   TASKTY,2
       GOTO    TASK_E       ;禁止设置任务类型
       
       MOVF    TASKTY,0 
       ANDLW   B'00000001'  ;取任务类型
       BTFSS   STATUS,Z
       GOTO    TASK_T       ;结果为0,则说明是单周期任务
       COMF    TASKPC,0
       ANDWF   TIM_TY,1     ;设置为单周期任务
       GOTO    TASK_E
       
TASK_T MOVF    TASKPC,0
       IORWF   TIM_TY,1     ;设置为循环任务
       
TASK_E MOVF    TASKTY,0 
       ANDLW   B'00000010'  ;取任务类型
       BTFSS   STATUS,Z
       GOTO    TASK_EC       ;结果为0,则说明是准备任务
       COMF    TASKPC,0
       ANDWF   TIM_EN,1      ;设置为任务准备
       GOTO    BUD_TASK_END
TASK_EC
       MOVF    TASKPC,0
       IORWF   TIM_EN,1      ;设置为启动任务      
BUD_TASK_END      
       RETURN 
;*********************************************************************
;任务启动
;参数:TASKID:任务号
EN_TASK
       MOVWF  TASKID
       MOVLW  6H
       MOVWF  TASKTY       
       GOTO   TASK_SET       
;*********************************************************************
;任务挂起
;参数:TASKID:任务号
DS_TASK
       MOVWF  TASKID
       MOVLW  4H
       MOVWF  TASKTY       
       GOTO   TASK_SET   
       
;*********************************************************************
;任务类型转换成单周期类型,并启动
;参数:TASKID:任务号
CH_TASK_D
       MOVWF  TASKID
       MOVLW  2H
       MOVWF  TASKTY       
       GOTO   TASK_SET          
       
;*********************************************************************
;任务类型转换成循环类型,并启动
;参数:TASKID:任务号
CH_TASK_T
       MOVWF  TASKID
       MOVLW  3H
       MOVWF  TASKTY       
       GOTO   TASK_SET          
       
;*********************************************************************
;系统启动
OS_START
       MOVLW   SPERL            ;10MS定时
       MOVWF   TMR1L            ;初始化定时器
       MOVLW   SPERH            ;10MS定时
       MOVWF   TMR1H            ;初始化定时器  
       BSF     T1CON,TMR1ON     ;打开定时器1
       BSF     STATUS,RP0
       BSF     PIE1,TMR1IE      ;允许定时器1中断
       BCF     STATUS,RP0
;主循环
ROTA   BTFSC   TIM_OV,TASKID0
       CALL    TASK0
       BTFSC   TIM_OV,TASKID1
       CALL    TASK1
       BTFSC   TIM_OV,TASKID2
       CALL    TASK2
       BTFSC   TIM_OV,TASKID3
       CALL    TASK3
       BTFSC   TIM_OV,TASKID4
       CALL    TASK4
       CLRWDT
       GOTO    ROTA      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -