📄 251.lst
字号:
0252 079E CPC R25,R30
0253 F1C0 BCS 0x028C
(0297) {
(0298) mileage++;
0254 E041 LDI R20,1
0255 E050 LDI R21,0
0256 E060 LDI R22,0
0257 E070 LDI R23,0
0258 904000B9 LDS R4,mileage+2
025A 905000BA LDS R5,mileage+3
025C 902000B7 LDS R2,mileage
025E 903000B8 LDS R3,mileage+1
0260 0E24 ADD R2,R20
0261 1E35 ADC R3,R21
0262 1E46 ADC R4,R22
0263 1E57 ADC R5,R23
0264 923000B8 STS mileage+1,R3
0266 922000B7 STS mileage,R2
0268 925000BA STS mileage+3,R5
026A 924000B9 STS mileage+2,R4
(0299) MileageCurrent++;
026C E041 LDI R20,1
026D E050 LDI R21,0
026E E060 LDI R22,0
026F E070 LDI R23,0
0270 904000BD LDS R4,MileageCurrent+2
0272 905000BE LDS R5,MileageCurrent+3
0274 902000BB LDS R2,MileageCurrent
0276 903000BC LDS R3,MileageCurrent+1
0278 0E24 ADD R2,R20
0279 1E35 ADC R3,R21
027A 1E46 ADC R4,R22
027B 1E57 ADC R5,R23
027C 923000BC STS MileageCurrent+1,R3
027E 922000BB STS MileageCurrent,R2
0280 925000BE STS MileageCurrent+3,R5
0282 924000BD STS MileageCurrent+2,R4
(0300) MileageSaved = 0;
0284 2422 CLR R2
0285 922000C1 STS MileageSaved,R2
(0301) MileagePulseCnt = 0;
0287 2433 CLR R3
0288 923000C0 STS MileagePulseCnt+1,R3
028A 922000BF STS MileagePulseCnt,R2
(0302) }
(0303)
(0304) //clear Timer
(0305) TCNT1H = 0;
028C 2422 CLR R2
028D BC2D OUT 0x2D,R2
(0306) TCNT1L = 0;
028E BC2C OUT 0x2C,R2
028F D72D RCALL pop_gset2
0290 9029 LD R2,Y+
0291 BE2F OUT 0x3F,R2
0292 91E9 LD R30,Y+
0293 91B9 LD R27,Y+
0294 91A9 LD R26,Y+
0295 9199 LD R25,Y+
0296 9189 LD R24,Y+
0297 9139 LD R19,Y+
0298 9129 LD R18,Y+
0299 9119 LD R17,Y+
029A 9109 LD R16,Y+
029B 9059 LD R5,Y+
029C 9049 LD R4,Y+
029D 9039 LD R3,Y+
029E 9029 LD R2,Y+
029F 9518 RETI
_int1_isr:
02A0 922A ST R2,-Y
02A1 923A ST R3,-Y
02A2 938A ST R24,-Y
02A3 939A ST R25,-Y
02A4 B62F IN R2,0x3F
02A5 922A ST R2,-Y
(0307) }
(0308)
(0309) #pragma interrupt_handler int1_isr:3
(0310) void int1_isr(void)
(0311) {
(0312) //external interupt on INT1
(0313) NPulseCnt++;
02A6 9180007A LDS R24,NPulseCnt
02A8 9190007B LDS R25,NPulseCnt+1
02AA 9601 ADIW R24,1
02AB 9390007B STS NPulseCnt+1,R25
02AD 9380007A STS NPulseCnt,R24
(0314) if(NPulseCnt>MaxNPulse)
02AF E788 LDI R24,0x78
02B0 E090 LDI R25,0
02B1 9020007A LDS R2,NPulseCnt
02B3 9030007B LDS R3,NPulseCnt+1
02B5 1582 CP R24,R2
02B6 0593 CPC R25,R3
02B7 F420 BCC 0x02BC
(0315) NPulseCnt = MaxNPulse; //Limit
02B8 9390007B STS NPulseCnt+1,R25
02BA 9380007A STS NPulseCnt,R24
02BC 9029 LD R2,Y+
02BD BE2F OUT 0x3F,R2
02BE 9199 LD R25,Y+
02BF 9189 LD R24,Y+
02C0 9039 LD R3,Y+
02C1 9029 LD R2,Y+
02C2 9518 RETI
(0316) }
(0317)
(0318) //call this routine to initialize all peripherals
(0319) void init_devices(void)
(0320) {
(0321) //stop errant interrupts until set up
(0322) CLI(); //disable all interrupts
_init_devices:
02C3 94F8 BCLR 7
(0323) port_init();
02C4 DE68 RCALL _port_init
(0324) //timer1_init();
(0325) timer2_init();
02C5 DE8F RCALL _timer2_init
(0326) spi_init();
02C6 DEFD RCALL _spi_init
(0327) //adc_init();
(0328)
(0329) MCUCR = 0x0F;
02C7 E08F LDI R24,0xF
02C8 BF85 OUT 0x35,R24
(0330) GICR = 0x00;
02C9 2422 CLR R2
02CA BE2B OUT 0x3B,R2
(0331) TIMSK = 0x45; //timer interrupt sources
02CB E485 LDI R24,0x45
02CC BF89 OUT 0x39,R24
(0332) SEI(); //re-enable interrupts
02CD 9478 BSET 7
02CE 9508 RET
_main:
02CF 9721 SBIW R28,1
(0333) //all peripherals are now initialized
(0334) }
(0335)
(0336) void main(void)
(0337) {
(0338) //Initiate port,timer2,spi& others
(0339) init_devices();//port&timer2 for motor control
02D0 DFF2 RCALL _init_devices
(0340) ParallelOutputCmd = 0x00;
02D1 2422 CLR R2
02D2 2433 CLR R3
02D3 923000F0 STS ParallelOutputCmd+1,R3
02D5 922000EF STS ParallelOutputCmd,R2
(0341) ParallelOutput();
02D7 D12F RCALL _ParallelOutput
(0342) MileageLoding();
02D8 D265 RCALL _MileageLoding
(0343) init_lcd();
02D9 DE15 RCALL _init_lcd
(0344) LCDDecoding();
02DA D137 RCALL _LCDDecoding
(0345) lcd_display(lcdshow,LCDContent,13);
02DB E08D LDI R24,0xD
02DC 8388 STD Y+0,R24
02DD EE22 LDI R18,0xE2
02DE E030 LDI R19,0
02DF E600 LDI R16,0x60
02E0 E010 LDI R17,0
02E1 DE1D RCALL _lcd_display
02E2 C005 RJMP 0x02E8
(0346) //motor turn to zero
(0347) while(SpeedMotorSetting!=SpeedMotorCurrent)
(0348) {
(0349) if(MotorBlocked==0)
02E3 9020006B LDS R2,MotorBlocked
02E5 2022 TST R2
02E6 F409 BNE 0x02E8
(0350) motor();
02E7 D029 RCALL _motor
02E8 902000C2 LDS R2,SpeedMotorCurrent
02EA 903000C3 LDS R3,SpeedMotorCurrent+1
02EC 904000C4 LDS R4,SpeedMotorSetting
02EE 905000C5 LDS R5,SpeedMotorSetting+1
02F0 1442 CP R4,R2
02F1 0453 CPC R5,R3
02F2 F781 BNE 0x02E3
(0351) }
(0352)
(0353) //Initiate timer1,adc,OPEN int0,1
(0354) timer0_init();
02F3 DE46 RCALL _timer0_init
(0355) timer1_init();
02F4 DE4C RCALL _timer1_init
(0356) adc_init();
02F5 DEDE RCALL _adc_init
(0357) GICR = 0xC0;
02F6 EC80 LDI R24,0xC0
02F7 BF8B OUT 0x3B,R24
(0358) watchdog_init();
02F8 DE66 RCALL _watchdog_init
02F9 C014 RJMP 0x030E
(0359) //Initialization Finished!!! Insert your functional code here...
(0360) while(1)
(0361) {
(0362) if(MotorBlocked==0)//unblocked by timer2
02FA 9020006B LDS R2,MotorBlocked
02FC 2022 TST R2
02FD F409 BNE 0x02FF
(0363) motor();
02FE D012 RCALL _motor
(0364) if(ParallelBlocked==0)//unblocked by timer0
02FF 9020006D LDS R2,ParallelBlocked
0301 2022 TST R2
0302 F409 BNE 0x0304
(0365) Parallel();
0303 D0FD RCALL _Parallel
(0366) if(CalculateBlocked==0)//unblocked by timer0
0304 9020006C LDS R2,CalculateBlocked
0306 2022 TST R2
0307 F409 BNE 0x0309
(0367) Calculate();
0308 D3FE RCALL _Calculate
(0368) if(MileageSaveBlocked==0)//unblocked by timer1_overflow
0309 9020006F LDS R2,MileageSaveBlocked
030B 2022 TST R2
030C F409 BNE 0x030E
(0369) MileageSaving();
030D D202 RCALL _MileageSaving
030E CFEB RJMP 0x02FA
030F 9621 ADIW R28,1
0310 9508 RET
_motor:
anticlockwise --> R20
clockwise --> R22
AnticlockwiseCmd --> R10
ClockwiseCmd --> R12
i --> R14
0311 D6B3 RCALL push_gset5
(0370) }
(0371) }
(0372)
(0373) //===============================================
(0374) //=============MOTOR SUBROUTINE=================
(0375) //================================================
(0376) void motor(void)
(0377) {
(0378) uchar i;
(0379) uchar clockwise = 0x00;//test
0312 2766 CLR R22
(0380) uchar anticlockwise = 0x00;
0313 2744 CLR R20
(0381) uchar ClockwiseCmd=0x00;//Original, reversed motor not inverted
0314 24CC CLR R12
(0382) uchar AnticlockwiseCmd=0x00;//Original, reversed motor not inverted
0315 24AA CLR R10
(0383)
(0384) //TEST
(0385) PORTB ^= BIT(2);
0316 E084 LDI R24,4
0317 B228 IN R2,0x18
0318 2628 EOR R2,R24
0319 BA28 OUT 0x18,R2
(0386) //LIMITING
(0387) if(SpeedMotorSetting>MaxAngle)
031A E480 LDI R24,0x40
031B E09B LDI R25,0xB
031C 902000C4 LDS R2,SpeedMotorSetting
031E 903000C5 LDS R3,SpeedMotorSetting+1
0320 1582 CP R24,R2
0321 0593 CPC R25,R3
0322 F424 BGE 0x0327
(0388) SpeedMotorSetting = MaxAngle;
0323 939000C5 STS SpeedMotorSetting+1,R25
0325 938000C4 STS SpeedMotorSetting,R24
(0389) if(NMotorSetting>MaxAngle)
0327 E480 LDI R24,0x40
0328 E09B LDI R25,0xB
0329 902000C8 LDS R2,NMotorSetting
032B 903000C9 LDS R3,NMotorSetting+1
032D 1582 CP R24,R2
032E 0593 CPC R25,R3
032F F424 BGE 0x0334
(0390) NMotorSetting = MaxAngle;
0330 939000C9 STS NMotorSetting+1,R25
0332 938000C8 STS NMotorSetting,R24
(0391)
(0392) //CALCULATE THE DIRECTION OF ALL MOTOR
(0393) if(SpeedMotorCurrent<SpeedMotorSetting)
0334 902000C4 LDS R2,SpeedMotorSetting
0336 903000C5 LDS R3,SpeedMotorSetting+1
0338 904000C2 LDS R4,SpeedMotorCurrent
033A 905000C3 LDS R5,SpeedMotorCurrent+1
033C 1442 CP R4,R2
033D 0453 CPC R5,R3
033E F454 BGE 0x0349
(0394) {
(0395) SpeedMotorCurrent++;
033F 01C2 MOVW R24,R4
0340 9601 ADIW R24,1
0341 939000C3 STS SpeedMotorCurrent+1,R25
0343 938000C2 STS SpeedMotorCurrent,R24
(0396) ClockwiseCmd |=BIT(0);
0345 2D8C MOV R24,R12
0346 6081 ORI R24,1
0347 2EC8 MOV R12,R24
(0397) }
0348 C014 RJMP 0x035D
(0398) else if (SpeedMotorCurrent>SpeedMotorSetting)
0349 902000C4 LDS R2,SpeedMotorSetting
034B 903000C5 LDS R3,SpeedMotorSetting+1
034D 904000C2 LDS R4,SpeedMotorCurrent
034F 905000C3 LDS R5,SpeedMotorCurrent+1
0351 1424 CP R2,R4
0352 0435 CPC R3,R5
0353 F44C BGE 0x035D
(0399) {
(0400) SpeedMotorCurrent--;
0354 01C2 MOVW R24,R4
0355 9701 SBIW R24,1
0356 939000C3 STS SpeedMotorCurrent+1,R25
0358 938000C2 STS SpeedMotorCurrent,R24
(0401) AnticlockwiseCmd |=BIT(0);
035A 2D8A MOV R24,R10
035B 6081 ORI R24,1
035C 2EA8 MOV R10,R24
(0402) }
(0403) if(NMotorCurrent<NMotorSetting)
035D 902000C8 LDS R2,NMotorSetting
035F 903000C9 LDS R3,NMotorSetting+1
0361 904000C6 LDS R4,NMotorCurrent
0363 905000C7 LDS R5,NMotorCurrent+1
0365 1442 CP R4,R2
0366 0453 CPC R5,R3
0367 F454 BGE 0x0372
(0404) {
(0405) NMotorCurrent++;
0368 01C2 MOVW R24,R4
0369 9601 ADIW R24,1
036A 939000C7 STS NMotorCurrent+1,R25
036C 938000C6 STS NMotorCurrent,R24
(0406) ClockwiseCmd |=BIT(1); //SPEED invert
036E 2D8C MOV R24,R12
036F 6082 ORI R24,2
0370 2EC8 MOV R12,R24
(0407) }
0371 C014 RJMP 0x0386
(0408) else if (NMotorCurrent>NMotorSetting)
0372 902000C8 LDS R2,NMotorSetting
0374 903000C9 LDS R3,NMotorSetting+1
0376 904000C6 LDS R4,NMotorCurrent
0378 905000C7 LDS R5,NMotorCurrent+1
037A 1424 CP R2,R4
037B 0435 CPC R3,R5
037C F44C BGE 0x0386
(0409) {
(0410) NMotorCurrent--;
037D 01C2 MOVW R24,R4
037E 9701 SBIW R24,1
037F 939000C7 STS NMotorCurrent+1,R25
0381 938000C6 STS NMotorCurrent,R24
(0411) AnticlockwiseCmd |= BIT(1); //SPEED invert
0383 2D8A MOV R24,R10
0384 6082 ORI R24,2
0385 2EA8 MOV R10,R24
(0412) }
(0413) for(i=0;i<=5;i++)
0386 24EE CLR R14
0387 C04C RJMP 0x03D4
(0414) {
(0415) if(VoltageMotorCurrent[i]<VoltageMotorSetting[i])
0388 E082 LDI R24,2
0389 9D8E MUL R24,R14
038A EC8A LDI R24,0xCA
038B E090 LDI R25,0
038C 01F0 MOVW R30,R0
038D 0FE8 ADD R30,R24
038E 1FF9 ADC R31,R25
038F 8020 LDD R2,Z+0
0390 8031 LDD R3,Z+1
0391 ED86 LDI R24,0xD6
0392 E090 LDI R25,0
0393 01F0 MOVW R30,R0
0394 0FE8 ADD R30,R24
0395 1FF9 ADC R31,R25
0396 8040 LDD R4,Z+0
0397 8051 LDD R5,Z+1
0398 1442 CP R4,R2
0399 0453 CPC R5,R3
039A F498 BCC 0x03AE
(0416) {
(0417) VoltageMotorCurrent[i]++;
039B E082 LDI R24,2
039C 9D8E MUL R24,R14
039D 0110 MOVW R2,R0
039E ED86 LDI R24,0xD6
039F E090 LDI R25,0
03A0 0E28 ADD R2,R24
03A1 1E39 ADC R3,R25
03A2 01F1 MOVW R30,R2
03A3 8180 LDD R24,Z+0
03A4 8191 LDD R25,Z+1
03A5 9601 ADIW R24,1
03A6 8391 STD Z+1,R25
03A7 8380 STD Z+0,R24
(0418) ClockwiseCmd |=BIT((i+VoltageMotorBias));
03A8 2D1E MOV R17,R14
03A9 5F1E SUBI R17,0xFE
03AA E001 LDI R16,1
03AB D692 RCALL lsl8
03AC 2AC0 OR R12,R16
(0419) }
03AD C025 RJMP 0x03D3
(0420) else if(VoltageMotorCurrent[i]>VoltageMotorSetting[i])
03AE E082 LDI R24,2
03AF 9D8E MUL R24,R14
03B0 EC8A LDI R24,0xCA
03B1 E090 LDI R25,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -