📄 atmega16l_uart.s
字号:
xjmp L10
L26:
.dbline 363
; case 6: /*数据包接收*/
; *p_uart++ = tmp; /*接收数据*/
lds R30,L8
lds R31,L8+1
st Z+,R22
sts L8+1,R31
sts L8,R30
.dbline 364
; CRC16(&CRC,tmp); /*数据校验*/
mov R18,R22
ldi R16,<L6
ldi R17,>L6
xcall _CRC16
.dbline 365
; if (--Count == 0) Status++; /*数据包发送完毕?*/
lds R24,L7
lds R25,L7+1
sbiw R24,1
movw R12,R24
sts L7+1,R13
sts L7,R12
cpi R24,0
cpc R24,R25
breq X26
xjmp L10
X26:
X14:
.dbline 365
lds R24,L5
subi R24,255 ; addi 1
sts L5,R24
.dbline 366
; break;
xjmp L10
L29:
.dbline 368
; case 7: /*高位校验码接收*/
; CRC16(&CRC,tmp); /*数据校验*/
mov R18,R22
ldi R16,<L6
ldi R17,>L6
xcall _CRC16
.dbline 369
; Status++;
lds R24,L5
subi R24,255 ; addi 1
sts L5,R24
.dbline 370
; break;
xjmp L10
L30:
.dbline 372
; case 8: /*低位校验码接收*/
; CRC16(&CRC,tmp); /*数据校验*/
mov R18,R22
ldi R16,<L6
ldi R17,>L6
xcall _CRC16
.dbline 373
; p_buf = (struct StructOfProtocol *)Buffer485;
ldi R20,<_Buffer485
ldi R21,>_Buffer485
.dbline 374
; if (!CRC && (p_buf->Address == Device_Address || p_buf->Address == 0xff))
lds R2,L6
lds R3,L6+1
tst R2
brne L31
tst R3
brne L31
X15:
movw R30,R20
ldd R20,z+0
clr R21
lds R2,_Device_Address
cp R20,R2
breq L33
X16:
cpi R20,255
brne L31
X17:
L33:
.dbline 375
; {//接收完数据
.dbline 376
; communication->pc_rxd = 1;
ldi R24,1
movw R30,R10
std z+0,R24
.dbline 377
; }
L31:
.dbline 378
; Status = 0;
clr R2
sts L5,R2
.dbline 379
; break;
xjmp L10
L9:
.dbline 381
; default:
; Status = 0;
clr R2
sts L5,R2
.dbline 382
; break;
L10:
.dbline -2
L4:
.dbline 0 ; func end
xcall pop_xgsetF03C
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r communication 10 pS[data]
.dbsym r p_buf 20 pS[StructOfProtocol]
.dbsym r tmp 22 c
.dbend
.area vector(rom, abs)
.org 52
jmp _Uart0_tx_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\LCU904~1\固件程序\ATmega16L_Uart.C
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\LCU904~1\固件程序\ATmega16L_Uart.C
L35:
.blkb 1
L36:
.blkb 2
L37:
.blkb 2
L38:
.blkb 2
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\LCU904~1\固件程序\ATmega16L_Uart.C
.dbfunc e Uart0_tx_isr _Uart0_tx_isr fV
.dbsym s p_uart L38 pc
.dbsym s Count L37 i
.dbsym s CRC L36 i
.dbsym s Status L35 c
; p_buf -> R20,R21
; tmp -> R10
.even
_Uart0_tx_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_xgset300C
.dbline -1
.dbline 389
; }
; }
; //------------------------------------------------------------------------------
; //发送数据
; #pragma interrupt_handler Uart0_tx_isr:14
; void Uart0_tx_isr(void)
; {
.dbline 395
; unsigned char tmp;
; static unsigned char Status;
; static unsigned int CRC,Count;
; static unsigned char *p_uart;
; struct StructOfProtocol *p_buf;
; max485_on();
sbi 0x12,5
.dbline 396
; switch(Status)
lds R20,L35
clr R21
cpi R20,0
cpc R20,R21
breq L42
X27:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L43
X28:
cpi R20,2
ldi R30,0
cpc R21,R30
brne X37
xjmp L46
X37:
X29:
cpi R20,3
ldi R30,0
cpc R21,R30
brne X38
xjmp L49
X38:
X30:
cpi R20,4
ldi R30,0
cpc R21,R30
brne X39
xjmp L52
X39:
X31:
cpi R20,5
ldi R30,0
cpc R21,R30
brne X40
xjmp L53
X40:
X32:
xjmp L39
L42:
.dbline 399
; {
; case 0:
; Count = 1;
ldi R24,1
ldi R25,0
sts L37+1,R25
sts L37,R24
.dbline 400
; Status++;
lds R24,L35
subi R24,255 ; addi 1
sts L35,R24
L43:
.dbline 402
; case 1: /*同步码发送*/
; UDR = BOOT_CODE; /*发送同步码*/
ldi R24,254
out 0xc,R24
.dbline 403
; if(++Count>=2) Status++;/*发送2 byte同步码*/
lds R24,L37
lds R25,L37+1
adiw R24,1
movw R2,R24
sts L37+1,R3
sts L37,R2
cpi R24,2
ldi R30,0
cpc R25,R30
brsh X41
xjmp L40
X41:
X33:
.dbline 403
lds R24,L35
subi R24,255 ; addi 1
sts L35,R24
.dbline 404
; break;
xjmp L40
L46:
.dbline 406
; case 2:
; UDR = DEVICE_NUMBER;
ldi R24,2
out 0xc,R24
.dbline 407
; *p_uart = *Buffer485;
lds R2,_Buffer485
lds R30,L38
lds R31,L38+1
std z+0,R2
.dbline 408
; p_buf = (struct StructOfProtocol *)Buffer485;
ldi R20,<_Buffer485
ldi R21,>_Buffer485
.dbline 409
; Count = p_buf->Length;
movw R30,R20
ldd R2,z+1
ldd R3,z+2
sts L37+1,R3
sts L37,R2
.dbline 410
; if (Count && Count <= (256 - 8)) /*包长度检查*/
tst R2
brne X34
tst R3
breq L47
X34:
ldi R24,248
ldi R25,0
cp R24,R2
cpc R25,R3
brlo L47
X35:
.dbline 411
; {
.dbline 412
; p_uart = Buffer485; /*初始化数据发送指针*/
ldi R24,<_Buffer485
ldi R25,>_Buffer485
sts L38+1,R25
sts L38,R24
.dbline 413
; CRC = 0xffff; /*初始化校验码*/
ldi R24,65535
ldi R25,255
sts L36+1,R25
sts L36,R24
.dbline 414
; Count += 3;
movw R24,R2
adiw R24,3
sts L37+1,R25
sts L37,R24
.dbline 415
; Status++;
lds R24,L35
subi R24,255 ; addi 1
sts L35,R24
.dbline 416
; }
xjmp L40
L47:
.dbline 418
; else /*包长度异常*/
; {
.dbline 419
; Status = 0; /*清状态标志*/
clr R2
sts L35,R2
.dbline 420
; }
.dbline 421
; break;
xjmp L40
L49:
.dbline 423
; case 3: /*数据包发送*/
; tmp = *p_uart++; /*取发送数据*/
lds R30,L38
lds R31,L38+1
ld R10,Z+
sts L38+1,R31
sts L38,R30
.dbline 424
; UDR = tmp; /*发送数据*/
out 0xc,R10
.dbline 425
; CRC16(&CRC,tmp); /*数据校验*/
mov R18,R10
ldi R16,<L36
ldi R17,>L36
xcall _CRC16
.dbline 426
; if (--Count == 0) Status++; /*数据包发送完毕*/
lds R20,L37
lds R21,L37+1
subi R20,1
sbci R21,0
sts L37+1,R21
sts L37,R20
cpi R20,0
cpc R20,R21
brne L40
X36:
.dbline 426
lds R24,L35
subi R24,255 ; addi 1
sts L35,R24
.dbline 427
; break;
xjmp L40
L52:
.dbline 429
; case 4: /*高位校验码发送*/
; UDR = CRC >> 8;
lds R2,L36
lds R3,L36+1
mov R2,R3
clr R3
out 0xc,R2
.dbline 430
; Status++;
lds R24,L35
subi R24,255 ; addi 1
sts L35,R24
.dbline 431
; break;
xjmp L40
L53:
.dbline 433
; case 5: /*低位校验码发送*/
; UDR = CRC;
lds R2,L36
lds R3,L36+1
out 0xc,R2
.dbline 434
; Status++;
lds R24,L35
subi R24,255 ; addi 1
sts L35,R24
.dbline 435
; break;
xjmp L40
L39:
.dbline 437
; default: /*结束发送*/
; Status = Count = 0;
clr R2
clr R3
sts L37+1,R3
sts L37,R2
sts L35,R2
.dbline 438
; max485_off();
cbi 0x12,5
.dbline 439
; break;
L40:
.dbline -2
L34:
.dbline 0 ; func end
xcall pop_xgset300C
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r p_buf 20 pS[StructOfProtocol]
.dbsym r tmp 10 c
.dbend
; }
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -