?? control.asm
字號:
title this is a program for rolling door controller
;version1.1
;下端定位
;名稱定義和變量定義
F0 EQU 0
RTCC EQU 1
PC EQU 2
STATUS EQU 3
FSR EQU 4
RA EQU 5
RB EQU 6
W EQU 0
F EQU 1
Z EQU 2
C EQU 0
;輸出變量
DIRECTION EQU 0 ;電機正反轉運轉(RA)
BRAKE EQU 1 ;電機剎車控制(RA)
LOCK EQU 2 ;電機制動控制(RA)
;輸入變量
PULSEIN EQU 3 ;脈沖輸入(RA)
up equ 2 ;門向上運動
stop equ 1 ;門停止運動
down equ 0 ;門向下運動
LOCKIN EQU 3 ;遙控鎖輸入,電壓低于18V時輸入
CONTINUEUP EQU 4 ;門持續向上運動(RB)
CONTINUEDOWN EQU 5 ;門持續向下運動(RB)
TOPHIG EQU 10H ;門的上限位置
TOPMED EQU 11H
TOPLOW EQU 12H
PULSEHIG EQU 13H ;脈沖數
PULSEMED EQU 14H
PULSELOW EQU 15H
BOTTOMHIG EQU 16H ;門的下限位置
BOTTOMMED EQU 17H
BOTTOMLOW EQU 18H
COUNT1 EQU 19H ;計數器
COUNT2 EQU 1AH ;延時計數
COUNT3 EQU 1cH ;計數器
count4 equ 1dh
count5 equ 1eh
count6 equ 1fh
FLAG EQU 1BH ;標志
ERRORFLAG EQU 0 ;電機異常狀態標志
topflag equ 1 ;門到上端位置標志
bottomflag equ 2 ;門到下端位置標志
updelayflag equ 5 ;上升延時標志
downdelayflag equ 6 ;下降延時標志
highflag equ 7 ;高電平標志
RESETADD EQU 1FFH
;開始
ORG RESETADD
GOTO MAIN
ORG 0
;子程序區
;***************
;***************
;上升子程序*****
;***************
;***************
UPSUB:
MOVLW 40 ;為低電平則延時,確保低電平有足夠的寬度
MOVWF COUNT2
upsubloop1
DECFSZ COUNT2,F
GOTO upsubLOOP1
btfss rb,up
goto upback ;沒有按鈕按下,則結束
btfss rb,lockin ;輸入電壓是否高于22V
goto upback ;低于22V則結束
BTFSC FLAG,ERRORFLAG ;電機是否發生了異常
goto upback
btfsc flag,topflag ;門是否在上端位置
goto upback
btfsc rb,stop ;停止按鈕有無按下.
goto upback ;有則結束
bcf ra,direction ;門上升
;判斷當前狀態
btfsc ra,pulsein ;當前輸入是否為低電平
goto upsubhigh ;設置當前狀態為高電平
bcf flag,highflag ;設置當前狀態為低電平
goto upstart1
upsubhigh
bsf flag,highflag ;設置當前狀態為高電平
upstart1
bcf flag,updelayflag
CLRF RTCC ;開始計時
UPBRAN1
MOVF PULSELOW,W ;比較PULSELOW和TOPLOW是否相等
SUBWF TOPLOW,W
BTFSS STATUS,Z
GOTO UPBRAN2 ;不等則上升
MOVF PULSEMED,W ;相等則比較PULSEMED和TOPMED是否相等
SUBWF TOPMED,W
BTFSS STATUS,Z
GOTO UPBRAN2 ;不等則上升
MOVF PULSEHIG,W ;相等則比較PULSEHIG和TOPHIG是否相等
SUBWF TOPHIG,W
BTFSC STATUS,Z
GOTO UPEND1 ;相等則停止上升
UPBRAN2
bcf ra,lock ;制動系統不起作用
bcf ra,brake
CALL UPCOUNTSUB ;對脈沖數進行計數
BTFSC FLAG,ERRORFLAG ;電機發生異常?
GOTO UPEND ;電機發生異常
BTFSC RB,STOP ;停止按鈕是否按下
GOTO upend ;停止按鈕按下則門停止上升
bcf flag,bottomflag ;清除下端位置標志
GOTO UPBRAN1 ;轉到UPBRAN1
upend1
bsf flag,topflag ;設置門到上端位置標志
UPEND
BSF RA,BRAKE ;電機停止上升
BSF RA,DIRECTION
BSF RA,LOCK ;制動系統起作用
clrf rtcc
bsf flag,updelayflag
clrf count1
updelayloop
CALL UPCOUNTSUB ;計數
movlw 0ffh
SUBWF RTCC,W
BTFSS STATUS,C
goto updelayloop
incf count1,f
movlw 0ah
subwf count1,w
btfss status,z
goto updelayloop
clrf count1
bcf flag,updelayflag
upback
RETLW 0
;***********
;***********
;下降子程序*
;***********
;***********
DOWNSUB
MOVLW 40 ;為低電平則延時
MOVWF COUNT2
downsubloop1
DECFSZ COUNT2,F
GOTO downsubLOOP1
btfss rb,down
goto downback
btfss rb,lockin ;電壓是否低于20V
GOTO downback ;低于20V則結束
btfsc flag,errorflag
goto downback
btfsc flag,bottomflag
goto downback
btfsc rb,stop ;停止按鈕有無按下.
goto downback ;有則結束
BSF RA,DIRECTION ;電機下降,電機引出線端視逆時針方向
btfsc ra,pulsein ;當前輸入是否為低電平
goto downsubhigh ;設置當前狀態為高電平
bcf flag,highflag ;設置當前狀態為低電平
goto downstart
downsubhigh
bsf flag,highflag ;設置當前狀態為高電平
downstart
bcf flag,downdelayflag
clrf rtcc
DOWNSUB1
MOVF PULSELOW,W ;比較PULSELOW和BOTTOMLOW是否相等
SUBWF BOTTOMLOW,W
BTFSS STATUS,Z
GOTO DOWNBRAN1 ;不等則下降
MOVF PULSEMED,W ;相等則比較PULSEMED和BOTTOMMED是否相等
SUBWF BOTTOMMED,W
BTFSS STATUS,Z
GOTO DOWNBRAN1 ;不等則下降
MOVF PULSEHIG,W ;相等則比較PULSEHIG和BOTTOMHIG是否相等
SUBWF BOTTOMHIG,W
BTFSC STATUS,Z
GOTO DOWNEND ;相等則停止下降
DOWNBRAN1
bcf ra,lock
bcf ra,brake ;去掉剎車門開始下降
CALL DOWNCOUNTSUB ;對脈沖數進行計數
BTFSC FLAG,ERRORFLAG
GOTO DOWNEND1
BTFSC RB,STOP ;停止按鈕是否按下
GOTO downend1 ;停止按鈕按下則轉到DOWNend1
bcf flag,topflag ;清除門到上端位置標志
GOTO DOWNSUB1 ;轉到DOWNSUB1
downend
bsf flag,bottomflag
DOWNEND1
BSF RA,BRAKE ;門停止下降
BSF RA,DIRECTION
BSF RA,LOCK ;制動系統起作用
bsf flag,downdelayflag
clrf count1
clrf rtcc
downdelayloop
CALL DOWNCOUNTSUB
MOVLW 0ffh ;判斷電機是否停止運轉
SUBWF RTCC,W
BTFSS STATUS,C
goto downdelayloop
INCF COUNT1,F
movlw 0ah
subwf count1,w
btfss status,z
goto downdelayloop
clrf count1
bcf flag,downdelayflag
downback
RETLW 0
;****************
;****************
;持續上升子程序**
;****************
;****************
CONTINUEUPSUB
BTFSC FLAG,ERRORFLAG ;電機是否異常
RETLW 0
bcf flag,topflag
bcf flag,bottomflag
bcf flag,updelayflag
bcf ra,lock ;制動系統不起作用
BCF RA,DIRECTION ;電機上升(電機位于左邊)
BCF RA,BRAKE ;去掉剎車
clrf rtcc
btfsc ra,pulsein ;當前輸入是否為低電平
goto cuhigh ;設置當前狀態為高電平
bcf flag,highflag ;設置當前狀態為低電平
goto continueupbran1
cuhigh
bsf flag,highflag ;設置當前狀態為高電平
CONTINUEUPBRAN1
BTFSC RB,CONTINUEUP ;持續上升按鈕是否按下
GOTO CONTINUEUPEND ;沒有按下停止上升
CALL UPCOUNTSUB ;按下則調用上升計數子程序
BTFSC FLAG,ERRORFLAG ;電機是否發生異常
GOTO CONTINUEUPEND ;電機發生異常現象
GOTO CONTINUEUPBRAN1
CONTINUEUPEND
BSF RA,BRAKE ;電機停止運轉
bsf ra,direction
bsf ra,lock ;制動系統起作用
MOVF PULSELOW,W ;是則設置上限位置值
MOVWF TOPLOW
MOVF PULSEMED,W
MOVWF TOPMED
MOVF PULSEHIG,W
MOVWF TOPHIG
RETLW 0
;*****************
;*****************
;持續下降子程序***
;*****************
;*****************
CONTINUEDOWNSUB
BTFSC FLAG,ERRORFLAG ;電機是否異常
RETLW 0
bcf flag,topflag
bcf flag,bottomflag
bcf flag,downdelayflag
bcf ra,lock ;制動系統不起作用
BSF RA,DIRECTION ;電機下降
BCF RA,BRAKE ;去掉剎車
clrf count3
CLRF RTCC
btfsc ra,pulsein ;當前輸入是否為低電平
goto cdhigh ;設置當前狀態為高電平
bcf flag,highflag ;設置當前狀態為低電平
goto continuedownbran1
cdhigh
bsf flag,highflag ;設置當前狀態為高電平
CONTINUEDOWNBRAN1
BTFSC RB,CONTINUEDOWN ;持續下降按鈕是否按下
GOTO CONTINUEDOWNEND ;沒有按下則停止下降
CALL DOWNCOUNTSUB ;按下則調用下降計數子程序
BTFSC FLAG,ERRORFLAG ;電機是否發生異常
GOTO CONTINUEDOWNEND ;電機發生異常
GOTO CONTINUEDOWNBRAN1
CONTINUEDOWNEND
BSF RA,BRAKE ;電機剎車
bsf ra,direction
bsf ra,lock ;制動系統起作用
MOVF PULSELOW,W ;是則設置上限位置值
MOVWF TOPLOW
MOVF PULSEMED,W
MOVWF TOPMED
MOVF PULSEHIG,W
MOVWF TOPHIG
RETLW 0
;************
;************
;上升計數****
;************
;************
UPCOUNTSUB
BTFSC RA,PULSEIN ;脈沖是否為低電平
goto uphigh ;不為低電平則轉到高電平
btfss flag,highflag ;原來為高電平嗎?
goto upcountend ;不為高電平則結束
bcf flag,highflag ;設置當前狀態為低電平
bcf count3,0
goto upcount ;計數
uphigh
btfsc flag,highflag ;原來為低電平嗎?
goto upcountend ;不為低電平則結束
bsf flag,highflag ;設置當前狀態為高電平
bsf count3,0
UPCOUNT
btfsc count3,0
goto upcountend
btfss flag,updelayflag
CLRF RTCC ;計時重新開始
MOVLW 1 ;PULSELOW+1
ADDWF PULSELOW,F
BTFSS STATUS,C ;有無進位
RETLW 0 ;無進位則結束
MOVLW 1 ;有進位則PULSEMED+1
ADDWF PULSEMED,F
BTFSC STATUS,C ;有無進位
INCF PULSEHIG,F ;有進位則PULSEHIG+1
RETLW 0
UPCOUNTEND
btfsc flag,updelayflag
retlw 0
MOVLW 0ffH ;判斷電機是否停止運轉
SUBWF RTCC,W
BTFSC STATUS,C
BSF FLAG,ERRORFLAG ;設置電機異常標志
RETLW 0
;***********
;***********
;下降計數***
;***********
;***********
DOWNCOUNTSUB
BTFSC RA,PULSEIN ;脈沖是否為低電平
goto downhigh ;不為低電平則轉到高電平
btfss flag,highflag ;原來為高電平嗎?
goto downcountend ;不為高電平則結束
bcf flag,highflag ;設置當前狀態為低電平
bsf count3,0
goto downcount ;計數
downhigh
btfsc flag,highflag ;原來為低電平嗎?
goto downcountend ;不為低電平則結束
bsf flag,highflag ;設置當前狀態為高電平
bcf count3,0
DOWNCOUNT
btfsc count3,0
goto downcountend
btfss flag,downdelayflag
CLRF RTCC ;計時重新開始
movlw 1
SUBWF PULSELOW,F ;PULSELOW-1
BTFSC STATUS,C ;有無借位
RETLW 0 ;無借位則結束
MOVLW 1 ;pulsemed-1
SUBWF PULSEMED,F
BTFSS STATUS,C ;有無借位
DECF PULSEHIG,F ;有借位則PULSEHIG-1
RETLW 0
DOWNCOUNTEND
btfsc flag,downdelayflag
retlw 0
MOVLW 0ffh ;判斷電機是否停止運轉
SUBWF RTCC,W
BTFSC STATUS,C
BSF FLAG,ERRORFLAG ;設置電機異常標志
RETLW 0
;********
;********
;主程序**
;********
;********
MAIN
movlw 0ffh
movwf ra
MOVLW 0f8H ;設置RA口(0,1為輸出,2,3為輸入)
TRIS RA
movlw 07fh
tris rb
MOVLW 07H ;定時器方式,比率為1:256
OPTION
BSF RA,BRAKE ;電機剎車
bsf ra,lock ;制動系統起作用
bsf ra,direction
CLRF TOPLOW
CLRF TOPMED
CLRF TOPHIG
CLRF PULSELOW
CLRF PULSEMED
CLRF PULSEHIG
CLRF BOTTOMLOW
CLRF BOTTOMMED
CLRF BOTTOMHIG
CLRF COUNT1
CLRF COUNT3
CLRF FLAG
btfsc ra,pulsein ;當前輸入是否為低電平
goto mainhigh ;設置當前狀態為高電平
bcf flag,highflag ;設置當前狀態為低電平
goto mainloop
mainhigh
bsf flag,highflag ;設置當前狀態為高電平
MAINLOOP
BTFSC RB,UP
CALL UPSUB ;電機上升
BTFSC RB,DOWN
CALL DOWNSUB ;電機下降
BTFSS RB,CONTINUEUP
CALL CONTINUEUPSUB ;電機持續上升
BTFSS RB,CONTINUEDOWN
CALL CONTINUEDOWNSUB ;電機持續下降
btfsc rb,stop ;停止按鈕按下以調整ERRORFLAG
bcf flag,errorflag
GOTO MAINLOOP
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -