📄 motor.s
字号:
rjmp L47
L61:
lds R24,_adress
lds R25,_adress+1
cpi R24,8
ldi R30,0
cpc R25,R30
breq L52
cpi R24,8
ldi R30,0
cpc R25,R30
brlt L47
L62:
lds R24,_adress
lds R25,_adress+1
cpi R24,12
ldi R30,0
cpc R25,R30
breq L54
cpi R24,14
ldi R30,0
cpc R25,R30
breq L56
cpi R24,16
ldi R30,0
cpc R25,R30
breq L58
rjmp L47
X2:
.dbline 112
L48:
.dbline 112
; {case 0x0000:Data[3]=0xE4;break;
ldi R24,228
sts _Data+3,R24
.dbline 112
rjmp L47
L50:
.dbline 113
; case 0x0004:Data[3]=0xE5;break;
ldi R24,229
sts _Data+3,R24
.dbline 113
rjmp L47
L52:
.dbline 114
; case 0x0008:Data[3]=0xE6;break;
ldi R24,230
sts _Data+3,R24
.dbline 114
rjmp L47
L54:
.dbline 115
; case 0x000C:Data[3]=0xE7;break;
ldi R24,231
sts _Data+3,R24
.dbline 115
rjmp L47
L56:
.dbline 116
; case 0x000E:Data[3]=0xE8;break;
ldi R24,232
sts _Data+3,R24
.dbline 116
rjmp L47
L58:
.dbline 117
ldi R24,233
sts _Data+3,R24
.dbline 117
.dbline 118
L47:
.dbline -2
.dbline 119
; case 0x0010:Data[3]=0xE9;break;
; default :break;}
; }
L39:
adiw R28,2
.dbline 0 ; func end
ret
.dbend
.dbfunc e readdata _readdata fV
; tempdata -> R22
; trandata -> R20,R21
; data -> R20
.even
_readdata::
rcall push_gset2
mov R20,R16
.dbline -1
.dbline 123
;
; //***************************读数据函数****************************//
; void readdata(char data)
; {int trandata;
.dbline 125
; char tempdata;
; if(data==0xE)
cpi R20,14
brne L64
.dbline 126
; Eepromdata();
rcall _Eepromdata
rjmp L65
L64:
.dbline 128
; else
; {switch(data)
.dbline 128
clr R21
cpi R20,1
ldi R30,0
cpc R21,R30
breq L69
cpi R20,2
ldi R30,0
cpc R21,R30
breq L70
cpi R20,3
ldi R30,0
cpc R21,R30
breq L71
rjmp L67
X3:
.dbline 129
L69:
.dbline 129
; {case 1:trandata=TCNT1;break; //读TCNT1
in R20,0x2c
in R21,0x2d
.dbline 129
rjmp L67
L70:
.dbline 130
; case 2:trandata=(int)(tempdata=TCNT0);break;//读TCNT0
in R2,0x32
mov R22,R2
mov R20,R2
clr R21
.dbline 130
rjmp L67
L71:
.dbline 131
; case 3:trandata=GetOutputADC();break;//读A/D转换结果
rcall _GetOutputADC
mov R20,R16
mov R21,R17
.dbline 131
.dbline 132
; default :break;}
L67:
.dbline 133
; Data[6]=(char)trandata;//数据低八位
sts _Data+6,R20
.dbline 134
; Data[7]=(char)(trandata>>8);//数据高八位
mov R2,R20
mov R3,R21
mov R2,R3
clr R3
sbrc R2,7
com R3
sts _Data+7,R2
.dbline 135
; }
L65:
.dbline 136
; Putdata(Data);
ldi R16,<_Data
ldi R17,>_Data
rcall _Putdata
.dbline -2
.dbline 137
; }
L63:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r tempdata 22 c
.dbsym r trandata 20 I
.dbsym r data 20 c
.dbend
.dbfunc e order _order fV
.even
_order::
rcall push_gset1
.dbline -1
.dbline 141
;
; //***************************命令函数******************************//
; void order(void)
; {switch (Data[4])
.dbline 141
lds R20,_Data+4
clr R21
cpi R20,192
ldi R30,0
cpc R21,R30
breq L79
cpi R20,193
ldi R30,0
cpc R21,R30
breq L80
cpi R20,194
ldi R30,0
cpc R21,R30
breq L81
cpi R20,195
ldi R30,0
cpc R21,R30
breq L82
cpi R20,196
ldi R30,0
cpc R21,R30
breq L83
cpi R20,197
ldi R30,0
cpc R21,R30
breq L84
cpi R20,198
ldi R30,0
cpc R21,R30
breq L85
cpi R20,200
ldi R30,0
cpc R21,R30
breq L86
cpi R20,201
ldi R30,0
cpc R21,R30
breq L87
rjmp L76
X4:
.dbline 142
L79:
.dbline 142
; {case 0xC0:PORTB=PORTB|0x04;break; //停止
sbi 0x18,2
.dbline 142
rjmp L76
L80:
.dbline 143
; case 0xC1:PORTB=PORTB&0xFB;break; //启动
in R24,0x18
andi R24,251
out 0x18,R24
.dbline 143
rjmp L76
L81:
.dbline 145
; case 0xC2: //正转
; {PORTB=PORTB&0xFC|0x02;
.dbline 145
in R24,0x18
andi R24,252
ori R24,2
out 0x18,R24
.dbline 146
; PORTD=PORTD&0x3F|0x40;
in R24,0x12
andi R24,63
ori R24,64
out 0x12,R24
.dbline 147
; break;}
rjmp L76
L82:
.dbline 149
; case 0xC3: //反转
; {PORTB=PORTB&0xFC|0x01;
.dbline 149
in R24,0x18
andi R24,252
ori R24,1
out 0x18,R24
.dbline 150
; PORTD=PORTD&0x3F|0x80;
in R24,0x12
andi R24,63
ori R24,128
out 0x12,R24
.dbline 151
; break;}
rjmp L76
L83:
.dbline 152
; case 0xC4:Upspeed();break; //加速
rcall _Upspeed
.dbline 152
rjmp L76
L84:
.dbline 153
; case 0xC5:Downspeed();break; //减速
rcall _Downspeed
.dbline 153
rjmp L76
L85:
.dbline 155
; case 0xC6: //制动
; {PORTB=PORTB|0x03;
.dbline 155
in R24,0x18
ori R24,3
out 0x18,R24
.dbline 156
; PORTD=PORTD&0x3F;
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 157
; break;}
rjmp L76
L86:
.dbline 158
; case 0xC8:flage=1;break; //监控
ldi R24,1
sts _flage,R24
.dbline 158
rjmp L76
L87:
.dbline 159
clr R2
sts _flage,R2
.dbline 159
.dbline 160
L76:
.dbline -2
.dbline 162
; case 0xC9:flage=0;break; //退出监控
; default :break;
; }
; }
L74:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbend
.dbfunc e Datadisposal _Datadisposal fV
; operation -> R20
; temp -> R22,R23
.even
_Datadisposal::
rcall push_gset2
sbiw R28,2
.dbline -1
.dbline 167
;
;
; //***************************数据处理函数**************************//
; void Datadisposal(void)
; {char operation;
.dbline 169
; int temp;
; operation=Data[3];
lds R20,_Data+3
.dbline 170
; temp=Data[4];
lds R22,_Data+4
clr R23
.dbline 171
; temp=temp<<8;
mov R23,R22
clr R22
.dbline 172
; adress=temp+Data[5];
lds R2,_Data+5
clr R3
mov R4,R22
mov R5,R23
add R4,R2
adc R5,R3
sts _adress+1,R5
sts _adress,R4
.dbline 173
; switch(operation&0x0F)
mov R22,R20
clr R23
andi R22,15
andi R23,0
cpi R22,0
cpc R22,R23
breq L95
X5:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L96
cpi R22,2
ldi R30,0
cpc R23,R30
breq L98
rjmp L93
X6:
.dbline 174
L95:
.dbline 174
; {case 0:readdata(operation>>4);break;
mov R16,R20
swap R16
andi R16,#0x0F
rcall _readdata
.dbline 174
rjmp L93
L96:
.dbline 175
; case 1:EEPROMWriteBytes(adress,&Data[6],2);break;
ldi R24,2
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,<_Data+6
ldi R19,>_Data+6
lds R16,_adress
lds R17,_adress+1
rcall _EEPROMWriteBytes
.dbline 175
rjmp L93
L98:
.dbline 176
rcall _order
.dbline 176
.dbline 177
L93:
.dbline -2
.dbline 179
; case 2:order();break;
; default :break;
; }
; }
L88:
adiw R28,2
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r operation 20 c
.dbsym r temp 22 I
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 183
;
; //***************************主函数********************************//
; void main()
; {USARTInit(25); //初始化串口
.dbline 183
ldi R16,25
ldi R17,0
rcall _USARTInit
.dbline 184
; TCNT1=00; //定时器1初始化
clr R2
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 185
; TCCR1B=0x06;
ldi R24,6
out 0x2e,R24
.dbline 186
; DDRB=0x0F; //I/O口初始化
ldi R24,15
out 0x17,R24
.dbline 187
; DDRD=0xC0;
ldi R24,192
out 0x11,R24
.dbline 188
; TIMSK=0x40; //中断初始化
ldi R24,64
out 0x39,R24
.dbline 189
; OCR2 = 0x0F; //PWM初始化
ldi R24,15
out 0x23,R24
.dbline 190
; TCCR2=0x72;
ldi R24,114
out 0x25,R24
.dbline 191
; PORTB=PORTB&0xFC|0x01;
in R24,0x18
andi R24,252
ori R24,1
out 0x18,R24
.dbline 192
; PORTD=PORTD&0x3F|0x80;
in R24,0x12
andi R24,63
ori R24,128
out 0x12,R24
.dbline 193
; SEI();
sei
L100:
.dbline 194
.dbline 194
L101:
.dbline 194
rjmp L100
X7:
.dbline -2
.dbline 195
; do{} while(1); //等待中断
; }
L99:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 22
rjmp _UART_RXC
.area text(rom, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
.dbfunc e UART_RXC _UART_RXC fV
; i -> R20
.even
_UART_RXC::
rcall push_lset
rcall push_gset1
.dbline -1
.dbline 200
;
; //***************************串行接收中断服务程序******************//
; #pragma interrupt_handler UART_RXC:12
; void UART_RXC(void)
; {char i=0;
.dbline 200
clr R20
.dbline 201
; CLI();
cli
.dbline 202
; Data[0]=UDR;
in R2,0xc
sts _Data,R2
.dbline 203
; if(Data[0]==0x55) //起始位检测
mov R24,R2
cpi R24,85
brne L104
.dbline 204
; {do
.dbline 205
L109:
.dbline 205
L110:
.dbline 205
; {while(!(USR&(1<<RXC)));
sbis 0xb,7
rjmp L109
.dbline 206
; i++;
inc R20
.dbline 207
; Data[i]=UDR;
ldi R24,<_Data
ldi R25,>_Data
mov R30,R20
clr R31
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 208
; if(i==9)
cpi R20,9
brne L112
.dbline 209
rjmp L108
L112:
.dbline 209
L107:
.dbline 209
; break;} while(1);
rjmp L110
L108:
.dbline 210
; if((Data[8]==0xFE)&&(Data[9]==0xFF)) //检测结束位
lds R24,_Data+8
cpi R24,254
brne L114
lds R24,_Data+9
cpi R24,255
brne L114
.dbline 211
rcall _Datadisposal
L114:
.dbline 211
; Datadisposal();}
L104:
.dbline 212
; SEI();
sei
.dbline -2
.dbline 213
; }
L103:
rcall pop_gset1
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym r i 20 c
.dbend
.area vector(rom, abs)
.org 8
rjmp _TIM2_OVF
.area text(rom, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
.dbfunc e TIM2_OVF _TIM2_OVF fV
.even
_TIM2_OVF::
rcall push_lset
sbiw R28,2
.dbline -1
.dbline 218
;
; //***************************定时器2中断服务程序*******************//
; #pragma interrupt_handler TIM2_OVF:5
; void TIM2_OVF(void)
; {CLI();
.dbline 218
cli
.dbline 219
; EEPROMReadBytes(0x000C,&itime,2);//读采样次数
ldi R24,2
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,<_itime
ldi R19,>_itime
ldi R16,12
ldi R17,0
rcall _EEPROMReadBytes
.dbline 220
; a++;
lds R24,_a
lds R25,_a+1
adiw R24,1
sts _a+1,R25
sts _a,R24
.dbline 221
; if(a==itime) //时间窗口判断,
lds R2,_itime
lds R3,_itime+1
cp R24,R2
cpc R25,R3
brne L119
.dbline 222
; {a = 0;
.dbline 222
clr R2
clr R3
sts _a+1,R3
sts _a,R2
.dbline 223
; PIDB();}
rcall _PIDB
.dbline 223
L119:
.dbline 224
; SEI();
sei
.dbline -2
.dbline 225
; }
L118:
adiw R28,2
rcall pop_lset
.dbline 0 ; func end
reti
.dbend
.area bss(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c
_intxin::
.blkb 2
.dbsym e intxin _intxin X
_floatxin::
.blkb 4
.dbsym e floatxin _floatxin X
_itime::
.blkb 2
.dbsym e itime _itime I
_t::
.blkb 4
.dbsym e t _t D
_a::
.blkb 2
.dbsym e a _a I
_adress::
.blkb 2
.dbsym e adress _adress I
_Data::
.blkb 10
.dbsym e Data _Data A[10:10]c
.area lit(rom, con, rel)
L27:
.word 0x0,0x40a0
L26:
.word 0x0,0x437f
L23:
.word 0xb185,0x3905
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -