📄 modbusm16.lst
字号:
0548 2022 TST R2
0549 F4C9 BNE 0x0563
(0363) {
(0364) crcData = crc16(receBuf,tempData-2);
054A 019B MOVW R18,R22
054B 5022 SUBI R18,2
054C 4030 SBCI R19,0
054D E701 LDI R16,0x71
054E E010 LDI R17,0
054F DD7D RCALL _crc16
0550 01A8 MOVW R20,R16
(0365) if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
0551 E781 LDI R24,0x71
0552 E090 LDI R25,0
0553 01FB MOVW R30,R22
0554 9731 SBIW R30,1
0555 0FE8 ADD R30,R24
0556 1FF9 ADC R31,R25
0557 8020 LDD R2,0+Z
0558 01FB MOVW R30,R22
0559 9732 SBIW R30,2
055A 0FE8 ADD R30,R24
055B 1FF9 ADC R31,R25
055C 8030 LDD R3,0+Z
055D 2C42 MOV R4,R2
055E 2C53 MOV R5,R3
055F 1504 CP R16,R4
0560 0515 CPC R17,R5
0561 F409 BNE 0x0563
(0366) {
(0367) presetMultipleRegisters();
0562 DECC RCALL _presetMultipleRegisters
(0368) }
(0369) }
(0370) receCount = 0;
0563 2422 CLR R2
0564 922000B2 STS _receCount,R2
(0371) checkoutError = 0;
0566 92200070 STS _checkoutError,R2
(0372) UCSRB |= BIT(7);
0568 9A57 SBI P0A,7
(0373) }
(0374) break;
(0375)
(0376) default:
(0377) break;
(0378) }
(0379) }
(0380) }//void checkComm0(void)
0569 940E0627 CALL pop_gset2
056B 9508 RET
_getCoilVal:
result --> R20
tempData --> R22
addr --> R10
056C 940E064E CALL push_gset3
056E 01B9 MOVW R22,R18
056F 0158 MOVW R10,R16
(0381)
(0382) //取线圈状态 返回0表示成功
(0383) uint16 getCoilVal(uint16 addr,uint16 *tempData)
(0384) {
(0385) uint16 result = 0;
0570 2744 CLR R20
0571 2755 CLR R21
(0386)
(0387) switch(addr & 0xff)
0572 01C5 MOVW R24,R10
0573 7090 ANDI R25,0
0574 015C MOVW R10,R24
0575 E180 LDI R24,0x10
0576 E090 LDI R25,0
0577 158A CP R24,R10
0578 059B CPC R25,R11
0579 F0A4 BLT 0x058E
057A E002 LDI R16,2
057B E010 LDI R17,0
057C 0195 MOVW R18,R10
057D 940E0617 CALL empy16s
057F 01F8 MOVW R30,R16
0580 E584 LDI R24,0x54
0581 E090 LDI R25,0
0582 0FE8 ADD R30,R24
0583 1FF9 ADC R31,R25
0584 9005 LPM R0,Z+
0585 9014 LPM R1,0(Z)
0586 01F0 MOVW R30,R0
0587 9409 IJMP
(0388) {
(0389) case 0:
(0390) break;
(0391) case 1:
(0392) *tempData = testCoil;
0588 9020006E LDS R2,_testCoil
058A 2433 CLR R3
058B 01FB MOVW R30,R22
058C 8220 STD R2,0+Z
058D 8231 STD R3,1+Z
(0393) break;
(0394) case 2:
(0395) break;
(0396) case 3:
(0397) break;
(0398) case 4:
(0399) break;
(0400) case 5:
(0401) break;
(0402) case 6:
(0403) break;
(0404) case 7:
(0405) break;
(0406) case 8:
(0407) break;
(0408) case 9:
(0409) break;
(0410) case 10:
(0411) break;
(0412) case 11:
(0413) break;
(0414) case 12:
(0415) break;
(0416) case 13:
(0417) break;
(0418) case 14:
(0419) break;
(0420) case 15:
(0421) break;
(0422) case 16:
(0423) break;
(0424) default:
(0425) break;
(0426) }
(0427)
(0428) return result;
058E 2F04 MOV R16,R20
058F 2F15 MOV R17,R21
0590 940E062A CALL pop_gset3
0592 9508 RET
_setCoilVal:
result --> R20
tempData --> R22
addr --> R10
0593 940E064E CALL push_gset3
0595 01B9 MOVW R22,R18
0596 0158 MOVW R10,R16
(0429) }//uint16 getCoilVal(uint16 addr,uint16 *data)
(0430)
(0431)
(0432) //设定线圈状态 返回0表示成功
(0433) uint16 setCoilVal(uint16 addr,uint16 tempData)
(0434) {
(0435) uint16 result = 0;
0597 2744 CLR R20
0598 2755 CLR R21
(0436)
(0437) switch(addr & 0xff)
0599 01C5 MOVW R24,R10
059A 7090 ANDI R25,0
059B 015C MOVW R10,R24
059C E180 LDI R24,0x10
059D E090 LDI R25,0
059E 158A CP R24,R10
059F 059B CPC R25,R11
05A0 F084 BLT 0x05B1
05A1 E002 LDI R16,2
05A2 E010 LDI R17,0
05A3 0195 MOVW R18,R10
05A4 940E0617 CALL empy16s
05A6 01F8 MOVW R30,R16
05A7 E786 LDI R24,0x76
05A8 E090 LDI R25,0
05A9 0FE8 ADD R30,R24
05AA 1FF9 ADC R31,R25
05AB 9005 LPM R0,Z+
05AC 9014 LPM R1,0(Z)
05AD 01F0 MOVW R30,R0
05AE 9409 IJMP
(0438) {
(0439) case 0:
(0440) break;
(0441) case 1:
(0442) testCoil = tempData;
05AF 9360006E STS _testCoil,R22
(0443) break;
(0444) case 2:
(0445) break;
(0446) case 3:
(0447) break;
(0448) case 4:
(0449) break;
(0450) case 5:
(0451) break;
(0452) case 6:
(0453) break;
(0454) case 7:
(0455) break;
(0456) case 8:
(0457) break;
(0458) case 9:
(0459) break;
(0460) case 10:
(0461) break;
(0462) case 11:
(0463) break;
(0464) case 12:
(0465) break;
(0466) case 13:
(0467) break;
(0468) case 14:
(0469) break;
(0470) case 15:
(0471) break;
(0472) case 16:
(0473) break;
(0474) default:
(0475) break;
(0476) }
(0477)
(0478)
(0479) return result;
05B1 2F04 MOV R16,R20
05B2 2F15 MOV R17,R21
05B3 940E062A CALL pop_gset3
05B5 9508 RET
_getRegisterVal:
result --> R20
tempData --> R22
addr --> R10
05B6 940E064E CALL push_gset3
05B8 01B9 MOVW R22,R18
05B9 0158 MOVW R10,R16
(0480) }//uint16 setCoilVal(uint16 addr,uint16 data)
(0481)
(0482) //取寄存器值 返回0表示成功
(0483) uint16 getRegisterVal(uint16 addr,uint16 *tempData)
(0484) {
(0485) uint16 result = 0;
05BA 2744 CLR R20
05BB 2755 CLR R21
(0486)
(0487) switch(addr & 0xff)
05BC 01C5 MOVW R24,R10
05BD 7090 ANDI R25,0
05BE 015C MOVW R10,R24
05BF E180 LDI R24,0x10
05C0 E090 LDI R25,0
05C1 158A CP R24,R10
05C2 059B CPC R25,R11
05C3 F0AC BLT 0x05D9
05C4 E002 LDI R16,2
05C5 E010 LDI R17,0
05C6 0195 MOVW R18,R10
05C7 940E0617 CALL empy16s
05C9 01F8 MOVW R30,R16
05CA E988 LDI R24,0x98
05CB E090 LDI R25,0
05CC 0FE8 ADD R30,R24
05CD 1FF9 ADC R31,R25
05CE 9005 LPM R0,Z+
05CF 9014 LPM R1,0(Z)
05D0 01F0 MOVW R30,R0
05D1 9409 IJMP
(0488) {
(0489) case 0:
(0490) *tempData = testRegister;
05D2 902000B4 LDS R2,_testRegister
05D4 903000B5 LDS R3,_testRegister+1
05D6 01FB MOVW R30,R22
05D7 8220 STD R2,0+Z
05D8 8231 STD R3,1+Z
(0491) break;
(0492) case 1:
(0493) break;
(0494) case 2:
(0495) break;
(0496) case 3:
(0497) break;
(0498) case 4:
(0499) break;
(0500) case 5:
(0501) break;
(0502) case 6:
(0503) break;
(0504) case 7:
(0505) break;
(0506) case 8:
(0507) break;
(0508) case 9:
(0509) break;
(0510) case 10:
(0511) break;
(0512) case 11:
(0513) break;
(0514) case 12:
(0515) break;
(0516) case 13:
(0517) break;
(0518) case 14:
(0519) break;
(0520) case 15:
(0521) break;
(0522) case 16:
(0523) break;
(0524) default:
(0525) break;
(0526) }
(0527)
(0528) return result;
05D9 2F04 MOV R16,R20
05DA 2F15 MOV R17,R21
05DB 940E062A CALL pop_gset3
05DD 9508 RET
_setRegisterVal:
result --> R20
tempData --> R22
addr --> R10
05DE 940E064E CALL push_gset3
05E0 01B9 MOVW R22,R18
05E1 0158 MOVW R10,R16
(0529) }//uint16 getRegisterVal(uint16 addr,uint16 &data)
(0530)
(0531) //设置寄存器值 返回0表示成功
(0532) uint16 setRegisterVal(uint16 addr,uint16 tempData)
(0533) {
(0534) uint16 result = 0;
05E2 2744 CLR R20
05E3 2755 CLR R21
(0535)
(0536) switch(addr & 0xff)
05E4 01C5 MOVW R24,R10
05E5 7090 ANDI R25,0
05E6 015C MOVW R10,R24
05E7 E180 LDI R24,0x10
05E8 E090 LDI R25,0
05E9 158A CP R24,R10
05EA 059B CPC R25,R11
05EB F094 BLT 0x05FE
05EC E002 LDI R16,2
05ED E010 LDI R17,0
05EE 0195 MOVW R18,R10
05EF 940E0617 CALL empy16s
05F1 01F8 MOVW R30,R16
05F2 EB8A LDI R24,0xBA
05F3 E090 LDI R25,0
05F4 0FE8 ADD R30,R24
05F5 1FF9 ADC R31,R25
05F6 9005 LPM R0,Z+
05F7 9014 LPM R1,0(Z)
05F8 01F0 MOVW R30,R0
05F9 9409 IJMP
(0537) {
(0538) case 0:
(0539) testRegister = tempData;
05FA 937000B5 STS _testRegister+1,R23
05FC 936000B4 STS _testRegister,R22
(0540) break;
(0541) case 1:
(0542) break;
(0543) case 2:
(0544) break;
(0545) case 3:
(0546) break;
(0547) case 4:
(0548) break;
(0549) case 5:
(0550) break;
(0551) case 6:
(0552) break;
(0553) case 7:
(0554) break;
(0555) case 8:
(0556) break;
(0557) case 9:
(0558) break;
(0559) case 10:
(0560) break;
(0561) case 11:
(0562) break;
(0563) case 12:
(0564) break;
(0565) case 13:
(0566) break;
(0567) case 14:
(0568) break;
(0569) case 15:
(0570) break;
(0571) case 16:
(0572) break;
(0573) default:
(0574) break;
(0575) }
(0576)
(0577) return result;
FILE: <library>
05FE 2F04 MOV R16,R20
05FF 2F15 MOV R17,R21
0600 940E062A CALL pop_gset3
0602 9508 RET
mod8u:
0603 9468 BSET 6
0604 C001 RJMP xdiv8u
div8u:
0605 94E8 BCLR 6
xdiv8u:
0606 932A ST R18,-Y
0607 92FA ST R15,-Y
0608 24FF CLR R15
0609 E028 LDI R18,0x8
060A 0F00 LSL R16
060B 1CFF ROL R15
060C 16F1 CP R15,R17
060D F010 BCS 0x0610
060E 1AF1 SUB R15,R17
060F 9503 INC R16
0610 952A DEC R18
0611 F7C1 BNE 0x060A
0612 F40E BRTC 0x0614
0613 2D0F MOV R16,R15
0614 90F9 LD R15,Y+
0615 9129 LD R18,Y+
0616 9508 RET
empy16s:
0617 920A ST R0,-Y
0618 921A ST R1,-Y
0619 938A ST R24,-Y
061A 939A ST R25,-Y
061B 9F02 MUL R16,R18
061C 01C0 MOVW R24,R0
061D 9F12 MUL R17,R18
061E 0D90 ADD R25,R0
061F 9F03 MUL R16,R19
0620 0D90 ADD R25,R0
0621 018C MOVW R16,R24
0622 9199 LD R25,Y+
0623 9189 LD R24,Y+
0624 9019 LD R1,Y+
0625 9009 LD R0,Y+
0626 9508 RET
pop_gset2:
0627 E0E2 LDI R30,2
0628 940C0637 JMP pop
pop_gset3:
062A E0E4 LDI R30,4
062B 940C0637 JMP pop
pop_gset4:
062D E0E8 LDI R30,0x8
062E 940C0637 JMP pop
pop_gset5:
0630 27EE CLR R30
0631 940C0637 JMP pop
push_gset1:
0633 935A ST R21,-Y
0634 934A ST R20,-Y
0635 9508 RET
pop_gset1:
0636 E0E1 LDI R30,1
pop:
0637 9149 LD R20,Y+
0638 9159 LD R21,Y+
0639 FDE0 SBRC R30,0
063A 9508 RET
063B 9169 LD R22,Y+
063C 9179 LD R23,Y+
063D FDE1 SBRC R30,1
063E 9508 RET
063F 90A9 LD R10,Y+
0640 90B9 LD R11,Y+
0641 FDE2 SBRC R30,2
0642 9508 RET
0643 90C9 LD R12,Y+
0644 90D9 LD R13,Y+
0645 FDE3 SBRC R30,3
0646 9508 RET
0647 90E9 LD R14,Y+
0648 90F9 LD R15,Y+
0649 9508 RET
push_gset2:
064A 937A ST R23,-Y
064B 936A ST R22,-Y
064C 940C0633 JMP push_gset1
push_gset3:
064E 92BA ST R11,-Y
064F 92AA ST R10,-Y
0650 940C064A JMP push_gset2
push_gset4:
0652 92DA ST R13,-Y
0653 92CA ST R12,-Y
0654 940C064E JMP push_gset3
push_gset5:
0656 92FA ST R15,-Y
0657 92EA ST R14,-Y
0658 940C0652 JMP push_gset4
lsl16:
065A 2322 TST R18
065B F021 BEQ 0x0660
065C 0F00 LSL R16
065D 1F11 ROL R17
065E 952A DEC R18
065F CFFA RJMP lsl16
0660 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -