📄 boat.lst
字号:
016F 8020 LDD R2,Z+0
0170 B82C OUT 0x0C,R2
0171 9563 INC R22
0172 1764 CP R22,R20
0173 F398 BCS 0x0167
(0196) }
(0197) }
(0198) SEI();
0174 9478 BSET 7
(0199) }
0175 940E045F CALL pop_gset3
0177 940E0498 CALL pop_lset
0179 9518 RETI
(0200)
(0201) //call this routine to initialise all peripherals
(0202) void init_devices(void)
(0203) {
(0204) //stop errant interrupts until set up
(0205) CLI(); //disable all interrupts
_init_devices:
017A 94F8 BCLR 7
(0206) port_init();
017B DF20 RCALL _port_init
(0207) timer1_init();
017C DF2D RCALL _timer1_init
(0208) timer2_init();
017D DF3B RCALL _timer2_init
(0209) uart0_init();
017E DF44 RCALL _uart0_init
(0210)
(0211) MCUCR = 0x00;
017F 2422 CLR R2
0180 BE25 OUT 0x35,R2
(0212) GICR = 0x00;
0181 BE2B OUT 0x3B,R2
(0213) TIMSK = 0x40; //timer interrupt sources
0182 E480 LDI R24,0x40
0183 BF89 OUT 0x39,R24
(0214) SEI(); //re-enable interrupts
0184 9478 BSET 7
(0215) //all peripherals are now initialised
(0216) }
0185 9508 RET
(0217)
(0218) /**************************** PWM调速控制模块 ********************************/
(0219)
(0220) //PWM控制器,电机控制的底层操作代码
(0221) void pwm_ctrler( trap *pt_l, trap *pt_r )
(0222) {
(0223) //左电机加减速梯形图控制器
(0224) if ( OCR1A <= pt_l->step ) //当速度减少到一定值时
_pwm_ctrler:
pt_r --> R18
pt_l --> R16
0186 01F8 MOVW R30,R16
0187 8422 LDD R2,Z+10
0188 8433 LDD R3,Z+11
0189 B44A IN R4,0x2A
018A B45B IN R5,0x2B
018B 1424 CP R2,R4
018C 0435 CPC R3,R5
018D F408 BCC 0x018F
018E C04F RJMP 0x01DE
(0225) {
(0226) OCR1A = pt_l->step; //保持,高频润滑
018F 01F8 MOVW R30,R16
0190 8422 LDD R2,Z+10
0191 8433 LDD R3,Z+11
0192 BC3B OUT 0x2B,R3
0193 BC2A OUT 0x2A,R2
(0227) if ( pt_l->des_speed == 0 ){ //当期望值为0时的处理
0194 01F8 MOVW R30,R16
0195 8020 LDD R2,Z+0
0196 8031 LDD R3,Z+1
0197 2022 TST R2
0198 F449 BNE 0x01A2
0199 2033 TST R3
019A F439 BNE 0x01A2
(0228) pt_l->real_speed = 0;
019B 2422 CLR R2
019C 2433 CLR R3
019D 01F8 MOVW R30,R16
019E 8233 STD Z+3,R3
019F 8222 STD Z+2,R2
(0229) SET_L_DIR;
01A0 9AC0 SBI 0x18,0
(0230) } else{
01A1 C0BD RJMP 0x025F
(0231) if ( pt_l->des_speed > 0 ) SET_L_DIR;
01A2 2422 CLR R2
01A3 2433 CLR R3
01A4 01F8 MOVW R30,R16
01A5 8040 LDD R4,Z+0
01A6 8051 LDD R5,Z+1
01A7 1424 CP R2,R4
01A8 0435 CPC R3,R5
01A9 F414 BGE 0x01AC
01AA 9AC0 SBI 0x18,0
01AB C001 RJMP 0x01AD
(0232) else RST_L_DIR;
01AC 98C0 CBI 0x18,0
(0233) if ( ++ pt_l->counter >= 400 ){
01AD 01C8 MOVW R24,R16
01AE 9608 ADIW R24,0x8
01AF 01FC MOVW R30,R24
01B0 8180 LDD R24,Z+0
01B1 8191 LDD R25,Z+1
01B2 9601 ADIW R24,1
01B3 012C MOVW R4,R24
01B4 8251 STD Z+1,R5
01B5 8240 STD Z+0,R4
01B6 3980 CPI R24,0x90
01B7 E0E1 LDI R30,1
01B8 079E CPC R25,R30
01B9 F408 BCC 0x01BB
01BA C0A4 RJMP 0x025F
(0234) DDRD |= BIT(PD5); //刷新PD5为输出
01BB 9A8D SBI 0x11,5
(0235) OCR1A = pt_l->step + 1;
01BC 01F8 MOVW R30,R16
01BD 8582 LDD R24,Z+10
01BE 8593 LDD R25,Z+11
01BF 9601 ADIW R24,1
01C0 BD9B OUT 0x2B,R25
01C1 BD8A OUT 0x2A,R24
(0236) if( pt_l->des_speed > 0 ) pt_l->real_speed = (int)(OCR1A); //需要强制类型转换吗?
01C2 2422 CLR R2
01C3 2433 CLR R3
01C4 01F8 MOVW R30,R16
01C5 8040 LDD R4,Z+0
01C6 8051 LDD R5,Z+1
01C7 1424 CP R2,R4
01C8 0435 CPC R3,R5
01C9 F42C BGE 0x01CF
01CA B42A IN R2,0x2A
01CB B43B IN R3,0x2B
01CC 8233 STD Z+3,R3
01CD 8222 STD Z+2,R2
01CE C009 RJMP 0x01D8
(0237) else pt_l->real_speed = -(int)(OCR1A);
01CF B58A IN R24,0x2A
01D0 B59B IN R25,0x2B
01D1 9580 COM R24
01D2 9590 COM R25
01D3 5F8F SUBI R24,0xFF
01D4 4F9F SBCI R25,0xFF
01D5 01F8 MOVW R30,R16
01D6 8393 STD Z+3,R25
01D7 8382 STD Z+2,R24
(0238) pt_l->counter = 0; //定时计数器清零
01D8 2422 CLR R2
01D9 2433 CLR R3
01DA 01F8 MOVW R30,R16
01DB 8631 STD Z+9,R3
01DC 8620 STD Z+8,R2
(0239) }
(0240) }
(0241) } else if ( pt_l->real_speed < pt_l->des_speed ){
01DD C081 RJMP 0x025F
01DE 01F8 MOVW R30,R16
01DF 8020 LDD R2,Z+0
01E0 8031 LDD R3,Z+1
01E1 8042 LDD R4,Z+2
01E2 8053 LDD R5,Z+3
01E3 1442 CP R4,R2
01E4 0453 CPC R5,R3
01E5 F00C BLT 0x01E7
01E6 C038 RJMP 0x021F
(0242) if ( ++ pt_l->counter == pt_l->acce_count ){
01E7 01C8 MOVW R24,R16
01E8 9608 ADIW R24,0x8
01E9 01FC MOVW R30,R24
01EA 8180 LDD R24,Z+0
01EB 8191 LDD R25,Z+1
01EC 9601 ADIW R24,1
01ED 012C MOVW R4,R24
01EE 8251 STD Z+1,R5
01EF 8240 STD Z+0,R4
01F0 01F8 MOVW R30,R16
01F1 8024 LDD R2,Z+4
01F2 8035 LDD R3,Z+5
01F3 1582 CP R24,R2
01F4 0593 CPC R25,R3
01F5 F009 BEQ 0x01F7
01F6 C068 RJMP 0x025F
(0243) pt_l->real_speed += pt_l->step; //加速梯形图
01F7 01C8 MOVW R24,R16
01F8 9602 ADIW R24,2
01F9 01F8 MOVW R30,R16
01FA 8442 LDD R4,Z+10
01FB 8453 LDD R5,Z+11
01FC 01FC MOVW R30,R24
01FD 8060 LDD R6,Z+0
01FE 8071 LDD R7,Z+1
01FF 0C64 ADD R6,R4
0200 1C75 ADC R7,R5
0201 8271 STD Z+1,R7
0202 8260 STD Z+0,R6
(0244) if ( pt_l->real_speed < 0 ){ //取绝对值
0203 01F8 MOVW R30,R16
0204 8182 LDD R24,Z+2
0205 8193 LDD R25,Z+3
0206 3080 CPI R24,0
0207 E0E0 LDI R30,0
0208 079E CPC R25,R30
0209 F454 BGE 0x0214
(0245) OCR1A = (uint)(-pt_l->real_speed);
020A 01F8 MOVW R30,R16
020B 8182 LDD R24,Z+2
020C 8193 LDD R25,Z+3
020D 9580 COM R24
020E 9590 COM R25
020F 5F8F SUBI R24,0xFF
0210 4F9F SBCI R25,0xFF
0211 BD9B OUT 0x2B,R25
0212 BD8A OUT 0x2A,R24
(0246) } else {
0213 C005 RJMP 0x0219
(0247) OCR1A = (uint)(pt_l->real_speed);
0214 01F8 MOVW R30,R16
0215 8022 LDD R2,Z+2
0216 8033 LDD R3,Z+3
0217 BC3B OUT 0x2B,R3
0218 BC2A OUT 0x2A,R2
(0248) }
(0249) pt_l->counter = 0; //计数器清零
0219 2422 CLR R2
021A 2433 CLR R3
021B 01F8 MOVW R30,R16
021C 8631 STD Z+9,R3
021D 8620 STD Z+8,R2
(0250) }
(0251) } else if( pt_l->real_speed > pt_l->des_speed ){
021E C040 RJMP 0x025F
021F 01F8 MOVW R30,R16
0220 8020 LDD R2,Z+0
0221 8031 LDD R3,Z+1
0222 8042 LDD R4,Z+2
0223 8053 LDD R5,Z+3
0224 1424 CP R2,R4
0225 0435 CPC R3,R5
0226 F00C BLT 0x0228
0227 C037 RJMP 0x025F
(0252) if ( ++ pt_l->counter == pt_l->dece_count ){
0228 01C8 MOVW R24,R16
0229 9608 ADIW R24,0x8
022A 01FC MOVW R30,R24
022B 8180 LDD R24,Z+0
022C 8191 LDD R25,Z+1
022D 9601 ADIW R24,1
022E 012C MOVW R4,R24
022F 8251 STD Z+1,R5
0230 8240 STD Z+0,R4
0231 01F8 MOVW R30,R16
0232 8026 LDD R2,Z+6
0233 8037 LDD R3,Z+7
0234 1582 CP R24,R2
0235 0593 CPC R25,R3
0236 F009 BEQ 0x0238
0237 C027 RJMP 0x025F
(0253) pt_l->real_speed -= pt_l->step;
0238 01C8 MOVW R24,R16
0239 9602 ADIW R24,2
023A 01F8 MOVW R30,R16
023B 8442 LDD R4,Z+10
023C 8453 LDD R5,Z+11
023D 01FC MOVW R30,R24
023E 8060 LDD R6,Z+0
023F 8071 LDD R7,Z+1
0240 1864 SUB R6,R4
0241 0875 SBC R7,R5
0242 8271 STD Z+1,R7
0243 8260 STD Z+0,R6
(0254) if ( pt_l->real_speed < 0 ){ //取绝对值
0244 01F8 MOVW R30,R16
0245 8182 LDD R24,Z+2
0246 8193 LDD R25,Z+3
0247 3080 CPI R24,0
0248 E0E0 LDI R30,0
0249 079E CPC R25,R30
024A F454 BGE 0x0255
(0255) OCR1A = (uint)(-pt_l->real_speed);
024B 01F8 MOVW R30,R16
024C 8182 LDD R24,Z+2
024D 8193 LDD R25,Z+3
024E 9580 COM R24
024F 9590 COM R25
0250 5F8F SUBI R24,0xFF
0251 4F9F SBCI R25,0xFF
0252 BD9B OUT 0x2B,R25
0253 BD8A OUT 0x2A,R24
(0256) } else {
0254 C005 RJMP 0x025A
(0257) OCR1A = (uint)(pt_l->real_speed);
0255 01F8 MOVW R30,R16
0256 8022 LDD R2,Z+2
0257 8033 LDD R3,Z+3
0258 BC3B OUT 0x2B,R3
0259 BC2A OUT 0x2A,R2
(0258) }
(0259) pt_l->counter = 0;
025A 2422 CLR R2
025B 2433 CLR R3
025C 01F8 MOVW R30,R16
025D 8631 STD Z+9,R3
025E 8620 STD Z+8,R2
(0260) }
(0261) }
(0262) //右电机加减速梯形图控制器
(0263) if ( OCR1B <= pt_r->step ) //当速度减少到一定值时
025F 01F9 MOVW R30,R18
0260 8422 LDD R2,Z+10
0261 8433 LDD R3,Z+11
0262 B448 IN R4,0x28
0263 B459 IN R5,0x29
0264 1424 CP R2,R4
0265 0435 CPC R3,R5
0266 F408 BCC 0x0268
0267 C04F RJMP 0x02B7
(0264) {
(0265) OCR1B = pt_r->step; //保持,高频润滑
0268 01F9 MOVW R30,R18
0269 8422 LDD R2,Z+10
026A 8433 LDD R3,Z+11
026B BC39 OUT 0x29,R3
026C BC28 OUT 0x28,R2
(0266) if ( pt_r->des_speed == 0 ){ //当期望值为0时的处理
026D 01F9 MOVW R30,R18
026E 8020 LDD R2,Z+0
026F 8031 LDD R3,Z+1
0270 2022 TST R2
0271 F449 BNE 0x027B
0272 2033 TST R3
0273 F439 BNE 0x027B
(0267) pt_r->real_speed = 0;
0274 2422 CLR R2
0275 2433 CLR R3
0276 01F9 MOVW R30,R18
0277 8233 STD Z+3,R3
0278 8222 STD Z+2,R2
(0268) SET_R_DIR;
0279 9AC1 SBI 0x18,1
(0269) } else{
027A C0BD RJMP 0x0338
(0270) if ( pt_r->des_speed > 0 ) SET_R_DIR;
027B 2422 CLR R2
027C 2433 CLR R3
027D 01F9 MOVW R30,R18
027E 8040 LDD R4,Z+0
027F 8051 LDD R5,Z+1
0280 1424 CP R2,R4
0281 0435 CPC R3,R5
0282 F414 BGE 0x0285
0283 9AC1 SBI 0x18,1
0284 C001 RJMP 0x0286
(0271) else RST_R_DIR;
0285 98C1 CBI 0x18,1
(0272) if ( ++ pt_r->counter >= 400 ){
0286 01C9 MOVW R24,R18
0287 9608 ADIW R24,0x8
0288 01FC MOVW R30,R24
0289 8180 LDD R24,Z+0
028A 8191 LDD R25,Z+1
028B 9601 ADIW R24,1
028C 012C MOVW R4,R24
028D 8251 STD Z+1,R5
028E 8240 STD Z+0,R4
028F 3980 CPI R24,0x90
0290 E0E1 LDI R30,1
0291 079E CPC R25,R30
0292 F408 BCC 0x0294
0293 C0A4 RJMP 0x0338
(0273) DDRD |= BIT(PD4); //刷新PD5为输出
0294 9A8C SBI 0x11,4
(0274) OCR1B = pt_r->step + 1;
0295 01F9 MOVW R30,R18
0296 8582 LDD R24,Z+10
0297 8593 LDD R25,Z+11
0298 9601 ADIW R24,1
0299 BD99 OUT 0x29,R25
029A BD88 OUT 0x28,R24
(0275) if( pt_r->des_speed > 0 ) pt_r->real_speed = (int)(OCR1B); //需要强制类型转换吗?
029B 2422 CLR R2
029C 2433 CLR R3
029D 01F9 MOVW R30,R18
029E 8040 LDD R4,Z+0
029F 8051 LDD R5,Z+1
02A0 1424 CP R2,R4
02A1 0435 CPC R3,R5
02A2 F42C BGE 0x02A8
02A3 B428 IN R2,0x28
02A4 B439 IN R3,0x29
02A5 8233 STD Z+3,R3
02A6 8222 STD Z+2,R2
02A7 C009 RJMP 0x02B1
(0276) else pt_r->real_speed = -(int)(OCR1B);
02A8 B588 IN R24,0x28
02A9 B599 IN R25,0x29
02AA 9580 COM R24
02AB 9590 COM R25
02AC 5F8F SUBI R24,0xFF
02AD 4F9F SBCI R25,0xFF
02AE 01F9 MOVW R30,R18
02AF 8393 STD Z+3,R25
02B0 8382 STD Z+2,R24
(0277) pt_r->counter = 0; //定时计数器清零
02B1 2422 CLR R2
02B2 2433 CLR R3
02B3 01F9 MOVW R30,R18
02B4 8631 STD Z+9,R3
02B5 8620 STD Z+8,R2
(0278) }
(0279) }
(0280) } else if ( pt_r->real_speed < pt_r->des_speed ){
02B6 C081 RJMP 0x0338
02B7 01F9 MOVW R30,R18
02B8 8020 LDD R2,Z+0
02B9 8031 LDD R3,Z+1
02BA 8042 LDD R4,Z+2
02BB 8053 LDD R5,Z+3
02BC 1442 CP R4,R2
02BD 0453 CPC R5,R3
02BE F00C BLT 0x02C0
02BF C038 RJMP 0x02F8
(0281) if ( ++ pt_r->counter == pt_r->acce_count ){
02C0 01C9 MOVW R24,R18
02C1 9608 ADIW R24,0x8
02C2 01FC MOVW R30,R24
02C3 8180 LDD R24,Z+0
02C4 8191 LDD R25,Z+1
02C5 9601 ADIW R24,1
02C6 012C MOVW R4,R24
02C7 8251 STD Z+1,R5
02C8 8240 STD Z+0,R4
02C9 01F9 MOVW R30,R18
02CA 8024 LDD R2,Z+4
02CB 8035 LDD R3,Z+5
02CC 1582 CP R24,R2
02CD 0593 CPC R25,R3
02CE F009 BEQ 0x02D0
02CF C068 RJMP 0x0338
(0282) pt_r->real_speed += pt_r->step; //加速梯形图
02D0 01C9 MOVW R24,R18
02D1 9602 ADIW R24,2
02D2 01F9 MOVW R30,R18
02D3 8442 LDD R4,Z+10
02D4 8453 LDD R5,Z+11
02D5 01FC MOVW R30,R24
02D6 8060 LDD R6,Z+0
02D7 8071 LDD R7,Z+1
02D8 0C64 ADD R6,R4
02D9 1C75 ADC R7,R5
02DA 8271 STD Z+1,R7
02DB 8260 STD Z+0,R6
(0283) if ( pt_r->real_speed < 0 ){ //取绝对值
02DC 01F9 MOVW R30,R18
02DD 8182 LDD R24,Z+2
02DE 8193 LDD R25,Z+3
02DF 3080 CPI R24,0
02E0 E0E0 LDI R30,0
02E1 079E CPC R25,R30
02E2 F454 BGE 0x02ED
(0284) OCR1B = (uint)(-pt_r->real_speed);
02E3 01F9 MOVW R30,R18
02E4 8182 LDD R24,Z+2
02E5 8193 LDD R25,Z+3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -