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

📄 modbus.lis

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module modbus.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\ICCTES~1\1128\modbus.c
 0000                   .dbfunc e uart0_init _uart0_init fV
                        .even
 0000           _uart0_init::
 0000                   .dbline -1
 0000                   .dbline 32
 0000           ; //modbus.c         
 0000           ; #include <iom48v.h>        
 0000           ; #include <macros.h>            
 0000           ; #include "main.h"            
 0000           ; #include "modbus.h"         
 0000           ; #include "timer2.h"  
 0000           ; #include "led.h"
 0000           ; 
 0000           ; #define LocalAddr 0x01          
 0000           ; #define TRUE 1                                   
 0000           ; #define FLASE 0                               
 0000           ; volatile uchar sendPosi,sendCount;             
 0000           ; uchar receCount;                    
 0000           ; volatile uchar GetCntTemp;                  
 0000           ;  uchar sendBuf[16];                          
 0000           ;  uchar receBuf[16];                           
 0000           ; volatile uchar checkoutError; //校验结果     
 0000           ;  uchar receTimeOut;                           //接收超时     
 0000           ;                  
 0000           ; uchar GetKeyValue;
 0000           ; uint crc_result;
 0000           ; 
 0000           ;  uint testVarAnalog;
 0000           ;  uint testVarPoint;
 0000           ;  uint testVarInputUp;
 0000           ;  uint testVarInputDown;
 0000           ;                                
 0000           ; // UART0 initialize
 0000           ; // desired baud rate: 9600
 0000           ; // actual: baud rate:9615 (0.2%)
 0000           ; void uart0_init(void)
 0000           ; {
 0000                   .dbline 33
 0000           ;   UCSR0B = 0x00; //disable while setting baud rate
 0000 2224              clr R2
 0002 2092C100          sts 193,R2
 0006                   .dbline 34
 0006           ;   UCSR0A = 0x02;              // 0x02;
 0006 82E0              ldi R24,2
 0008 8093C000          sts 192,R24
 000C                   .dbline 35
 000C           ;   UCSR0C = 0x3E; //奇校验 2个停止位. 
 000C 8EE3              ldi R24,62
 000E 8093C200          sts 194,R24
 0012                   .dbline 36
 0012           ;   UBRR0L = 0x67; //set baud rate lo.
 0012 87E6              ldi R24,103
 0014 8093C400          sts 196,R24
 0018                   .dbline 37
 0018           ;   UBRR0H = 0x00; //set baud rate hi.
 0018 2092C500          sts 197,R2
 001C                   .dbline 39
 001C           ; // UCSR0B = 0xB8; //bit3 send enable.
 001C           ;   UCSR0B = 0b10010000;             
 001C 80E9              ldi R24,144
 001E 8093C100          sts 193,R24
 0022                   .dbline -2
 0022           L5:
 0022                   .dbline 0 ; func end
 0022 0895              ret
 0024                   .dbend
 0024                   .dbfunc e beginSend _beginSend fV
                        .even
 0024           _beginSend::
 0024                   .dbline -1
 0024                   .dbline 46
 0024           ; // UCSR0B &= ~BIT(TXCIE0); //RXCIE0 清零.
 0024           ; // UCSR0B &= ~BIT(TXEN0);  //TXEN0 清零.
 0024           ; }//void uart0_init(void)
 0024           ; 
 0024           ; 
 0024           ; void beginSend(void)
 0024           ; {
 0024                   .dbline 48
 0024           ; //sendEnable();    //设为发送.
 0024           ;       sendPosi = 0;
 0024 2224              clr R2
 0026 20923000          sts _sendPosi,R2
 002A                   .dbline 49
 002A           ;       if(sendCount > 1)
 002A 81E0              ldi R24,1
 002C 20902F00          lds R2,_sendCount
 0030 8215              cp R24,R2
 0032 28F4              brsh L7
 0034                   .dbline 50
 0034           ;           sendCount--;
 0034 80912F00          lds R24,_sendCount
 0038 8150              subi R24,1
 003A 80932F00          sts _sendCount,R24
 003E           L7:
 003E                   .dbline 52
 003E           ; //    TX9D = ParityBit(sendBuf[0]);
 003E           ;       UDR0 = sendBuf[0];
 003E 20901B00          lds R2,_sendBuf
 0042 2092C600          sts 198,R2
 0046                   .dbline 54
 0046           ;       //UCSR0B |= BIT(UDRIE0);       //  TXIE = 1;       //使能发送中断. 
 0046           ;       UCSR0B |= BIT(TXCIE0);
 0046 8091C100          lds R24,193
 004A 8064              ori R24,64
 004C 8093C100          sts 193,R24
 0050                   .dbline 55
 0050           ;       UCSR0B |= BIT(TXEN0);              //  TXEN = 1;                //使能发送
 0050 8091C100          lds R24,193
 0054 8860              ori R24,8
 0056 8093C100          sts 193,R24
 005A                   .dbline -2
 005A           L6:
 005A                   .dbline 0 ; func end
 005A 0895              ret
 005C                   .dbend
 005C                   .dbfunc e singleKeyTranmit _singleKeyTranmit fV
                        .even
 005C           _singleKeyTranmit::
 005C                   .dbline -1
 005C                   .dbline 79
 005C           ; //    TXIE = 1;     
 005C           ; //    CREN = 1;
 005C           ; //    RCIE = 1;
 005C           ; //    CREN = 0;
 005C           ; //    RCIE = 0;
 005C           ; }//void beginSend(void)
 005C           ; 
 005C           ; /*
 005C           ; void singleKeyTranmit(void)
 005C           ; {
 005C           ;       sendBuf[0] = 0x12;       
 005C           ;       sendBuf[1] = 0x34;       
 005C           ;       sendBuf[2] = 0x56; 
 005C           ;       sendBuf[3] = 0x78; 
 005C           ;       sendBuf[4] = 0x90; 
 005C           ;       sendCount = 5;   //发送字节长 
 005C           ;       beginSend(); 
 005C           ; } 
 005C           ; */
 005C           ; 
 005C           ; 
 005C           ; //单键值处理 
 005C           ; void singleKeyTranmit(void) 
 005C           ; { 
 005C                   .dbline 80
 005C           ;       sendBuf[0] = 0xff;      
 005C 8FEF              ldi R24,255
 005E 80931B00          sts _sendBuf,R24
 0062                   .dbline 81
 0062           ;       sendBuf[1] = 0xaa;      
 0062 8AEA              ldi R24,170
 0064 80931C00          sts _sendBuf+1,R24
 0068                   .dbline 82
 0068           ;       sendBuf[2] = 0x55;                      //0x55 校验确认回复. 
 0068 85E5              ldi R24,85
 006A 80931D00          sts _sendBuf+2,R24
 006E                   .dbline 83
 006E           ;       crc_result = CRC16(sendBuf,3);  
 006E 23E0              ldi R18,3
 0070 30E0              ldi R19,0
 0072 00E0              ldi R16,<_sendBuf
 0074 10E0              ldi R17,>_sendBuf
 0076 A5D0              rcall _CRC16
 0078 10930200          sts _crc_result+1,R17
 007C 00930100          sts _crc_result,R16
 0080                   .dbline 84
 0080           ;     sendBuf[3] = (uchar)(crc_result&0x00ff);      // Lo byte. 
 0080 C801              movw R24,R16
 0082 9070              andi R25,0
 0084 80931E00          sts _sendBuf+3,R24
 0088                   .dbline 85
 0088           ;       sendBuf[4] = (uchar)((crc_result&0xff00)>>8); // Hi byte. 
 0088 C801              movw R24,R16
 008A 8070              andi R24,0
 008C 892F              mov R24,R25
 008E 9927              clr R25
 0090 80931F00          sts _sendBuf+4,R24
 0094                   .dbline 87
 0094           ; //--------
 0094           ;       sendCount = 5;   
 0094 85E0              ldi R24,5
 0096 80932F00          sts _sendCount,R24
 009A                   .dbline 89
 009A           ; //----------
 009A           ;       beginSend();   
 009A C4DF              rcall _beginSend
 009C                   .dbline -2
 009C           L9:
 009C                   .dbline 0 ; func end
 009C 0895              ret
 009E                   .dbend
 009E                   .dbfunc e ReceiveFrameDisFun _ReceiveFrameDisFun fV
                        .even
 009E           _ReceiveFrameDisFun::
 009E 00D0              rcall push_gset1
 00A0                   .dbline -1
 00A0                   .dbline 95
 00A0           ; }  
 00A0           ;  
 00A0           ;  
 00A0           ; // 从站接受信息帧处理 
 00A0           ; void ReceiveFrameDisFun(void) 
 00A0           ; {
 00A0                   .dbline 96
 00A0           ;       if(receCount>4)
 00A0 84E0              ldi R24,4
 00A2 20902E00          lds R2,_receCount
 00A6 8215              cp R24,R2
 00A8 08F0              brlo X5
 00AA 65C0              rjmp L15
 00AC           X5:
 00AC                   .dbline 97
 00AC           ;       {        
 00AC                   .dbline 98
 00AC           ;                               switch(receBuf[1])          //byte 2: Command byte.
 00AC 40910C00          lds R20,_receBuf+1
 00B0 5527              clr R21
 00B2 4030              cpi R20,0
 00B4 4507              cpc R20,R21
 00B6 09F4              brne X6
 00B8 5EC0              rjmp L18
 00BA           X6:
 00BA           X0:
 00BA 4130              cpi R20,1
 00BC E0E0              ldi R30,0
 00BE 5E07              cpc R21,R30
 00C0 09F4              brne X7
 00C2 59C0              rjmp L18
 00C4           X7:
 00C4 4330              cpi R20,3
 00C6 E0E0              ldi R30,0
 00C8 5E07              cpc R21,R30
 00CA 79F0              breq L23
 00CC 4530              cpi R20,5
 00CE E0E0              ldi R30,0
 00D0 5E07              cpc R21,R30
 00D2 09F4              brne X8
 00D4 50C0              rjmp L18
 00D6           X8:
 00D6 4030              cpi R20,0
 00D8 E0E0              ldi R30,0
 00DA 5E07              cpc R21,R30
 00DC 0CF4              brge X9
 00DE 4BC0              rjmp L18
 00E0           X9:
 00E0           L39:
 00E0 4A3A              cpi R20,170
 00E2 E0E0              ldi R30,0
 00E4 5E07              cpc R21,R30
 00E6 21F1              breq L31
 00E8 46C0              rjmp L18
 00EA           X1:
 00EA                   .dbline 99
 00EA           ;                               {       
 00EA                   .dbline 101
 00EA           ;                                       case 0: 
 00EA           ;                                                       break;
 00EA                   .dbline 103
 00EA           ;                                       case 1: 
 00EA           ;                                                       break;
 00EA           L23:
 00EA                   .dbline 106
 00EA           ;                                       case 3: //请求变量
 00EA           ;                                        
 00EA           ;                                           if(receCount >= 8)
 00EA 80912E00          lds R24,_receCount
 00EE 8830              cpi R24,8
 00F0 08F4              brsh X10
 00F2 41C0              rjmp L18
 00F4           X10:
 00F4                   .dbline 107
 00F4           ;                                               {       
 00F4                   .dbline 110
 00F4           ;                                                 //PORTC ^= 0x02;    
 00F4           ;                                               
 00F4           ;                                               if(receBuf[0]==LocalAddr && checkoutError==0) 
 00F4 80910B00          lds R24,_receBuf
 00F8 8130              cpi R24,1
 00FA A1F4              brne L26
 00FC 20902C00          lds R2,_checkoutError
 0100 2220              tst R2
 0102 81F4              brne L26
 0104                   .dbline 111
 0104           ;                                                       {
 0104                   .dbline 112
 0104           ;                                                               if(RecFrameCheck(&receBuf[0],receCount))
 0104 20912E00          lds R18,_receCount
 0108 3327              clr R19
 010A 00E0              ldi R16,<_receBuf
 010C 10E0              ldi R17,>_receBuf
 010E 36D0              rcall _RecFrameCheck
 0110 0030              cpi R16,0
 0112 0107              cpc R16,R17
 0114 39F0              breq L28
 0116           X2:
 0116                   .dbline 113
 0116           ;                                                               { //校验正确
 0116                   .dbline 114
 0116           ;                                                    readRegisters();
 0116 92D0              rcall _readRegisters
 0118                   .dbline 115
 0118           ;                                                                        LedShowLink = 1717;
 0118 85EB              ldi R24,1717
 011A 96E0              ldi R25,6
 011C 90930100          sts _LedShowLink+1,R25
 0120 80930000          sts _LedShowLink,R24
 0124                   .dbline 116
 0124           ;                                                               }  
 0124           L28:
 0124                   .dbline 117
 0124           ;                                                       }
 0124           L26:
 0124                   .dbline 118
 0124           ;                                               receCount = 0;  
 0124 2224              clr R2
 0126 20922E00          sts _receCount,R2
 012A                   .dbline 119
 012A           ;                                               checkoutError = 0;      
 012A 20922C00          sts _checkoutError,R2
 012E                   .dbline 120
 012E           ;                                               }
 012E                   .dbline 122
 012E           ;                                
 012E           ;                                                       break;
 012E 23C0              rjmp L18
 0130           X3:
 0130                   .dbline 125
 0130           ;                                       
 0130           ;                                       case 5:
 0130           ;                                                       break;
 0130           L31:
 0130                   .dbline 129
 0130           ;                                       
 0130           ;                                       case 0xaa:
 0130           ;                                               // PORTC ^= 0x02;        
 0130           ;                                               if(receCount >= 5)         
 0130 80912E00          lds R24,_receCount
 0134 8530              cpi R24,5
 0136 F8F0              brlo L18
 0138                   .dbline 130
 0138           ;                                               {              
 0138                   .dbline 132
 0138           ;                                               //   PORTC ^= 0x02;       
 0138           ;                                                       if(receBuf[0]==LocalAddr && checkoutError==0) 
 0138 80910B00          lds R24,_receBuf
 013C 8130              cpi R24,1
 013E B1F4              brne L34
 0140 20902C00          lds R2,_checkoutError
 0144 2220              tst R2
 0146 91F4              brne L34
 0148                   .dbline 133
 0148           ;                                                       {
 0148                   .dbline 135
 0148           ;                                                        //  PORTC ^= 0x02;
 0148           ;                                                               if( RecFrameCheck(receBuf,5) )     

⌨️ 快捷键说明

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