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