📄 boat.lis
字号:
026A .dbsym r i 22 c
026A .dbend
026A .dbfunc e init_devices _init_devices fV
.even
026A _init_devices::
026A .dbline -1
026A .dbline 203
026A ;
026A ; //call this routine to initialise all peripherals
026A ; void init_devices(void)
026A ; {
026A .dbline 205
026A ; //stop errant interrupts until set up
026A ; CLI(); //disable all interrupts
026A F894 cli
026C .dbline 206
026C ; port_init();
026C 20DF xcall _port_init
026E .dbline 207
026E ; timer1_init();
026E 2DDF xcall _timer1_init
0270 .dbline 208
0270 ; timer2_init();
0270 3BDF xcall _timer2_init
0272 .dbline 209
0272 ; uart0_init();
0272 44DF xcall _uart0_init
0274 .dbline 211
0274 ;
0274 ; MCUCR = 0x00;
0274 2224 clr R2
0276 25BE out 0x35,R2
0278 .dbline 212
0278 ; GICR = 0x00;
0278 2BBE out 0x3b,R2
027A .dbline 213
027A ; TIMSK = 0x40; //timer interrupt sources
027A 80E4 ldi R24,64
027C 89BF out 0x39,R24
027E .dbline 214
027E ; SEI(); //re-enable interrupts
027E 7894 sei
0280 .dbline -2
0280 .dbline 216
0280 ; //all peripherals are now initialised
0280 ; }
0280 L64:
0280 .dbline 0 ; func end
0280 0895 ret
0282 .dbend
0282 .dbfunc e pwm_ctrler _pwm_ctrler fV
0282 .dbstruct 0 12 _trap
0282 .dbfield 0 des_speed I
0282 .dbfield 2 real_speed I
0282 .dbfield 4 acce_count i
0282 .dbfield 6 dece_count i
0282 .dbfield 8 counter i
0282 .dbfield 10 step I
0282 .dbend
0282 ; pt_r -> R18,R19
0282 ; pt_l -> R16,R17
.even
0282 _pwm_ctrler::
0282 .dbline -1
0282 .dbline 222
0282 ;
0282 ; /**************************** PWM调速控制模块 ********************************/
0282 ;
0282 ; //PWM控制器,电机控制的底层操作代码
0282 ; void pwm_ctrler( trap *pt_l, trap *pt_r )
0282 ; {
0282 .dbline 224
0282 ; //左电机加减速梯形图控制器
0282 ; if ( OCR1A <= pt_l->step ) //当速度减少到一定值时
0282 F801 movw R30,R16
0284 2284 ldd R2,z+10
0286 3384 ldd R3,z+11
0288 4AB4 in R4,0x2a
028A 5BB4 in R5,0x2b
028C 2414 cp R2,R4
028E 3504 cpc R3,R5
0290 08F4 brsh X5
0292 4FC0 xjmp L66
0294 X5:
0294 .dbline 225
0294 ; {
0294 .dbline 226
0294 ; OCR1A = pt_l->step; //保持,高频润滑
0294 F801 movw R30,R16
0296 2284 ldd R2,z+10
0298 3384 ldd R3,z+11
029A 3BBC out 0x2b,R3
029C 2ABC out 0x2a,R2
029E .dbline 227
029E ; if ( pt_l->des_speed == 0 ){ //当期望值为0时的处理
029E F801 movw R30,R16
02A0 2080 ldd R2,z+0
02A2 3180 ldd R3,z+1
02A4 2220 tst R2
02A6 49F4 brne L68
02A8 3320 tst R3
02AA 39F4 brne L68
02AC X3:
02AC .dbline 227
02AC .dbline 228
02AC ; pt_l->real_speed = 0;
02AC 2224 clr R2
02AE 3324 clr R3
02B0 F801 movw R30,R16
02B2 3382 std z+3,R3
02B4 2282 std z+2,R2
02B6 .dbline 229
02B6 ; SET_L_DIR;
02B6 C09A sbi 0x18,0
02B8 .dbline 230
02B8 BDC0 xjmp L67
02BA L68:
02BA .dbline 230
02BA ; } else{
02BA .dbline 231
02BA ; if ( pt_l->des_speed > 0 ) SET_L_DIR;
02BA 2224 clr R2
02BC 3324 clr R3
02BE F801 movw R30,R16
02C0 4080 ldd R4,z+0
02C2 5180 ldd R5,z+1
02C4 2414 cp R2,R4
02C6 3504 cpc R3,R5
02C8 14F4 brge L70
02CA .dbline 231
02CA C09A sbi 0x18,0
02CC 01C0 xjmp L71
02CE L70:
02CE .dbline 232
02CE ; else RST_L_DIR;
02CE C098 cbi 0x18,0
02D0 L71:
02D0 .dbline 233
02D0 ; if ( ++ pt_l->counter >= 400 ){
02D0 C801 movw R24,R16
02D2 0896 adiw R24,8
02D4 FC01 movw R30,R24
02D6 8081 ldd R24,z+0
02D8 9181 ldd R25,z+1
02DA 0196 adiw R24,1
02DC 2C01 movw R4,R24
02DE 5182 std z+1,R5
02E0 4082 std z+0,R4
02E2 8039 cpi R24,144
02E4 E1E0 ldi R30,1
02E6 9E07 cpc R25,R30
02E8 08F4 brsh X6
02EA A4C0 xjmp L67
02EC X6:
02EC .dbline 233
02EC .dbline 234
02EC ; DDRD |= BIT(PD5); //刷新PD5为输出
02EC 8D9A sbi 0x11,5
02EE .dbline 235
02EE ; OCR1A = pt_l->step + 1;
02EE F801 movw R30,R16
02F0 8285 ldd R24,z+10
02F2 9385 ldd R25,z+11
02F4 0196 adiw R24,1
02F6 9BBD out 0x2b,R25
02F8 8ABD out 0x2a,R24
02FA .dbline 236
02FA ; if( pt_l->des_speed > 0 ) pt_l->real_speed = (int)(OCR1A); //需要强制类型转换吗?
02FA 2224 clr R2
02FC 3324 clr R3
02FE F801 movw R30,R16
0300 4080 ldd R4,z+0
0302 5180 ldd R5,z+1
0304 2414 cp R2,R4
0306 3504 cpc R3,R5
0308 2CF4 brge L74
030A .dbline 236
030A 2AB4 in R2,0x2a
030C 3BB4 in R3,0x2b
030E 3382 std z+3,R3
0310 2282 std z+2,R2
0312 09C0 xjmp L75
0314 L74:
0314 .dbline 237
0314 ; else pt_l->real_speed = -(int)(OCR1A);
0314 8AB5 in R24,0x2a
0316 9BB5 in R25,0x2b
0318 8095 com R24
031A 9095 com R25
031C 8F5F subi R24,0xFF
031E 9F4F sbci R25,0xFF
0320 F801 movw R30,R16
0322 9383 std z+3,R25
0324 8283 std z+2,R24
0326 L75:
0326 .dbline 238
0326 ; pt_l->counter = 0; //定时计数器清零
0326 2224 clr R2
0328 3324 clr R3
032A F801 movw R30,R16
032C 3186 std z+9,R3
032E 2086 std z+8,R2
0330 .dbline 239
0330 ; }
0330 .dbline 240
0330 ; }
0330 .dbline 241
0330 81C0 xjmp L67
0332 L66:
0332 .dbline 241
0332 ; } else if ( pt_l->real_speed < pt_l->des_speed ){
0332 F801 movw R30,R16
0334 2080 ldd R2,z+0
0336 3180 ldd R3,z+1
0338 4280 ldd R4,z+2
033A 5380 ldd R5,z+3
033C 4214 cp R4,R2
033E 5304 cpc R5,R3
0340 0CF0 brlt X7
0342 38C0 xjmp L76
0344 X7:
0344 .dbline 241
0344 .dbline 242
0344 ; if ( ++ pt_l->counter == pt_l->acce_count ){
0344 C801 movw R24,R16
0346 0896 adiw R24,8
0348 FC01 movw R30,R24
034A 8081 ldd R24,z+0
034C 9181 ldd R25,z+1
034E 0196 adiw R24,1
0350 2C01 movw R4,R24
0352 5182 std z+1,R5
0354 4082 std z+0,R4
0356 F801 movw R30,R16
0358 2480 ldd R2,z+4
035A 3580 ldd R3,z+5
035C 8215 cp R24,R2
035E 9305 cpc R25,R3
0360 09F0 breq X8
0362 68C0 xjmp L77
0364 X8:
0364 .dbline 242
0364 .dbline 243
0364 ; pt_l->real_speed += pt_l->step; //加速梯形图
0364 C801 movw R24,R16
0366 0296 adiw R24,2
0368 F801 movw R30,R16
036A 4284 ldd R4,z+10
036C 5384 ldd R5,z+11
036E FC01 movw R30,R24
0370 6080 ldd R6,z+0
0372 7180 ldd R7,z+1
0374 640C add R6,R4
0376 751C adc R7,R5
0378 7182 std z+1,R7
037A 6082 std z+0,R6
037C .dbline 244
037C ; if ( pt_l->real_speed < 0 ){ //取绝对值
037C F801 movw R30,R16
037E 8281 ldd R24,z+2
0380 9381 ldd R25,z+3
0382 8030 cpi R24,0
0384 E0E0 ldi R30,0
0386 9E07 cpc R25,R30
0388 54F4 brge L80
038A .dbline 244
038A .dbline 245
038A ; OCR1A = (uint)(-pt_l->real_speed);
038A F801 movw R30,R16
038C 8281 ldd R24,z+2
038E 9381 ldd R25,z+3
0390 8095 com R24
0392 9095 com R25
0394 8F5F subi R24,0xFF
0396 9F4F sbci R25,0xFF
0398 9BBD out 0x2b,R25
039A 8ABD out 0x2a,R24
039C .dbline 246
039C 05C0 xjmp L81
039E L80:
039E .dbline 246
039E ; } else {
039E .dbline 247
039E ; OCR1A = (uint)(pt_l->real_speed);
039E F801 movw R30,R16
03A0 2280 ldd R2,z+2
03A2 3380 ldd R3,z+3
03A4 3BBC out 0x2b,R3
03A6 2ABC out 0x2a,R2
03A8 .dbline 248
03A8 ; }
03A8 L81:
03A8 .dbline 249
03A8 ; pt_l->counter = 0; //计数器清零
03A8 2224 clr R2
03AA 3324 clr R3
03AC F801 movw R30,R16
03AE 3186 std z+9,R3
03B0 2086 std z+8,R2
03B2 .dbline 250
03B2 ; }
03B2 .dbline 251
03B2 40C0 xjmp L77
03B4 L76:
03B4 .dbline 251
03B4 ; } else if( pt_l->real_speed > pt_l->des_speed ){
03B4 F801 movw R30,R16
03B6 2080 ldd R2,z+0
03B8 3180 ldd R3,z+1
03BA 4280 ldd R4,z+2
03BC 5380 ldd R5,z+3
03BE 2414 cp R2,R4
03C0 3504 cpc R3,R5
03C2 0CF0 brlt X9
03C4 37C0 xjmp L82
03C6 X9:
03C6 .dbline 251
03C6 .dbline 252
03C6 ; if ( ++ pt_l->counter == pt_l->dece_count ){
03C6 C801 movw R24,R16
03C8 0896 adiw R24,8
03CA FC01 movw R30,R24
03CC 8081 ldd R24,z+0
03CE 9181 ldd R25,z+1
03D0 0196 adiw R24,1
03D2 2C01 movw R4,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -