📄 pic_rtos.asm.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 + -