⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus16.lis

📁 一个16位单片机modbus通信例程
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 011A 4080              ldd R4,z+0
 011C 5524              clr R5
 011E 402A              or R4,R16
 0120 512A              or R5,R17
 0122 4082              std z+0,R4
 0124                   .dbline 137
 0124           ;                       tempAddr++;
 0124 0A80              ldd R0,y+2
 0126 0394              inc R0
 0128 0A82              std y+2,R0
 012A                   .dbline 138
 012A           ;                       if(tempAddr >= addr+bitCount)
 012A 2B80              ldd R2,y+3
 012C 2A0C              add R2,R10
 012E 0214              cp R0,R2
 0130 20F0              brlo L21
 0132                   .dbline 139
 0132           ;                       {       //读完
 0132                   .dbline 140
 0132           ;                               exit = 1;
 0132 0024              clr R0
 0134 0394              inc R0
 0136 0C82              std y+4,R0
 0138                   .dbline 141
 0138           ;                               break;
 0138 04C0              xjmp L19
 013A           L21:
 013A                   .dbline 143
 013A           L18:
 013A                   .dbline 132
 013A E394              inc R14
 013C           L20:
 013C                   .dbline 132
 013C 8E2D              mov R24,R14
 013E 8830              cpi R24,8
 0140 D8F2              brlo L17
 0142           L19:
 0142                   .dbline 144
 0142           ;                       }       
 0142           ;               }
 0142           ;               if(exit == 1)
 0142 8C81              ldd R24,y+4
 0144 8130              cpi R24,1
 0146 09F4              brne L23
 0148                   .dbline 145
 0148           ;                       break;
 0148 04C0              xjmp L15
 014A           L23:
 014A                   .dbline 146
 014A           L14:
 014A                   .dbline 128
 014A 6395              inc R22
 014C           L16:
 014C                   .dbline 128
 014C 6417              cp R22,R20
 014E 08F4              brsh X3
 0150 C6CF              xjmp L13
 0152           X3:
 0152           L15:
 0152                   .dbline 148
 0152           ;       }
 0152           ;       
 0152           ;       sendBuf[0] = localAddr;
 0152 20900000          lds R2,_localAddr
 0156 20922300          sts _sendBuf,R2
 015A                   .dbline 149
 015A           ;       sendBuf[1] = 0x01;      
 015A 81E0              ldi R24,1
 015C 80932400          sts _sendBuf+1,R24
 0160                   .dbline 150
 0160           ;       sendBuf[2] = byteCount;
 0160 40932500          sts _sendBuf+2,R20
 0164                   .dbline 151
 0164           ;       byteCount += 3;
 0164 4D5F              subi R20,253    ; addi 3
 0166                   .dbline 152
 0166           ;       crcData = crc16(sendBuf,byteCount);     
 0166 242F              mov R18,R20
 0168 3327              clr R19
 016A 00E0              ldi R16,<_sendBuf
 016C 10E0              ldi R17,>_sendBuf
 016E 48DF              xcall _crc16
 0170 B801              movw R22,R16
 0172                   .dbline 153
 0172           ;       sendBuf[byteCount] = crcData >> 8;
 0172 80E0              ldi R24,<_sendBuf
 0174 90E0              ldi R25,>_sendBuf
 0176 E42F              mov R30,R20
 0178 FF27              clr R31
 017A E80F              add R30,R24
 017C F91F              adc R31,R25
 017E 1B01              movw R2,R22
 0180 232C              mov R2,R3
 0182 3324              clr R3
 0184 2082              std z+0,R2
 0186                   .dbline 154
 0186           ;       byteCount++;
 0186 4395              inc R20
 0188                   .dbline 155
 0188           ;       sendBuf[byteCount] = crcData & 0xff;
 0188 E42F              mov R30,R20
 018A FF27              clr R31
 018C E80F              add R30,R24
 018E F91F              adc R31,R25
 0190 CB01              movw R24,R22
 0192 9070              andi R25,0
 0194 8083              std z+0,R24
 0196                   .dbline 156
 0196           ;       sendCount = byteCount + 1;
 0196 842F              mov R24,R20
 0198 8F5F              subi R24,255    ; addi 1
 019A 80934500          sts _sendCount,R24
 019E                   .dbline 158
 019E           ;       
 019E           ;       beginSend();    
 019E 74DF              xcall _beginSend
 01A0                   .dbline -2
 01A0                   .dbline 159
 01A0           ; }//void readCoil(void) 
 01A0           L8:
 01A0 2596              adiw R28,5
 01A2 0E940000          xcall pop_gset5
 01A6                   .dbline 0 ; func end
 01A6 0895              ret
 01A8                   .dbsym l result 1 c
 01A8                   .dbsym r crcData 22 i
 01A8                   .dbsym r byteCount 20 c
 01A8                   .dbsym r k 22 c
 01A8                   .dbsym l exit 4 c
 01A8                   .dbsym l addr 3 c
 01A8                   .dbsym r bitCount 10 c
 01A8                   .dbsym r position 12 c
 01A8                   .dbsym l tempData 0 i
 01A8                   .dbsym l tempAddr 2 c
 01A8                   .dbsym r i 14 c
 01A8                   .dbend
 01A8                   .dbfunc e readRegisters _readRegisters fV
 01A8           ;          finsh -> <dead>
 01A8           ;         result -> <dead>
 01A8           ;      readCount -> R20
 01A8           ;           addr -> R20
 01A8           ;        crcData -> R20,R21
 01A8           ;      byteCount -> R10
 01A8           ;       tempAddr -> R12
 01A8           ;       tempData -> y+0
 01A8           ;              i -> R22,R23
                        .even
 01A8           _readRegisters::
 01A8 0E940000          xcall push_gset4
 01AC 2297              sbiw R28,2
 01AE                   .dbline -1
 01AE                   .dbline 163
 01AE           ; 
 01AE           ; //读寄存器
 01AE           ; void readRegisters(void)
 01AE           ; {
 01AE                   .dbline 172
 01AE           ;       uint8 addr;
 01AE           ;       uint8 tempAddr;
 01AE           ;       uint16 result;
 01AE           ;       uint16 crcData;
 01AE           ;       uint8 readCount;
 01AE           ;       uint8 byteCount;
 01AE           ;       uint8  finsh;   //1完成  0出错
 01AE           ;       uint16 i;
 01AE           ;       uint16 tempData = 0;    
 01AE 2224              clr R2
 01B0 3324              clr R3
 01B2 2882              std y+0,R2
 01B4 3982              std y+1,R3
 01B6                   .dbline 176
 01B6           ;       
 01B6           ;       //addr = (receBuf[2]<<8) + receBuf[3];
 01B6           ;       //tempAddr = addr & 0xfff;      
 01B6           ;       addr = receBuf[3];
 01B6 40910600          lds R20,_receBuf+3
 01BA                   .dbline 177
 01BA           ;       tempAddr = addr;
 01BA C42E              mov R12,R20
 01BC                   .dbline 180
 01BC           ; 
 01BC           ;       //readCount = (receBuf[4]<<8) + receBuf[5];     //要读的个数
 01BC           ;       readCount = receBuf[5];
 01BC 40910800          lds R20,_receBuf+5
 01C0                   .dbline 182
 01C0           ; 
 01C0           ;       byteCount = readCount * 2;
 01C0 82E0              ldi R24,2
 01C2 849F              mul R24,R20
 01C4 A02C              mov R10,R0
 01C6                   .dbline 184
 01C6           ;       
 01C6           ;       for(i=0;i<byteCount;i+=2,tempAddr++)
 01C6 6627              clr R22
 01C8 7727              clr R23
 01CA 1AC0              xjmp L33
 01CC           L30:
 01CC                   .dbline 185
 01CC                   .dbline 186
 01CC 9E01              movw R18,R28
 01CE 0C2D              mov R16,R12
 01D0 1127              clr R17
 01D2 FFD1              xcall _getRegisterVal
 01D4                   .dbline 187
 01D4 80E0              ldi R24,<_sendBuf
 01D6 90E0              ldi R25,>_sendBuf
 01D8 FB01              movw R30,R22
 01DA 3396              adiw R30,3
 01DC E80F              add R30,R24
 01DE F91F              adc R31,R25
 01E0 2880              ldd R2,y+0
 01E2 3980              ldd R3,y+1
 01E4 232C              mov R2,R3
 01E6 3324              clr R3
 01E8 2082              std z+0,R2
 01EA                   .dbline 188
 01EA FB01              movw R30,R22
 01EC 3496              adiw R30,4
 01EE E80F              add R30,R24
 01F0 F91F              adc R31,R25
 01F2 8881              ldd R24,y+0
 01F4 9981              ldd R25,y+1
 01F6 9070              andi R25,0
 01F8 8083              std z+0,R24
 01FA                   .dbline 189
 01FA           L31:
 01FA                   .dbline 184
 01FA 6E5F              subi R22,254  ; offset = 2
 01FC 7F4F              sbci R23,255
 01FE C394              inc R12
 0200           L33:
 0200                   .dbline 184
 0200 2A2C              mov R2,R10
 0202 3324              clr R3
 0204 6215              cp R22,R2
 0206 7305              cpc R23,R3
 0208 08F3              brlo L30
 020A                   .dbline 191
 020A           ;       {
 020A           ;               getRegisterVal(tempAddr,&tempData);                             
 020A           ;               sendBuf[i+3] = tempData >> 8;                                           
 020A           ;               sendBuf[i+4] = tempData & 0xff;                 
 020A           ;       }
 020A           ;       
 020A           ;       sendBuf[0] = localAddr;
 020A 20900000          lds R2,_localAddr
 020E 20922300          sts _sendBuf,R2
 0212                   .dbline 192
 0212           ;       sendBuf[1] = 3;
 0212 83E0              ldi R24,3
 0214 80932400          sts _sendBuf+1,R24
 0218                   .dbline 193
 0218           ;       sendBuf[2] = byteCount;
 0218 A0922500          sts _sendBuf+2,R10
 021C                   .dbline 194
 021C           ;       byteCount += 3;
 021C 8A2D              mov R24,R10
 021E 8D5F              subi R24,253    ; addi 3
 0220 A82E              mov R10,R24
 0222                   .dbline 195
 0222           ;       crcData = crc16(sendBuf,byteCount);
 0222 282F              mov R18,R24
 0224 3327              clr R19
 0226 00E0              ldi R16,<_sendBuf
 0228 10E0              ldi R17,>_sendBuf
 022A EADE              xcall _crc16
 022C A801              movw R20,R16
 022E                   .dbline 196
 022E           ;       sendBuf[byteCount] = crcData >> 8;
 022E 80E0              ldi R24,<_sendBuf
 0230 90E0              ldi R25,>_sendBuf
 0232 EA2D              mov R30,R10
 0234 FF27              clr R31
 0236 E80F              add R30,R24
 0238 F91F              adc R31,R25
 023A 1A01              movw R2,R20
 023C 232C              mov R2,R3
 023E 3324              clr R3
 0240 2082              std z+0,R2
 0242                   .dbline 197
 0242           ;       byteCount++;
 0242 A394              inc R10
 0244                   .dbline 198
 0244           ;       sendBuf[byteCount] = crcData & 0xff;
 0244 EA2D              mov R30,R10
 0246 FF27              clr R31
 0248 E80F              add R30,R24
 024A F91F              adc R31,R25
 024C CA01              movw R24,R20
 024E 9070              andi R25,0
 0250 8083              std z+0,R24
 0252                   .dbline 200
 0252           ;       
 0252           ;       sendCount = byteCount + 1;
 0252 8A2D              mov R24,R10
 0254 8F5F              subi R24,255    ; addi 1
 0256 80934500          sts _sendCount,R24
 025A                   .dbline 201
 025A           ;       beginSend();
 025A 16DF              xcall _beginSend
 025C                   .dbline -2
 025C                   .dbline 202
 025C           ; }//void readRegisters(void)
 025C           L27:
 025C 2296              adiw R28,2
 025E 0E940000          xcall pop_gset4
 0262                   .dbline 0 ; func end
 0262 0895              ret
 0264                   .dbsym l finsh 1 c
 0264                   .dbsym l result 1 i
 0264                   .dbsym r readCount 20 c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -