📄 motor.s
字号:
.module motor.c
.area data(ram, con, rel)
L5:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L6:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area text(rom, con, rel)
.dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\motor.c
.dbfunc e Motor _Motor fV
.dbsym s KeyTemp L6 c
.dbsym s KeyLast L5 c
.even
_Motor::
xcall push_gset5
sbiw R28,4
.dbline -1
.dbline 26
;
; ///////////////////////////////////////////////////////////////
; /**************************************************************
;
; 公司名称: 扬州恒博科技
; 模块名 : 点动型STQ执行机构主控程序
; 创建人 : 章俭文
; 日期 : 2008/08/19
; 功能描述: 完成对本地旋钮和远程开关量的控制功能
; 其它说明: 编译环境为ICCAVR V6.31A
; 版本 : V1.0
;
; **************************************************************/
; ///////////////////////////////////////////////////////////////
;
; #define MOTOR_GLOBAL
; #include "motor.h"
;
; static void MotorLocal(void); //本地控制
; static void MotorRemote3(void); //远程三线制
; static void MotorRemote4(void); //远程四线制
;
;
;
; void Motor(void) //电机任务
; {
.dbline 30
; //一个任务周期的信号消抖动
; static uchar KeyLast = 0, KeyTemp = 0;
;
; KeyTemp = (GetLocalClose()|GetLocalOpen()<<1|GetLocal()<<2|GetRemote()<<3|\
sbic 0x13,6
rjmp L7
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
xjmp L8
L7:
clr R0
clr R1
std y+3,R1
std y+2,R0
L8:
sbic 0x13,7
rjmp L9
ldi R24,1
ldi R25,0
std y+1,R25
std y+0,R24
xjmp L10
L9:
clr R0
clr R1
std y+1,R1
std y+0,R0
L10:
sbic 0x19,6
rjmp L11
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L12
L11:
clr R14
clr R15
L12:
sbic 0x19,5
rjmp L13
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L14
L13:
clr R12
clr R13
L14:
sbic 0x10,3
rjmp L15
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L16
L15:
clr R10
clr R11
L16:
sbic 0x10,4
rjmp L17
ldi R22,1
ldi R23,0
xjmp L18
L17:
clr R22
clr R23
L18:
sbic 0x10,5
rjmp L19
ldi R20,1
ldi R21,0
xjmp L20
L19:
clr R20
clr R21
L20:
ldd R2,y+0
ldd R3,y+1
lsl R2
rol R3
ldd R4,y+2
ldd R5,y+3
or R4,R2
or R5,R3
movw R2,R14
lsl R2
rol R3
lsl R2
rol R3
or R4,R2
or R5,R3
movw R2,R12
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
or R4,R2
or R5,R3
movw R2,R10
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
or R4,R2
or R5,R3
ldi R18,5
ldi R19,0
movw R16,R22
xcall lsl16
or R4,R16
or R5,R17
ldi R18,6
ldi R19,0
movw R16,R20
xcall lsl16
or R4,R16
or R5,R17
sts L6,R4
xjmp L22
L21:
.dbline 36
; GetRemoteStop()<<4|GetRemoteClose()<<5|GetRemoteOpen()<<6);
;
; //当有信号时消抖动
; while(GetLocalClose()||GetLocalOpen()||GetLocal()||GetRemote()||\
; GetRemoteStop()||GetRemoteClose()||GetRemoteOpen())
; {
.dbline 37
; if(KeyTemp == KeyLast) break; //如两次电机任务扫描键值相等,跳出并执行后面代码
lds R2,L5
lds R3,L6
cp R3,R2
brne L24
.dbline 37
xjmp L23
L24:
.dbline 39
.dbline 40
lds R2,L6
sts L5,R2
.dbline 41
xjmp L4
L22:
.dbline 34
sbis 0x13,6
rjmp L21
sbis 0x13,7
rjmp L21
sbis 0x19,6
rjmp L21
sbis 0x19,5
rjmp L21
sbis 0x10,3
rjmp L21
sbis 0x10,4
rjmp L21
sbis 0x10,5
rjmp L21
L23:
.dbline 45
; else
; {
; KeyLast = KeyTemp; //保存上次扫描键值
; return;
; }
; }
;
; if(KeyTemp == 0)StopMotor(); //所有信号丢失时关电机保护
lds R2,L6
tst R2
brne L26
.dbline 45
xcall _StopMotor
L26:
.dbline 47
;
; ProtectMotor(); //电机过热、限位保护
xcall _ProtectMotor
.dbline 49
;
; if( GetLocal()&&(!GetRemote())) //本地控制
sbic 0x19,6
rjmp L28
sbis 0x19,5
rjmp L28
.dbline 50
; {
.dbline 51
; SetLocalLed();
cbi 0x18,5
.dbline 52
; ClrRemoteLed();
sbi 0x18,6
.dbline 54
;
; if(ControlFlag != IN_LOCAL) //控制状态转换
lds R24,_ControlFlag
cpi R24,1
breq L30
.dbline 55
; {
.dbline 56
; StopMotor();
xcall _StopMotor
.dbline 57
; ControlFlag = IN_LOCAL;
ldi R24,1
sts _ControlFlag,R24
.dbline 58
; }
L30:
.dbline 60
;
; MotorLocal();
xcall _MotorLocal
.dbline 61
; }
L28:
.dbline 64
;
; //远程三线制
; if( (!GetLocal()) && GetRemote() && GetRemoteMode() )
sbis 0x19,6
rjmp L32
sbic 0x19,5
rjmp L32
sbis 0x19,0
rjmp L32
.dbline 65
; {
.dbline 66
; ClrLocalLed();
sbi 0x18,5
.dbline 67
; SetRemoteLed();
cbi 0x18,6
.dbline 69
;
; if(ControlFlag != IN_REMOTE3) //控制状态转换
lds R24,_ControlFlag
cpi R24,2
breq L34
.dbline 70
; {
.dbline 71
; StopMotor();
xcall _StopMotor
.dbline 72
; ControlFlag = IN_REMOTE3;
ldi R24,2
sts _ControlFlag,R24
.dbline 73
; }
L34:
.dbline 75
;
; MotorRemote3();
xcall _MotorRemote3
.dbline 76
; }
L32:
.dbline 79
;
; //远程四线制
; if( (!GetLocal()) && GetRemote() && (!GetRemoteMode()) )
sbis 0x19,6
rjmp L36
sbic 0x19,5
rjmp L36
sbic 0x19,0
rjmp L36
.dbline 80
; {
.dbline 81
; ClrLocalLed();
sbi 0x18,5
.dbline 82
; SetRemoteLed();
cbi 0x18,6
.dbline 84
;
; if(ControlFlag != IN_REMOTE4) //控制状态转换
lds R24,_ControlFlag
cpi R24,3
breq L38
.dbline 85
; {
.dbline 86
; StopMotor();
xcall _StopMotor
.dbline 87
; ControlFlag = IN_REMOTE4;
ldi R24,3
sts _ControlFlag,R24
.dbline 88
; }
L38:
.dbline 90
xcall _MotorRemote4
.dbline 91
L36:
.dbline -2
L4:
adiw R28,4
xcall pop_gset5
.dbline 0 ; func end
ret
.dbend
.dbfunc s MotorLocal _MotorLocal fV
.even
_MotorLocal:
.dbline -1
.dbline 97
;
; MotorRemote4();
; }
;
; }//end of 电机任务
;
;
; static void MotorLocal(void) //本地控制
; {
.dbline 98
; if(GetLocalOpen()&&!GetLocalClose()) //本地开
sbic 0x13,7
rjmp L41
sbis 0x13,6
rjmp L41
.dbline 99
; {
.dbline 100
; if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
xcall _GetLimitOpen
tst R16
brne L43
sbic 0x19,2
rjmp L43
lds R24,_MotorFlag
cpi R24,1
breq L43
.dbline 101
; {
.dbline 102
; OpenMotor(); //开电机
xcall _OpenMotor
.dbline 103
; }
L43:
.dbline 106
;
;
; }
L41:
.dbline 108
;
; if(GetLocalClose()&&!GetLocalOpen()) //本地关
sbic 0x13,6
rjmp L45
sbis 0x13,7
rjmp L45
.dbline 109
; {
.dbline 110
; if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
xcall _GetLimitClose
tst R16
brne L47
sbic 0x19,2
rjmp L47
lds R24,_MotorFlag
cpi R24,2
breq L47
.dbline 111
; {
.dbline 112
; CloseMotor();
xcall _CloseMotor
.dbline 113
; }
L47:
.dbline 114
L45:
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbend
.dbfunc s MotorRemote3 _MotorRemote3 fV
.even
_MotorRemote3:
.dbline -1
.dbline 120
; }
;
; }//edd of 本地控制
;
;
; static void MotorRemote3(void) //远程三线制
; {
.dbline 121
; if(GetRemoteOpen()&&!GetRemoteClose()) //远程三线开
sbic 0x10,5
rjmp L50
sbis 0x10,4
rjmp L50
.dbline 122
; {
.dbline 123
; if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
xcall _GetLimitOpen
tst R16
brne L52
sbic 0x19,2
rjmp L52
lds R24,_MotorFlag
cpi R24,1
breq L52
.dbline 124
; {
.dbline 125
; OpenMotor();
xcall _OpenMotor
.dbline 126
; }
L52:
.dbline 127
; }
L50:
.dbline 129
;
; if(GetRemoteClose()&&!GetRemoteOpen()) //远程三线关
sbic 0x10,4
rjmp L54
sbis 0x10,5
rjmp L54
.dbline 130
; {
.dbline 131
; if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
xcall _GetLimitClose
tst R16
brne L56
sbic 0x19,2
rjmp L56
lds R24,_MotorFlag
cpi R24,2
breq L56
.dbline 132
; {
.dbline 133
; CloseMotor();
xcall _CloseMotor
.dbline 134
; }
L56:
.dbline 136
L54:
.dbline -2
L49:
.dbline 0 ; func end
ret
.dbend
.dbfunc s MotorRemote4 _MotorRemote4 fV
.even
_MotorRemote4:
.dbline -1
.dbline 143
;
; }
; }
;
;
;
;
; static void MotorRemote4(void) //远程四线制
; {
.dbline 144
; if(GetRemoteStop()) //远程四线停
sbic 0x10,3
rjmp L59
.dbline 145
; {
.dbline 146
; StopMotor();
xcall _StopMotor
.dbline 147
; }
L59:
.dbline 149
; //远程四线开
; if(GetRemoteOpen()&&!GetRemoteClose()&&!GetRemoteStop())
sbic 0x10,5
rjmp L61
sbis 0x10,4
rjmp L61
sbis 0x10,3
rjmp L61
.dbline 150
; {
.dbline 151
; if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
xcall _GetLimitOpen
tst R16
brne L63
sbic 0x19,2
rjmp L63
lds R24,_MotorFlag
cpi R24,1
breq L63
.dbline 152
; {
.dbline 153
; OpenMotor();
xcall _OpenMotor
.dbline 154
; }
L63:
.dbline 155
; }
L61:
.dbline 157
; //远程四线关
; if(GetRemoteClose()&&!GetRemoteOpen()&&!GetRemoteStop())
sbic 0x10,4
rjmp L65
sbis 0x10,5
rjmp L65
sbis 0x10,3
rjmp L65
.dbline 158
; {
.dbline 159
; if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
xcall _GetLimitClose
tst R16
brne L67
sbic 0x19,2
rjmp L67
lds R24,_MotorFlag
cpi R24,2
breq L67
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -