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

📄 modbus16.lis

📁 modbus协议实现
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 037E           ; 
 037E           ; 
 037E           ; 
 037E           ; //检查uart0数据
 037E           ; void checkComm0Modbus(void)
 037E           ; {
 037E                   .dbline 293
 037E           ;       uint16 crcData;
 037E           ;       uint16 tempData;
 037E           ;       
 037E           ;       if(receCount > 4)
 037E 84E0              ldi R24,4
 0380 20904400          lds R2,_receCount
 0384 8215              cp R24,R2
 0386 08F0              brlo X5
 0388 D7C0              xjmp L65
 038A           X5:
 038A                   .dbline 294
 038A           ;       {
 038A                   .dbline 295
 038A           ;               switch(receBuf[1])
 038A 40910400          lds R20,_receBuf+1
 038E 5527              clr R21
 0390 4130              cpi R20,1
 0392 E0E0              ldi R30,0
 0394 5E07              cpc R21,R30
 0396 E1F0              breq L71
 0398 4330              cpi R20,3
 039A E0E0              ldi R30,0
 039C 5E07              cpc R21,R30
 039E C1F0              breq L71
 03A0 4530              cpi R20,5
 03A2 E0E0              ldi R30,0
 03A4 5E07              cpc R21,R30
 03A6 A1F0              breq L71
 03A8 4630              cpi R20,6
 03AA E0E0              ldi R30,0
 03AC 5E07              cpc R21,R30
 03AE 81F0              breq L71
 03B0 4130              cpi R20,1
 03B2 E0E0              ldi R30,0
 03B4 5E07              cpc R21,R30
 03B6 0CF4              brge X6
 03B8 BFC0              xjmp L68
 03BA           X6:
 03BA           L109:
 03BA 4F30              cpi R20,15
 03BC E0E0              ldi R30,0
 03BE 5E07              cpc R21,R30
 03C0 09F4              brne X7
 03C2 46C0              xjmp L92
 03C4           X7:
 03C4 4031              cpi R20,16
 03C6 E0E0              ldi R30,0
 03C8 5E07              cpc R21,R30
 03CA 09F4              brne X8
 03CC 77C0              xjmp L100
 03CE           X8:
 03CE B4C0              xjmp L68
 03D0           X4:
 03D0                   .dbline 296
 03D0           ;               {
 03D0           L71:
 03D0                   .dbline 301
 03D0           ;                       case 1://读取线圈状态(读取点 16位以内)
 03D0           ;                       case 3://读取保持寄存器(一个或多个)
 03D0           ;                       case 5://强制单个线圈
 03D0           ;                       case 6://设置单个寄存器                 
 03D0           ;                                       if(receCount >= 8)
 03D0 80914400          lds R24,_receCount
 03D4 8830              cpi R24,8
 03D6 08F4              brsh X9
 03D8 AFC0              xjmp L68
 03DA           X9:
 03DA                   .dbline 302
 03DA           ;                                       {//接收完成一组数据                                     
 03DA                   .dbline 304
 03DA           ;                                               //应该关闭接收中断
 03DA           ;                                               UCSRB &= ~BIT(7);                               
 03DA 5798              cbi 0xa,7
 03DC                   .dbline 305
 03DC           ;                                               if(receBuf[0]==localAddr && checkoutError==0)
 03DC 20900000          lds R2,_localAddr
 03E0 30900300          lds R3,_receBuf
 03E4 3214              cp R3,R2
 03E6 69F5              brne L74
 03E8 20900200          lds R2,_checkoutError
 03EC 2220              tst R2
 03EE 49F5              brne L74
 03F0                   .dbline 306
 03F0           ;                                               {
 03F0                   .dbline 307
 03F0           ;                                                       crcData = crc16(receBuf,6);
 03F0 26E0              ldi R18,6
 03F2 30E0              ldi R19,0
 03F4 00E0              ldi R16,<_receBuf
 03F6 10E0              ldi R17,>_receBuf
 03F8 03DE              xcall _crc16
 03FA A801              movw R20,R16
 03FC                   .dbline 308
 03FC           ;                                                       if(crcData == receBuf[7]+(receBuf[6]<<8))
 03FC 20900900          lds R2,_receBuf+6
 0400 3324              clr R3
 0402 322C              mov R3,R2
 0404 2224              clr R2
 0406 40900A00          lds R4,_receBuf+7
 040A 5524              clr R5
 040C 420C              add R4,R2
 040E 531C              adc R5,R3
 0410 0415              cp R16,R4
 0412 1505              cpc R17,R5
 0414 B1F4              brne L76
 0416                   .dbline 309
 0416           ;                                                       {//校验正确
 0416                   .dbline 310
 0416           ;                                                               if(receBuf[1] == 1)
 0416 80910400          lds R24,_receBuf+1
 041A 8130              cpi R24,1
 041C 11F4              brne L80
 041E                   .dbline 311
 041E           ;                                                               {//读取线圈状态(读取点 16位以内)
 041E                   .dbline 312
 041E           ;                                                                       readCoil();                                                             
 041E 45DE              xcall _readCoil
 0420                   .dbline 313
 0420           ;                                                               }
 0420 10C0              xjmp L81
 0422           L80:
 0422                   .dbline 314
 0422           ;                                                               else if(receBuf[1] == 3)
 0422 80910400          lds R24,_receBuf+1
 0426 8330              cpi R24,3
 0428 11F4              brne L83
 042A                   .dbline 315
 042A           ;                                                               {//读取保持寄存器(一个或多个)
 042A                   .dbline 316
 042A           ;                                                                       readRegisters();
 042A BEDE              xcall _readRegisters
 042C                   .dbline 317
 042C           ;                                                               }
 042C 0AC0              xjmp L84
 042E           L83:
 042E                   .dbline 318
 042E           ;                                                               else if(receBuf[1] == 5)
 042E 80910400          lds R24,_receBuf+1
 0432 8530              cpi R24,5
 0434 11F4              brne L86
 0436                   .dbline 319
 0436           ;                                                               {//强制单个线圈
 0436                   .dbline 320
 0436           ;                                                                       forceSingleCoil();                                                              
 0436 16DF              xcall _forceSingleCoil
 0438                   .dbline 321
 0438           ;                                                               }
 0438 04C0              xjmp L87
 043A           L86:
 043A                   .dbline 322
 043A           ;                                                               else if(receBuf[1] == 6)
 043A 80910400          lds R24,_receBuf+1
 043E 8630              cpi R24,6
 0440 01F4              brne L89
 0442                   .dbline 323
 0442           ;                                                               {
 0442                   .dbline 325
 0442           ;                                                                       //presetSingleRegister();                                                               
 0442           ;                                                               }
 0442           L89:
 0442           L87:
 0442           L84:
 0442           L81:
 0442                   .dbline 327
 0442           ; 
 0442           ;                                                       }
 0442           L76:
 0442                   .dbline 328
 0442           ;                                               }                                                                                       
 0442           L74:
 0442                   .dbline 329
 0442           ;                                               receCount = 0;  
 0442 2224              clr R2
 0444 20924400          sts _receCount,R2
 0448                   .dbline 330
 0448           ;                                               checkoutError = 0;      
 0448 20920200          sts _checkoutError,R2
 044C                   .dbline 331
 044C           ;                                               UCSRB |= BIT(7);                                                                                        
 044C 579A              sbi 0xa,7
 044E                   .dbline 332
 044E           ;                                       }
 044E                   .dbline 333
 044E           ;                                       break;
 044E 74C0              xjmp L68
 0450           L92:
 0450                   .dbline 336
 0450           ;               
 0450           ;                       case 15://设置多个线圈
 0450           ;                                       tempData = receBuf[6]; 
 0450 60910900          lds R22,_receBuf+6
 0454 7727              clr R23
 0456                   .dbline 337
 0456           ;                                       tempData += 9;  //数据个数
 0456 675F              subi R22,247  ; offset = 9
 0458 7F4F              sbci R23,255
 045A                   .dbline 338
 045A           ;                                       if(receCount >= tempData)
 045A 20904400          lds R2,_receCount
 045E 3324              clr R3
 0460 2616              cp R2,R22
 0462 3706              cpc R3,R23
 0464 08F4              brsh X10
 0466 68C0              xjmp L68
 0468           X10:
 0468                   .dbline 339
 0468           ;                                       {//应该关闭接收中断
 0468                   .dbline 340
 0468           ;                                               UCSRB &= ~BIT(7);                          
 0468 5798              cbi 0xa,7
 046A                   .dbline 341
 046A           ;                                               if(receBuf[0]==localAddr && checkoutError==0)
 046A 20900000          lds R2,_localAddr
 046E 30900300          lds R3,_receBuf
 0472 3214              cp R3,R2
 0474 E1F4              brne L96
 0476 20900200          lds R2,_checkoutError
 047A 2220              tst R2
 047C C1F4              brne L96
 047E                   .dbline 342
 047E           ;                                               {
 047E                   .dbline 343
 047E           ;                                                       crcData = crc16(receBuf,tempData-2);
 047E 9B01              movw R18,R22
 0480 2250              subi R18,2
 0482 3040              sbci R19,0
 0484 00E0              ldi R16,<_receBuf
 0486 10E0              ldi R17,>_receBuf
 0488 BBDD              xcall _crc16
 048A A801              movw R20,R16
 048C                   .dbline 344
 048C           ;                                                       if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
 048C 80E0              ldi R24,<_receBuf
 048E 90E0              ldi R25,>_receBuf
 0490 FB01              movw R30,R22
 0492 3197              sbiw R30,1
 0494 E80F              add R30,R24
 0496 F91F              adc R31,R25
 0498 2080              ldd R2,z+0
 049A FB01              movw R30,R22
 049C 3297              sbiw R30,2
 049E E80F              add R30,R24
 04A0 F91F              adc R31,R25
 04A2 3080              ldd R3,z+0
 04A4 422C              mov R4,R2
 04A6 532C              mov R5,R3
 04A8 0415              cp R16,R4
 04AA 1505              cpc R17,R5
 04AC 01F4              brne L98
 04AE                   .dbline 345
 04AE           ;                                                       {
 04AE                   .dbline 347
 04AE           ;                                                               //forceMultipleCoils();                 
 04AE           ;                                                       }
 04AE           L98:
 04AE                   .dbline 348
 04AE           ;                                               }       
 04AE           L96:
 04AE                   .dbline 349
 04AE           ;                                               receCount = 0;
 04AE 2224              clr R2
 04B0 20924400          sts _receCount,R2
 04B4                   .dbline 350
 04B4           ;                                               checkoutError = 0;
 04B4 20920200          sts _checkoutError,R2
 04B8                   .dbline 351
 04B8           ;                                               UCSRB |= BIT(7);
 04B8 579A              sbi 0xa,7
 04BA                   .dbline 352
 04BA           ;                                       }
 04BA                   .dbline 353
 04BA           ;                                       break;
 04BA 3EC0              xjmp L68
 04BC           L100:
 04BC                   .dbline 356
 04BC           ;                       
 04BC           ;                       case 16://设置多个寄存器
 04BC           ;                                       tempData = (receBuf[4]<<8) + receBuf[5];
 04BC 20900800          lds R2,_receBuf+5
 04C0 30900700          lds R3,_receBuf+4
 04C4 622D              mov R22,R2
 04C6 732D              mov R23,R3
 04C8                   .dbline 357
 04C8           ;                                       tempData = tempData * 2;        //数据个数
 04C8 02E0              ldi R16,2
 04CA 10E0              ldi R17,0
 04CC 9B01              movw R18,R22
 04CE 0E940000          xcall empy16s
 04D2 B801              movw R22,R16
 04D4                   .dbline 358
 04D4           ;                                       tempData += 9;
 04D4 675F              subi R22,247  ; offset = 9
 04D6 7F4F              sbci R23,255
 04D8                   .dbline 359
 04D8           ;                                       if(receCount >= tempData)
 04D8 20904400          lds R2,_receCount
 04DC 3324              clr R3
 04DE 2616              cp R2,R22
 04E0 3706              cpc R3,R23
 04E2 50

⌨️ 快捷键说明

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