📄 modbus16.lis
字号:
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 + -