📄 boat.s
字号:
L62:
.dbline 194
sbis 0xb,5
rjmp L61
.dbline 195
ldi R24,<_tbuf
ldi R25,>_tbuf
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 196
L58:
.dbline 193
inc R22
L60:
.dbline 193
cp R22,R20
brlo L62
.dbline 197
; while( !( UCSRA & BIT( UDRE ) ) );
; UDR = tbuf[i];
; }
; }
L36:
L24:
.dbline 198
; SEI();
sei
.dbline -2
.dbline 199
; }
L22:
xcall pop_gset3
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r command 10 c
.dbsym r dataLen 20 c
.dbsym r i 22 c
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 203
;
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
.dbline 205
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 206
; port_init();
xcall _port_init
.dbline 207
; timer1_init();
xcall _timer1_init
.dbline 208
; timer2_init();
xcall _timer2_init
.dbline 209
; uart0_init();
xcall _uart0_init
.dbline 211
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 212
; GICR = 0x00;
out 0x3b,R2
.dbline 213
; TIMSK = 0x40; //timer interrupt sources
ldi R24,64
out 0x39,R24
.dbline 214
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 216
; //all peripherals are now initialised
; }
L64:
.dbline 0 ; func end
ret
.dbend
.dbfunc e pwm_ctrler _pwm_ctrler fV
.dbstruct 0 12 _trap
.dbfield 0 des_speed I
.dbfield 2 real_speed I
.dbfield 4 acce_count i
.dbfield 6 dece_count i
.dbfield 8 counter i
.dbfield 10 step I
.dbend
; pt_r -> R18,R19
; pt_l -> R16,R17
.even
_pwm_ctrler::
.dbline -1
.dbline 222
;
; /**************************** PWM调速控制模块 ********************************/
;
; //PWM控制器,电机控制的底层操作代码
; void pwm_ctrler( trap *pt_l, trap *pt_r )
; {
.dbline 224
; //左电机加减速梯形图控制器
; if ( OCR1A <= pt_l->step ) //当速度减少到一定值时
movw R30,R16
ldd R2,z+10
ldd R3,z+11
in R4,0x2a
in R5,0x2b
cp R2,R4
cpc R3,R5
brsh X5
xjmp L66
X5:
.dbline 225
; {
.dbline 226
; OCR1A = pt_l->step; //保持,高频润滑
movw R30,R16
ldd R2,z+10
ldd R3,z+11
out 0x2b,R3
out 0x2a,R2
.dbline 227
; if ( pt_l->des_speed == 0 ){ //当期望值为0时的处理
movw R30,R16
ldd R2,z+0
ldd R3,z+1
tst R2
brne L68
tst R3
brne L68
X3:
.dbline 227
.dbline 228
; pt_l->real_speed = 0;
clr R2
clr R3
movw R30,R16
std z+3,R3
std z+2,R2
.dbline 229
; SET_L_DIR;
sbi 0x18,0
.dbline 230
xjmp L67
L68:
.dbline 230
; } else{
.dbline 231
; if ( pt_l->des_speed > 0 ) SET_L_DIR;
clr R2
clr R3
movw R30,R16
ldd R4,z+0
ldd R5,z+1
cp R2,R4
cpc R3,R5
brge L70
.dbline 231
sbi 0x18,0
xjmp L71
L70:
.dbline 232
; else RST_L_DIR;
cbi 0x18,0
L71:
.dbline 233
; if ( ++ pt_l->counter >= 400 ){
movw R24,R16
adiw R24,8
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
movw R4,R24
std z+1,R5
std z+0,R4
cpi R24,144
ldi R30,1
cpc R25,R30
brsh X6
xjmp L67
X6:
.dbline 233
.dbline 234
; DDRD |= BIT(PD5); //刷新PD5为输出
sbi 0x11,5
.dbline 235
; OCR1A = pt_l->step + 1;
movw R30,R16
ldd R24,z+10
ldd R25,z+11
adiw R24,1
out 0x2b,R25
out 0x2a,R24
.dbline 236
; if( pt_l->des_speed > 0 ) pt_l->real_speed = (int)(OCR1A); //需要强制类型转换吗?
clr R2
clr R3
movw R30,R16
ldd R4,z+0
ldd R5,z+1
cp R2,R4
cpc R3,R5
brge L74
.dbline 236
in R2,0x2a
in R3,0x2b
std z+3,R3
std z+2,R2
xjmp L75
L74:
.dbline 237
; else pt_l->real_speed = -(int)(OCR1A);
in R24,0x2a
in R25,0x2b
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
movw R30,R16
std z+3,R25
std z+2,R24
L75:
.dbline 238
; pt_l->counter = 0; //定时计数器清零
clr R2
clr R3
movw R30,R16
std z+9,R3
std z+8,R2
.dbline 239
; }
.dbline 240
; }
.dbline 241
xjmp L67
L66:
.dbline 241
; } else if ( pt_l->real_speed < pt_l->des_speed ){
movw R30,R16
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R4,R2
cpc R5,R3
brlt X7
xjmp L76
X7:
.dbline 241
.dbline 242
; if ( ++ pt_l->counter == pt_l->acce_count ){
movw R24,R16
adiw R24,8
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
movw R4,R24
std z+1,R5
std z+0,R4
movw R30,R16
ldd R2,z+4
ldd R3,z+5
cp R24,R2
cpc R25,R3
breq X8
xjmp L77
X8:
.dbline 242
.dbline 243
; pt_l->real_speed += pt_l->step; //加速梯形图
movw R24,R16
adiw R24,2
movw R30,R16
ldd R4,z+10
ldd R5,z+11
movw R30,R24
ldd R6,z+0
ldd R7,z+1
add R6,R4
adc R7,R5
std z+1,R7
std z+0,R6
.dbline 244
; if ( pt_l->real_speed < 0 ){ //取绝对值
movw R30,R16
ldd R24,z+2
ldd R25,z+3
cpi R24,0
ldi R30,0
cpc R25,R30
brge L80
.dbline 244
.dbline 245
; OCR1A = (uint)(-pt_l->real_speed);
movw R30,R16
ldd R24,z+2
ldd R25,z+3
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
out 0x2b,R25
out 0x2a,R24
.dbline 246
xjmp L81
L80:
.dbline 246
; } else {
.dbline 247
; OCR1A = (uint)(pt_l->real_speed);
movw R30,R16
ldd R2,z+2
ldd R3,z+3
out 0x2b,R3
out 0x2a,R2
.dbline 248
; }
L81:
.dbline 249
; pt_l->counter = 0; //计数器清零
clr R2
clr R3
movw R30,R16
std z+9,R3
std z+8,R2
.dbline 250
; }
.dbline 251
xjmp L77
L76:
.dbline 251
; } else if( pt_l->real_speed > pt_l->des_speed ){
movw R30,R16
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R4
cpc R3,R5
brlt X9
xjmp L82
X9:
.dbline 251
.dbline 252
; if ( ++ pt_l->counter == pt_l->dece_count ){
movw R24,R16
adiw R24,8
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
movw R4,R24
std z+1,R5
std z+0,R4
movw R30,R16
ldd R2,z+6
ldd R3,z+7
cp R24,R2
cpc R25,R3
breq X10
xjmp L84
X10:
.dbline 252
.dbline 253
; pt_l->real_speed -= pt_l->step;
movw R24,R16
adiw R24,2
movw R30,R16
ldd R4,z+10
ldd R5,z+11
movw R30,R24
ldd R6,z+0
ldd R7,z+1
sub R6,R4
sbc R7,R5
std z+1,R7
std z+0,R6
.dbline 254
; if ( pt_l->real_speed < 0 ){ //取绝对值
movw R30,R16
ldd R24,z+2
ldd R25,z+3
cpi R24,0
ldi R30,0
cpc R25,R30
brge L86
.dbline 254
.dbline 255
; OCR1A = (uint)(-pt_l->real_speed);
movw R30,R16
ldd R24,z+2
ldd R25,z+3
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
out 0x2b,R25
out 0x2a,R24
.dbline 256
xjmp L87
L86:
.dbline 256
; } else {
.dbline 257
; OCR1A = (uint)(pt_l->real_speed);
movw R30,R16
ldd R2,z+2
ldd R3,z+3
out 0x2b,R3
out 0x2a,R2
.dbline 258
; }
L87:
.dbline 259
; pt_l->counter = 0;
clr R2
clr R3
movw R30,R16
std z+9,R3
std z+8,R2
.dbline 260
; }
L84:
.dbline 261
; }
L82:
L77:
L67:
.dbline 263
; //右电机加减速梯形图控制器
; if ( OCR1B <= pt_r->step ) //当速度减少到一定值时
movw R30,R18
ldd R2,z+10
ldd R3,z+11
in R4,0x28
in R5,0x29
cp R2,R4
cpc R3,R5
brsh X11
xjmp L88
X11:
.dbline 264
; {
.dbline 265
; OCR1B = pt_r->step; //保持,高频润滑
movw R30,R18
ldd R2,z+10
ldd R3,z+11
out 0x29,R3
out 0x28,R2
.dbline 266
; if ( pt_r->des_speed == 0 ){ //当期望值为0时的处理
movw R30,R18
ldd R2,z+0
ldd R3,z+1
tst R2
brne L90
tst R3
brne L90
X4:
.dbline 266
.dbline 267
; pt_r->real_speed = 0;
clr R2
clr R3
movw R30,R18
std z+3,R3
std z+2,R2
.dbline 268
; SET_R_DIR;
sbi 0x18,1
.dbline 269
xjmp L89
L90:
.dbline 269
; } else{
.dbline 270
; if ( pt_r->des_speed > 0 ) SET_R_DIR;
clr R2
clr R3
movw R30,R18
ldd R4,z+0
ldd R5,z+1
cp R2,R4
cpc R3,R5
brge L92
.dbline 270
sbi 0x18,1
xjmp L93
L92:
.dbline 271
; else RST_R_DIR;
cbi 0x18,1
L93:
.dbline 272
; if ( ++ pt_r->counter >= 400 ){
movw R24,R18
adiw R24,8
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
movw R4,R24
std z+1,R5
std z+0,R4
cpi R24,144
ldi R30,1
cpc R25,R30
brsh X12
xjmp L89
X12:
.dbline 272
.dbline 273
; DDRD |= BIT(PD4); //刷新PD5为输出
sbi 0x11,4
.dbline 274
; OCR1B = pt_r->step + 1;
movw R30,R18
ldd R24,z+10
ldd R25,z+11
adiw R24,1
out 0x29,R25
out 0x28,R24
.dbline 275
; if( pt_r->des_speed > 0 ) pt_r->real_speed = (int)(OCR1B); //需要强制类型转换吗?
clr R2
clr R3
movw R30,R18
ldd R4,z+0
ldd R5,z+1
cp R2,R4
cpc R3,R5
brge L96
.dbline 275
in R2,0x28
in R3,0x29
std z+3,R3
std z+2,R2
xjmp L97
L96:
.dbline 276
; else pt_r->real_speed = -(int)(OCR1B);
in R24,0x28
in R25,0x29
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
movw R30,R18
std z+3,R25
std z+2,R24
L97:
.dbline 277
; pt_r->counter = 0; //定时计数器清零
clr R2
clr R3
movw R30,R18
std z+9,R3
std z+8,R2
.dbline 278
; }
.dbline 279
; }
.dbline 280
xjmp L89
L88:
.dbline 280
; } else if ( pt_r->real_speed < pt_r->des_speed ){
movw R30,R18
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R4,R2
cpc R5,R3
brlt X13
xjmp L98
X13:
.dbline 280
.dbline 281
; if ( ++ pt_r->counter == pt_r->acce_count ){
movw R24,R18
adiw R24,8
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
movw R4,R24
std z+1,R5
std z+0,R4
movw R30,R18
ldd R2,z+4
ldd R3,z+5
cp R24,R2
cpc R25,R3
breq X14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -