📄 atmega16l_uart.lis
字号:
02F6 ; //发送数据
02F6 ; #pragma interrupt_handler Uart0_tx_isr:14
02F6 ; void Uart0_tx_isr(void)
02F6 ; {
02F6 .dbline 395
02F6 ; unsigned char tmp;
02F6 ; static unsigned char Status;
02F6 ; static unsigned int CRC,Count;
02F6 ; static unsigned char *p_uart;
02F6 ; struct StructOfProtocol *p_buf;
02F6 ; max485_on();
02F6 959A sbi 0x12,5
02F8 .dbline 396
02F8 ; switch(Status)
02F8 40910700 lds R20,L35
02FC 5527 clr R21
02FE 4030 cpi R20,0
0300 4507 cpc R20,R21
0302 C9F0 breq L42
0304 X27:
0304 4130 cpi R20,1
0306 E0E0 ldi R30,0
0308 5E07 cpc R21,R30
030A 01F1 breq L43
030C X28:
030C 4230 cpi R20,2
030E E0E0 ldi R30,0
0310 5E07 cpc R21,R30
0312 09F4 brne X37
0314 32C0 xjmp L46
0316 X37:
0316 X29:
0316 4330 cpi R20,3
0318 E0E0 ldi R30,0
031A 5E07 cpc R21,R30
031C 09F4 brne X38
031E 64C0 xjmp L49
0320 X38:
0320 X30:
0320 4430 cpi R20,4
0322 E0E0 ldi R30,0
0324 5E07 cpc R21,R30
0326 09F4 brne X39
0328 80C0 xjmp L52
032A X39:
032A X31:
032A 4530 cpi R20,5
032C E0E0 ldi R30,0
032E 5E07 cpc R21,R30
0330 09F4 brne X40
0332 88C0 xjmp L53
0334 X40:
0334 X32:
0334 92C0 xjmp L39
0336 L42:
0336 .dbline 399
0336 ; {
0336 ; case 0:
0336 ; Count = 1;
0336 81E0 ldi R24,1
0338 90E0 ldi R25,0
033A 90930B00 sts L37+1,R25
033E 80930A00 sts L37,R24
0342 .dbline 400
0342 ; Status++;
0342 80910700 lds R24,L35
0346 8F5F subi R24,255 ; addi 1
0348 80930700 sts L35,R24
034C L43:
034C .dbline 402
034C ; case 1: /*同步码发送*/
034C ; UDR = BOOT_CODE; /*发送同步码*/
034C 8EEF ldi R24,254
034E 8CB9 out 0xc,R24
0350 .dbline 403
0350 ; if(++Count>=2) Status++;/*发送2 byte同步码*/
0350 80910A00 lds R24,L37
0354 90910B00 lds R25,L37+1
0358 0196 adiw R24,1
035A 1C01 movw R2,R24
035C 30920B00 sts L37+1,R3
0360 20920A00 sts L37,R2
0364 8230 cpi R24,2
0366 E0E0 ldi R30,0
0368 9E07 cpc R25,R30
036A 08F4 brsh X41
036C 7FC0 xjmp L40
036E X41:
036E X33:
036E .dbline 403
036E 80910700 lds R24,L35
0372 8F5F subi R24,255 ; addi 1
0374 80930700 sts L35,R24
0378 .dbline 404
0378 ; break;
0378 79C0 xjmp L40
037A L46:
037A .dbline 406
037A ; case 2:
037A ; UDR = DEVICE_NUMBER;
037A 82E0 ldi R24,2
037C 8CB9 out 0xc,R24
037E .dbline 407
037E ; *p_uart = *Buffer485;
037E 20900000 lds R2,_Buffer485
0382 E0910C00 lds R30,L38
0386 F0910D00 lds R31,L38+1
038A 2082 std z+0,R2
038C .dbline 408
038C ; p_buf = (struct StructOfProtocol *)Buffer485;
038C 40E0 ldi R20,<_Buffer485
038E 50E0 ldi R21,>_Buffer485
0390 .dbline 409
0390 ; Count = p_buf->Length;
0390 FA01 movw R30,R20
0392 2180 ldd R2,z+1
0394 3280 ldd R3,z+2
0396 30920B00 sts L37+1,R3
039A 20920A00 sts L37,R2
039E .dbline 410
039E ; if (Count && Count <= (256 - 8)) /*包长度检查*/
039E 2220 tst R2
03A0 11F4 brne X34
03A2 3320 tst R3
03A4 E9F0 breq L47
03A6 X34:
03A6 88EF ldi R24,248
03A8 90E0 ldi R25,0
03AA 8215 cp R24,R2
03AC 9305 cpc R25,R3
03AE C0F0 brlo L47
03B0 X35:
03B0 .dbline 411
03B0 ; {
03B0 .dbline 412
03B0 ; p_uart = Buffer485; /*初始化数据发送指针*/
03B0 80E0 ldi R24,<_Buffer485
03B2 90E0 ldi R25,>_Buffer485
03B4 90930D00 sts L38+1,R25
03B8 80930C00 sts L38,R24
03BC .dbline 413
03BC ; CRC = 0xffff; /*初始化校验码*/
03BC 8FEF ldi R24,65535
03BE 9FEF ldi R25,255
03C0 90930900 sts L36+1,R25
03C4 80930800 sts L36,R24
03C8 .dbline 414
03C8 ; Count += 3;
03C8 C101 movw R24,R2
03CA 0396 adiw R24,3
03CC 90930B00 sts L37+1,R25
03D0 80930A00 sts L37,R24
03D4 .dbline 415
03D4 ; Status++;
03D4 80910700 lds R24,L35
03D8 8F5F subi R24,255 ; addi 1
03DA 80930700 sts L35,R24
03DE .dbline 416
03DE ; }
03DE 46C0 xjmp L40
03E0 L47:
03E0 .dbline 418
03E0 ; else /*包长度异常*/
03E0 ; {
03E0 .dbline 419
03E0 ; Status = 0; /*清状态标志*/
03E0 2224 clr R2
03E2 20920700 sts L35,R2
03E6 .dbline 420
03E6 ; }
03E6 .dbline 421
03E6 ; break;
03E6 42C0 xjmp L40
03E8 L49:
03E8 .dbline 423
03E8 ; case 3: /*数据包发送*/
03E8 ; tmp = *p_uart++; /*取发送数据*/
03E8 E0910C00 lds R30,L38
03EC F0910D00 lds R31,L38+1
03F0 A190 ld R10,Z+
03F2 F0930D00 sts L38+1,R31
03F6 E0930C00 sts L38,R30
03FA .dbline 424
03FA ; UDR = tmp; /*发送数据*/
03FA ACB8 out 0xc,R10
03FC .dbline 425
03FC ; CRC16(&CRC,tmp); /*数据校验*/
03FC 2A2D mov R18,R10
03FE 00E0 ldi R16,<L36
0400 10E0 ldi R17,>L36
0402 FEDD xcall _CRC16
0404 .dbline 426
0404 ; if (--Count == 0) Status++; /*数据包发送完毕*/
0404 40910A00 lds R20,L37
0408 50910B00 lds R21,L37+1
040C 4150 subi R20,1
040E 5040 sbci R21,0
0410 50930B00 sts L37+1,R21
0414 40930A00 sts L37,R20
0418 4030 cpi R20,0
041A 4507 cpc R20,R21
041C 39F5 brne L40
041E X36:
041E .dbline 426
041E 80910700 lds R24,L35
0422 8F5F subi R24,255 ; addi 1
0424 80930700 sts L35,R24
0428 .dbline 427
0428 ; break;
0428 21C0 xjmp L40
042A L52:
042A .dbline 429
042A ; case 4: /*高位校验码发送*/
042A ; UDR = CRC >> 8;
042A 20900800 lds R2,L36
042E 30900900 lds R3,L36+1
0432 232C mov R2,R3
0434 3324 clr R3
0436 2CB8 out 0xc,R2
0438 .dbline 430
0438 ; Status++;
0438 80910700 lds R24,L35
043C 8F5F subi R24,255 ; addi 1
043E 80930700 sts L35,R24
0442 .dbline 431
0442 ; break;
0442 14C0 xjmp L40
0444 L53:
0444 .dbline 433
0444 ; case 5: /*低位校验码发送*/
0444 ; UDR = CRC;
0444 20900800 lds R2,L36
0448 30900900 lds R3,L36+1
044C 2CB8 out 0xc,R2
044E .dbline 434
044E ; Status++;
044E 80910700 lds R24,L35
0452 8F5F subi R24,255 ; addi 1
0454 80930700 sts L35,R24
0458 .dbline 435
0458 ; break;
0458 09C0 xjmp L40
045A L39:
045A .dbline 437
045A ; default: /*结束发送*/
045A ; Status = Count = 0;
045A 2224 clr R2
045C 3324 clr R3
045E 30920B00 sts L37+1,R3
0462 20920A00 sts L37,R2
0466 20920700 sts L35,R2
046A .dbline 438
046A ; max485_off();
046A 9598 cbi 0x12,5
046C .dbline 439
046C ; break;
046C L40:
046C .dbline -2
046C L34:
046C .dbline 0 ; func end
046C 0E940000 xcall pop_xgset300C
0470 0990 ld R0,y+
0472 0FBE out 0x3f,R0
0474 F991 ld R31,y+
0476 E991 ld R30,y+
0478 B991 ld R27,y+
047A A991 ld R26,y+
047C 9991 ld R25,y+
047E 8991 ld R24,y+
0480 3991 ld R19,y+
0482 2991 ld R18,y+
0484 1991 ld R17,y+
0486 0991 ld R16,y+
0488 9990 ld R9,y+
048A 8990 ld R8,y+
048C 7990 ld R7,y+
048E 6990 ld R6,y+
0490 5990 ld R5,y+
0492 4990 ld R4,y+
0494 3990 ld R3,y+
0496 2990 ld R2,y+
0498 1990 ld R1,y+
049A 0990 ld R0,y+
049C 1895 reti
049E .dbsym r p_buf 20 pS[StructOfProtocol]
049E .dbsym r tmp 10 c
049E .dbend
049E ; }
049E ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -