📄 uart.s
字号:
.module Uart.c
.area data(ram, con, rel)
_put_done::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_recv_done::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_newMSG::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_change_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_serial_recv_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area vector(rom, abs)
.org 72
jmp _uart0_rx_isr
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
_uart0_rx_isr::
xcall push_lset
; #include<iom128v.h>
; #include"comm.h"
; //UART0接口
;
;
; unsigned char put_done=0;
; unsigned char recv_done=0;
; unsigned char recvBuff[128];
; unsigned char newMSG=0;
; unsigned char i;
; unsigned char *serial_recv_MSG;
; unsigned char change_flag=0;
; unsigned char serial_recv_flag=0;
; extern int uart_receive_CMD(Uart_CMD *command);
;
; #pragma interrupt_handler uart0_rx_isr:19
; void uart0_rx_isr(void)
; {
; recv_done=1;
ldi R24,1
sts _recv_done,R24
; serial_get();
xcall _serial_get
L4:
xcall pop_lset
.dbline 0 ; func end
reti
.area vector(rom, abs)
.org 80
jmp _uart0_tx_isr
.area text(rom, con, rel)
.even
_uart0_tx_isr::
st -y,R24
in R24,0x3f
st -y,R24
; }
;
;
; #pragma interrupt_handler uart0_tx_isr:21
; void uart0_tx_isr(void)
; {
; put_done=1;
ldi R24,1
sts _put_done,R24
L5:
ld R24,y+
out 0x3f,R24
ld R24,y+
.dbline 0 ; func end
reti
; data -> R16
.even
_put::
; }
;
;
; //**********Put a single byte to the serial port.
; void put(unsigned char data)
; {
L7:
L8:
; while(!put_done)
lds R2,_put_done
tst R2
breq L7
; ;
; UDR0=data;
out 0xc,R16
; put_done=0;
clr R2
sts _put_done,R2
L6:
.dbline 0 ; func end
ret
; data -> R16
.even
_get::
; }
;
;
; //***********Receive a single byte from the serial port.
; unsigned char get()
; {
L11:
L12:
; unsigned char data;
; while(!recv_done)
lds R2,_recv_done
tst R2
breq L11
; ;
; data=UDR0;
in R16,0xc
; recv_done=0;
clr R2
sts _recv_done,R2
; return data;
L10:
.dbline 0 ; func end
ret
; length -> R20
; data -> R12
; m -> R10
; len -> R10
; serial_MSG -> R22,R23
.even
_serial_put::
xcall push_gset4
mov R10,R18
movw R22,R16
; }
;
;
; //**********Put a serial Frame to the serial port.
; void serial_put(unsigned char *serial_MSG,unsigned char len)
; {
; unsigned char m;
; unsigned char length;
; unsigned char data;
; // printf("u\n");
; put(0x7E);
ldi R16,126
xcall _put
; length=len;
mov R20,R10
;
; for(m=0;m<length;m++)
clr R10
xjmp L18
L15:
mov R30,R10
clr R31
add R30,R22
adc R31,R23
ldd R12,z+0
mov R16,R12
xcall _put
L16:
inc R10
L18:
cp R10,R20
brlo L15
; {
; data=*(serial_MSG+m);
; /* if(data==0x7E)
; {
; put(0x7D);
; put(0x5E);
; }
; else if(data==0x7D)
; {
; put(0x7D);
; put(0x5D);
; }
; else
; */
; {
; put(data);
; }
; }
; put(0x7E);
ldi R16,126
xcall _put
L14:
xcall pop_gset4
.dbline 0 ; func end
ret
; CMD_CRC -> <dead>
; uart_crc_high -> <dead>
; uart_crc_low -> <dead>
; CMD -> R22,R23
; data -> R20
.even
_serial_get::
xcall push_gset2
; }
;
; //**********Receive a serial Frame from the serial port.
; unsigned char *serial_get()
; {
; unsigned char data;
; unsigned char uart_crc_low,uart_crc_high;
; unsigned short int CMD_CRC;
; Uart_CMD *CMD;
; data=get();
xcall _get
mov R20,R16
;
; if(data==0x7E&&newMSG==0) //symbol for new msg
cpi R16,126
brne L20
lds R2,_newMSG
tst R2
brne L20
; {
; i=0;
clr R2
sts _i,R2
; newMSG=1;
ldi R24,1
sts _newMSG,R24
; recvBuff[i]=data;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
mov R30,R2
clr R31
add R30,R24
adc R31,R25
std z+0,R20
; //serial_recv_MSG=&recvBuff[i];
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
; }
xjmp L21
L20:
; else if(data==0x7E&&newMSG==1)
cpi R20,126
brne L22
lds R24,_newMSG
cpi R24,1
brne L22
; {
; newMSG=0;
clr R2
sts _newMSG,R2
; recvBuff[i]=data;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
lds R30,_i
clr R31
add R30,R24
adc R31,R25
std z+0,R20
; i=0;
sts _i,R2
; serial_recv_flag=1;
ldi R24,1
sts _serial_recv_flag,R24
; //CMD = (Uart_CMD *)serial_recv_MSG;
; CMD = (Uart_CMD *)&recvBuff[0];
ldi R22,<_recvBuff
ldi R23,>_recvBuff
; //CMD_CRC = xcrc_calc(uart_rx_buffer, 1, 2);
; //if(CMD_CRC == CMD->CRC)
; //{
; uart_receive_CMD(CMD); //一条消息发送完毕,在处理完本条消息后需要被置零
movw R16,R22
xcall _uart_receive_CMD
; //}
; }
xjmp L23
L22:
; else
; {
;
; recvBuff[i]=data;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
lds R30,_i
clr R31
add R30,R24
adc R31,R25
std z+0,R20
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
;
; }
L23:
L21:
;
; /*else
; {
; if(data==0x7D)
; {
; change_flag=1;
; }
; else if(change_flag==1)
; {
; switch(data)
; {
; case 0x5E: recvBuff[i]=0x7E;
; change_flag=0;
; i++;
; break;
; case 0x5D: recvBuff[i]=0x7D;
; change_flag=0;
; i++;
; break;
; default: break;
; }
; }
; else
; {
; recvBuff[i]=data;
; i++;
; }
;
; }*/
; return serial_recv_MSG;
lds R16,_serial_recv_MSG
lds R17,_serial_recv_MSG+1
L19:
xcall pop_gset2
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
_serial_recv_MSG::
.blkb 2
_i::
.blkb 1
_recvBuff::
.blkb 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -