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

📄 modbus.lis

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0148 25E0              ldi R18,5
 014A 30E0              ldi R19,0
 014C 00E0              ldi R16,<_receBuf
 014E 10E0              ldi R17,>_receBuf
 0150 15D0              rcall _RecFrameCheck
 0152 0030              cpi R16,0
 0154 0107              cpc R16,R17
 0156 51F0              breq L36
 0158           X4:
 0158                   .dbline 136
 0158           ;                                                               {//校验正确                                                     
 0158                   .dbline 138
 0158           ;                                                               //      PORTC ^= 0x02;                                                                                          
 0158           ;                                                                       GetKeyValue = receBuf[2]; 
 0158 20900D00          lds R2,_receBuf+2
 015C 20920000          sts _GetKeyValue,R2
 0160                   .dbline 139
 0160           ;                                                               LedShowLink = GetKeyValue;      
 0160 3324              clr R3
 0162 30920100          sts _LedShowLink+1,R3
 0166 20920000          sts _LedShowLink,R2
 016A                   .dbline 140
 016A           ;                                                               singleKeyTranmit(); 
 016A 78DF              rcall _singleKeyTranmit
 016C                   .dbline 141
 016C           ;                                                               }                               
 016C           L36:
 016C                   .dbline 142
 016C           ;                                                       } //if(receBuf[0]==LocalAddr && checkoutError==0) 
 016C           L34:
 016C                   .dbline 143
 016C           ;                                               receCount = 0;  
 016C 2224              clr R2
 016E 20922E00          sts _receCount,R2
 0172                   .dbline 144
 0172           ;                                               checkoutError = 0;      
 0172 20922C00          sts _checkoutError,R2
 0176                   .dbline 145
 0176           ;                                           } 
 0176                   .dbline 146
 0176           ;                                                       break;
 0176                   .dbline 149
 0176           ;                                  
 0176           ;                                       default:
 0176           ;                                               break;          // 错误功能码处理.
 0176           L18:
 0176                   .dbline 151
 0176           ;                               }       //switch(receBuf[1]) 
 0176           ;       }       //      if(receCount>4)
 0176           L15:
 0176                   .dbline 152
 0176           ;       NOP();  
 0176 0000              nop
 0178                   .dbline -2
 0178           L14:
 0178 00D0              rcall pop_gset1
 017A                   .dbline 0 ; func end
 017A 0895              ret
 017C                   .dbend
 017C                   .dbfunc e RecFrameCheck _RecFrameCheck fc
 017C           ;        CRCWord -> R20,R21
 017C           ;  GetCntTempBuf -> R10
 017C           ;    p_CheckData -> R22,R23
                        .even
 017C           _RecFrameCheck::
 017C 00D0              rcall push_gset3
 017E A22E              mov R10,R18
 0180 B801              movw R22,R16
 0182                   .dbline -1
 0182                   .dbline 157
 0182           ; }  //void ReceiveFrameDisFun(void)
 0182           ; 
 0182           ; 
 0182           ; uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
 0182           ; {     
 0182                   .dbline 159
 0182           ;       uint CRCWord;   
 0182           ;       CRCWord = *(p_CheckData+(GetCntTempBuf-1)) + 
 0182 EA2D              mov R30,R10
 0184 FF27              clr R31
 0186 3297              sbiw R30,2
 0188 E60F              add R30,R22
 018A F71F              adc R31,R23
 018C 2080              ldd R2,z+0
 018E 3324              clr R3
 0190 322C              mov R3,R2
 0192 2224              clr R2
 0194 EA2D              mov R30,R10
 0196 FF27              clr R31
 0198 3197              sbiw R30,1
 019A E60F              add R30,R22
 019C F71F              adc R31,R23
 019E 4081              ldd R20,z+0
 01A0 5527              clr R21
 01A2 420D              add R20,R2
 01A4 531D              adc R21,R3
 01A6                   .dbline 163
 01A6           ;                                       (*(p_CheckData+(GetCntTempBuf-2))<<8); 
 01A6           ; //    CRCWord = *(p_CheckData+(GetCntTempBuf-2)) + 
 01A6           ; //                            (*(p_CheckData+(GetCntTempBuf-1))<<8);                          
 01A6           ;       if(CRCWord == CRC16(p_CheckData,GetCntTempBuf-2))        
 01A6 2A2D              mov R18,R10
 01A8 3327              clr R19
 01AA 2250              subi R18,2
 01AC 3040              sbci R19,0
 01AE 8B01              movw R16,R22
 01B0 08D0              rcall _CRC16
 01B2 4017              cp R20,R16
 01B4 5107              cpc R21,R17
 01B6 11F4              brne L41
 01B8                   .dbline 164
 01B8           ;       {
 01B8                   .dbline 165
 01B8           ;               return TRUE;
 01B8 01E0              ldi R16,1
 01BA 01C0              rjmp L40
 01BC           L41:
 01BC                   .dbline 168
 01BC           ;       }
 01BC           ;       else
 01BC           ;       {
 01BC                   .dbline 169
 01BC           ;               return FLASE;
 01BC 0027              clr R16
 01BE                   .dbline -2
 01BE           L40:
 01BE 00D0              rcall pop_gset3
 01C0                   .dbline 0 ; func end
 01C0 0895              ret
 01C2                   .dbsym r CRCWord 20 i
 01C2                   .dbsym r GetCntTempBuf 10 c
 01C2                   .dbsym r p_CheckData 22 pc
 01C2                   .dbend
 01C2                   .dbfunc e CRC16 _CRC16 fI
 01C2           ;              i -> R20,R21
 01C2           ;             CH -> R22
 01C2           ;             CL -> R10
 01C2           ;         SaveLo -> R14
 01C2           ;         SaveHi -> y+2
 01C2           ;           Flag -> y+0
 01C2           ;        CRC16Hi -> R12
 01C2           ;        CRC16Lo -> R6
 01C2           ;        iLength -> R8,R9
 01C2           ;           data -> R4,R5
                        .even
 01C2           _CRC16::
 01C2 00D0              rcall push_gset5
 01C4 4901              movw R8,R18
 01C6 2801              movw R4,R16
 01C8 2397              sbiw R28,3
 01CA                   .dbline -1
 01CA                   .dbline 178
 01CA           ;       }
 01CA           ; }//uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)        
 01CA           ; 
 01CA           ; 
 01CA           ; 
 01CA           ; 
 01CA           ; //
 01CA           ; MyWord CRC16(MyByte *data,int iLength)
 01CA           ; {   
 01CA                   .dbline 184
 01CA           ;       MyByte CRC16Lo,CRC16Hi;
 01CA           ;     MyByte CL,CH;
 01CA           ;       MyByte SaveHi,SaveLo;
 01CA           ;       int i,Flag;
 01CA           ;     
 01CA           ;       CRC16Lo = 0xff;
 01CA 8FEF              ldi R24,255
 01CC 682E              mov R6,R24
 01CE                   .dbline 185
 01CE           ;       CRC16Hi = 0xff;
 01CE C82E              mov R12,R24
 01D0                   .dbline 186
 01D0           ;       CL = 0x01;
 01D0 AA24              clr R10
 01D2 A394              inc R10
 01D4                   .dbline 187
 01D4           ;       CH = 0xa0;
 01D4 60EA              ldi R22,160
 01D6                   .dbline 188
 01D6           ;       for(i=0; i<iLength; i++)
 01D6 4427              clr R20
 01D8 5527              clr R21
 01DA 28C0              rjmp L47
 01DC           L44:
 01DC                   .dbline 189
 01DC           ;       {
 01DC                   .dbline 190
 01DC           ;               CRC16Lo = CRC16Lo ^ data[i];
 01DC FA01              movw R30,R20
 01DE E40D              add R30,R4
 01E0 F51D              adc R31,R5
 01E2 2080              ldd R2,z+0
 01E4 6224              eor R6,R2
 01E6                   .dbline 191
 01E6           ;               for( Flag=0; Flag<=7; Flag++)
 01E6 0024              clr R0
 01E8 1124              clr R1
 01EA 1982              std y+1,R1
 01EC 0882              std y+0,R0
 01EE           L48:
 01EE                   .dbline 192
 01EE           ;               {
 01EE                   .dbline 193
 01EE           ;                       SaveHi = CRC16Hi;
 01EE CA82              std y+2,R12
 01F0                   .dbline 194
 01F0           ;                       SaveLo = CRC16Lo;
 01F0 E62C              mov R14,R6
 01F2                   .dbline 195
 01F2           ;                       CRC16Hi = CRC16Hi>>1;
 01F2 C694              lsr R12
 01F4                   .dbline 196
 01F4           ;                       CRC16Lo = CRC16Lo>>1;
 01F4 6694              lsr R6
 01F6                   .dbline 198
 01F6           ; 
 01F6           ;                       if((SaveHi&0x01) == 0x01)
 01F6 8A81              ldd R24,y+2
 01F8 8170              andi R24,1
 01FA 8130              cpi R24,1
 01FC 19F4              brne L52
 01FE                   .dbline 199
 01FE           ;                          CRC16Lo = CRC16Lo|0x80;
 01FE 862D              mov R24,R6
 0200 8068              ori R24,128
 0202 682E              mov R6,R24
 0204           L52:
 0204                   .dbline 201
 0204           ; 
 0204           ;                       if((SaveLo&0x01) == 0x01)
 0204 8E2D              mov R24,R14
 0206 8170              andi R24,1
 0208 8130              cpi R24,1
 020A 11F4              brne L54
 020C                   .dbline 202
 020C           ;                       {
 020C                   .dbline 203
 020C           ;                               CRC16Hi = CRC16Hi ^ CH; //
 020C C626              eor R12,R22
 020E                   .dbline 204
 020E           ;                               CRC16Lo = CRC16Lo ^ CL; //
 020E 6A24              eor R6,R10
 0210                   .dbline 205
 0210           ;                       }
 0210           L54:
 0210                   .dbline 206
 0210           L49:
 0210                   .dbline 191
 0210 8881              ldd R24,y+0
 0212 9981              ldd R25,y+1
 0214 0196              adiw R24,1
 0216 9983              std y+1,R25
 0218 8883              std y+0,R24
 021A                   .dbline 191
 021A 87E0              ldi R24,7
 021C 90E0              ldi R25,0
 021E 0880              ldd R0,y+0
 0220 1980              ldd R1,y+1
 0222 8015              cp R24,R0
 0224 9105              cpc R25,R1
 0226 1CF7              brge L48
 0228                   .dbline 207
 0228           L45:
 0228                   .dbline 188
 0228 4F5F              subi R20,255  ; offset = 1
 022A 5F4F              sbci R21,255
 022C           L47:
 022C                   .dbline 188
 022C 4815              cp R20,R8
 022E 5905              cpc R21,R9
 0230 ACF2              brlt L44
 0232                   .dbline 208
 0232           ;               }
 0232           ;       }
 0232           ;       return(CRC16Hi<<8 | CRC16Lo);
 0232 1C2D              mov R17,R12
 0234 062D              mov R16,R6
 0236                   .dbline -2
 0236           L43:
 0236 2396              adiw R28,3
 0238 00D0              rcall pop_gset5
 023A                   .dbline 0 ; func end
 023A 0895              ret
 023C                   .dbsym r i 20 I
 023C                   .dbsym r CH 22 c
 023C                   .dbsym r CL 10 c
 023C                   .dbsym r SaveLo 14 c
 023C                   .dbsym l SaveHi 2 c
 023C                   .dbsym l Flag 0 I
 023C                   .dbsym r CRC16Hi 12 c
 023C                   .dbsym r CRC16Lo 6 c
 023C                   .dbsym r iLength 8 I
 023C                   .dbsym r data 4 pc
 023C                   .dbend
 023C                   .dbfunc e readRegisters _readRegisters fV
 023C           ;          finsh -> <dead>
 023C           ;         result -> <dead>
 023C           ;      readCount -> R20
 023C           ;           addr -> R20,R21
 023C           ;        crcData -> R20,R21
 023C           ;      byteCount -> R10
 023C           ;       tempAddr -> R12,R13
 023C           ;       tempData -> y+0
 023C           ;              i -> R22,R23
                        .even
 023C           _readRegisters::
 023C 00D0              rcall push_gset4
 023E 2297              sbiw R28,2
 0240                   .dbline -1
 0240                   .dbline 214
 0240           ; }//MyWord CRC16(MyByte *data,int iLength).
 0240           ; 
 0240           ; 
 0240           ; //读寄存器
 0240           ; void readRegisters(void)
 0240           ; {
 0240                   .dbline 223
 0240           ;       uint addr;
 0240           ;       uint  tempAddr;
 0240           ;       uint  result;
 0240           ;       uint  crcData;
 0240           ;       uchar readCount;
 0240           ;       uchar byteCount;
 0240           ;       uchar finsh;    //1完成  0出错
 0240           ;       uint  i;
 0240           ;       uint  tempData = 0;     
 0240 2224              clr R2
 0242 3324              clr R3
 0244 3982              std y+1,R3
 0246 2882              std y+0,R2
 0248                   .dbline 226
 0248           ;       
 0248           ;     //起始地址 40001 (0x9c41)   
 0248           ;       addr = (receBuf[2]<<8) + receBuf[3];
 0248 20900E00          lds R2,_receBuf+3
 024C 30900D00          lds R3,_receBuf+2
 0250 532D              mov R21,R3
 0252 422D              mov R20,R2
 0254                   .dbline 230
 0254           ;       
 0254           ;       //tempAddr = addr & 0xfff;
 0254           ;       //addr = receBuf[3];
 0254           ;       tempAddr = addr;
 0254 6A01              movw R12,R20
 0256                   .dbline 232
 0256           ;       
 0256           ;     readCount = (receBuf[4]<<8) + receBuf[5]; //要读的个数
 0256 20901000          lds R2,_receBuf+5
 025A 30900F00          lds R3,_receBuf+4
 025E 532D              mov R21,R3
 0260 422D              mov R20,R2
 0262                   .dbline 235
 0262           ;       //readCount = receBuf[5];
 0262           ;       
 0262           ;       byteCount = readCount * 2;
 0262 82E0              ldi R24,2
 0264 849F              mul R24,R20

⌨️ 快捷键说明

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