?? modbus.s
字號:
.module modbus.c
.area text(rom, con, rel)
.dbfile D:\ICCTES~1\1128\modbus.c
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 32
; //modbus.c
; #include <iom48v.h>
; #include <macros.h>
; #include "main.h"
; #include "modbus.h"
; #include "timer2.h"
; #include "led.h"
;
; #define LocalAddr 0x01
; #define TRUE 1
; #define FLASE 0
; volatile uchar sendPosi,sendCount;
; uchar receCount;
; volatile uchar GetCntTemp;
; uchar sendBuf[16];
; uchar receBuf[16];
; volatile uchar checkoutError; //校驗結(jié)果
; uchar receTimeOut; //接收超時
;
; uchar GetKeyValue;
; uint crc_result;
;
; uint testVarAnalog;
; uint testVarPoint;
; uint testVarInputUp;
; uint testVarInputDown;
;
; // UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9615 (0.2%)
; void uart0_init(void)
; {
.dbline 33
; UCSR0B = 0x00; //disable while setting baud rate
clr R2
sts 193,R2
.dbline 34
; UCSR0A = 0x02; // 0x02;
ldi R24,2
sts 192,R24
.dbline 35
; UCSR0C = 0x3E; //奇校驗 2個停止位.
ldi R24,62
sts 194,R24
.dbline 36
; UBRR0L = 0x67; //set baud rate lo.
ldi R24,103
sts 196,R24
.dbline 37
; UBRR0H = 0x00; //set baud rate hi.
sts 197,R2
.dbline 39
; // UCSR0B = 0xB8; //bit3 send enable.
; UCSR0B = 0b10010000;
ldi R24,144
sts 193,R24
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e beginSend _beginSend fV
.even
_beginSend::
.dbline -1
.dbline 46
; // UCSR0B &= ~BIT(TXCIE0); //RXCIE0 清零.
; // UCSR0B &= ~BIT(TXEN0); //TXEN0 清零.
; }//void uart0_init(void)
;
;
; void beginSend(void)
; {
.dbline 48
; //sendEnable(); //設(shè)為發(fā)送.
; sendPosi = 0;
clr R2
sts _sendPosi,R2
.dbline 49
; if(sendCount > 1)
ldi R24,1
lds R2,_sendCount
cp R24,R2
brsh L7
.dbline 50
; sendCount--;
lds R24,_sendCount
subi R24,1
sts _sendCount,R24
L7:
.dbline 52
; // TX9D = ParityBit(sendBuf[0]);
; UDR0 = sendBuf[0];
lds R2,_sendBuf
sts 198,R2
.dbline 54
; //UCSR0B |= BIT(UDRIE0); // TXIE = 1; //使能發(fā)送中斷.
; UCSR0B |= BIT(TXCIE0);
lds R24,193
ori R24,64
sts 193,R24
.dbline 55
; UCSR0B |= BIT(TXEN0); // TXEN = 1; //使能發(fā)送
lds R24,193
ori R24,8
sts 193,R24
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e singleKeyTranmit _singleKeyTranmit fV
.even
_singleKeyTranmit::
.dbline -1
.dbline 79
; // TXIE = 1;
; // CREN = 1;
; // RCIE = 1;
; // CREN = 0;
; // RCIE = 0;
; }//void beginSend(void)
;
; /*
; void singleKeyTranmit(void)
; {
; sendBuf[0] = 0x12;
; sendBuf[1] = 0x34;
; sendBuf[2] = 0x56;
; sendBuf[3] = 0x78;
; sendBuf[4] = 0x90;
; sendCount = 5; //發(fā)送字節(jié)長
; beginSend();
; }
; */
;
;
; //單鍵值處理
; void singleKeyTranmit(void)
; {
.dbline 80
; sendBuf[0] = 0xff;
ldi R24,255
sts _sendBuf,R24
.dbline 81
; sendBuf[1] = 0xaa;
ldi R24,170
sts _sendBuf+1,R24
.dbline 82
; sendBuf[2] = 0x55; //0x55 校驗確認(rèn)回復(fù).
ldi R24,85
sts _sendBuf+2,R24
.dbline 83
; crc_result = CRC16(sendBuf,3);
ldi R18,3
ldi R19,0
ldi R16,<_sendBuf
ldi R17,>_sendBuf
rcall _CRC16
sts _crc_result+1,R17
sts _crc_result,R16
.dbline 84
; sendBuf[3] = (uchar)(crc_result&0x00ff); // Lo byte.
movw R24,R16
andi R25,0
sts _sendBuf+3,R24
.dbline 85
; sendBuf[4] = (uchar)((crc_result&0xff00)>>8); // Hi byte.
movw R24,R16
andi R24,0
mov R24,R25
clr R25
sts _sendBuf+4,R24
.dbline 87
; //--------
; sendCount = 5;
ldi R24,5
sts _sendCount,R24
.dbline 89
; //----------
; beginSend();
rcall _beginSend
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ReceiveFrameDisFun _ReceiveFrameDisFun fV
.even
_ReceiveFrameDisFun::
rcall push_gset1
.dbline -1
.dbline 95
; }
;
;
; // 從站接受信息幀處理
; void ReceiveFrameDisFun(void)
; {
.dbline 96
; if(receCount>4)
ldi R24,4
lds R2,_receCount
cp R24,R2
brlo X5
rjmp L15
X5:
.dbline 97
; {
.dbline 98
; switch(receBuf[1]) //byte 2: Command byte.
lds R20,_receBuf+1
clr R21
cpi R20,0
cpc R20,R21
brne X6
rjmp L18
X6:
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
brne X7
rjmp L18
X7:
cpi R20,3
ldi R30,0
cpc R21,R30
breq L23
cpi R20,5
ldi R30,0
cpc R21,R30
brne X8
rjmp L18
X8:
cpi R20,0
ldi R30,0
cpc R21,R30
brge X9
rjmp L18
X9:
L39:
cpi R20,170
ldi R30,0
cpc R21,R30
breq L31
rjmp L18
X1:
.dbline 99
; {
.dbline 101
; case 0:
; break;
.dbline 103
; case 1:
; break;
L23:
.dbline 106
; case 3: //請求變量
;
; if(receCount >= 8)
lds R24,_receCount
cpi R24,8
brsh X10
rjmp L18
X10:
.dbline 107
; {
.dbline 110
; //PORTC ^= 0x02;
;
; if(receBuf[0]==LocalAddr && checkoutError==0)
lds R24,_receBuf
cpi R24,1
brne L26
lds R2,_checkoutError
tst R2
brne L26
.dbline 111
; {
.dbline 112
; if(RecFrameCheck(&receBuf[0],receCount))
lds R18,_receCount
clr R19
ldi R16,<_receBuf
ldi R17,>_receBuf
rcall _RecFrameCheck
cpi R16,0
cpc R16,R17
breq L28
X2:
.dbline 113
; { //校驗正確
.dbline 114
; readRegisters();
rcall _readRegisters
.dbline 115
; LedShowLink = 1717;
ldi R24,1717
ldi R25,6
sts _LedShowLink+1,R25
sts _LedShowLink,R24
.dbline 116
; }
L28:
.dbline 117
; }
L26:
.dbline 118
; receCount = 0;
clr R2
sts _receCount,R2
.dbline 119
; checkoutError = 0;
sts _checkoutError,R2
.dbline 120
; }
.dbline 122
;
; break;
rjmp L18
X3:
.dbline 125
;
; case 5:
; break;
L31:
.dbline 129
;
; case 0xaa:
; // PORTC ^= 0x02;
; if(receCount >= 5)
lds R24,_receCount
cpi R24,5
brlo L18
.dbline 130
; {
.dbline 132
; // PORTC ^= 0x02;
; if(receBuf[0]==LocalAddr && checkoutError==0)
lds R24,_receBuf
cpi R24,1
brne L34
lds R2,_checkoutError
tst R2
brne L34
.dbline 133
; {
.dbline 135
; // PORTC ^= 0x02;
; if( RecFrameCheck(receBuf,5) )
ldi R18,5
ldi R19,0
ldi R16,<_receBuf
ldi R17,>_receBuf
rcall _RecFrameCheck
cpi R16,0
cpc R16,R17
breq L36
X4:
.dbline 136
; {//校驗正確
.dbline 138
; // PORTC ^= 0x02;
; GetKeyValue = receBuf[2];
lds R2,_receBuf+2
sts _GetKeyValue,R2
.dbline 139
; LedShowLink = GetKeyValue;
clr R3
sts _LedShowLink+1,R3
sts _LedShowLink,R2
.dbline 140
; singleKeyTranmit();
rcall _singleKeyTranmit
.dbline 141
; }
L36:
.dbline 142
; } //if(receBuf[0]==LocalAddr && checkoutError==0)
L34:
.dbline 143
; receCount = 0;
clr R2
sts _receCount,R2
.dbline 144
; checkoutError = 0;
sts _checkoutError,R2
.dbline 145
; }
.dbline 146
; break;
.dbline 149
;
; default:
; break; // 錯誤功能碼處理.
L18:
.dbline 151
; } //switch(receBuf[1])
; } // if(receCount>4)
L15:
.dbline 152
; NOP();
nop
.dbline -2
L14:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbend
.dbfunc e RecFrameCheck _RecFrameCheck fc
; CRCWord -> R20,R21
; GetCntTempBuf -> R10
; p_CheckData -> R22,R23
.even
_RecFrameCheck::
rcall push_gset3
mov R10,R18
movw R22,R16
.dbline -1
.dbline 157
; } //void ReceiveFrameDisFun(void)
;
;
; uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
; {
.dbline 159
; uint CRCWord;
; CRCWord = *(p_CheckData+(GetCntTempBuf-1)) +
mov R30,R10
clr R31
sbiw R30,2
add R30,R22
adc R31,R23
ldd R2,z+0
clr R3
mov R3,R2
clr R2
mov R30,R10
clr R31
sbiw R30,1
add R30,R22
adc R31,R23
ldd R20,z+0
clr R21
add R20,R2
adc R21,R3
.dbline 163
; (*(p_CheckData+(GetCntTempBuf-2))<<8);
; // CRCWord = *(p_CheckData+(GetCntTempBuf-2)) +
; // (*(p_CheckData+(GetCntTempBuf-1))<<8);
; if(CRCWord == CRC16(p_CheckData,GetCntTempBuf-2))
mov R18,R10
clr R19
subi R18,2
sbci R19,0
movw R16,R22
rcall _CRC16
cp R20,R16
cpc R21,R17
brne L41
.dbline 164
; {
.dbline 165
; return TRUE;
ldi R16,1
rjmp L40
L41:
.dbline 168
; }
; else
; {
.dbline 169
; return FLASE;
clr R16
.dbline -2
L40:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r CRCWord 20 i
.dbsym r GetCntTempBuf 10 c
.dbsym r p_CheckData 22 pc
.dbend
.dbfunc e CRC16 _CRC16 fI
; i -> R20,R21
; CH -> R22
; CL -> R10
; SaveLo -> R14
; SaveHi -> y+2
; Flag -> y+0
; CRC16Hi -> R12
; CRC16Lo -> R6
; iLength -> R8,R9
; data -> R4,R5
.even
_CRC16::
rcall push_gset5
movw R8,R18
movw R4,R16
sbiw R28,3
.dbline -1
.dbline 178
; }
; }//uchar RecFrameCheck(uchar *p_CheckData,uchar GetCntTempBuf)
;
;
;
;
; //
; MyWord CRC16(MyByte *data,int iLength)
; {
.dbline 184
; MyByte CRC16Lo,CRC16Hi;
; MyByte CL,CH;
; MyByte SaveHi,SaveLo;
; int i,Flag;
;
; CRC16Lo = 0xff;
ldi R24,255
mov R6,R24
.dbline 185
; CRC16Hi = 0xff;
mov R12,R24
.dbline 186
; CL = 0x01;
clr R10
inc R10
.dbline 187
; CH = 0xa0;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -