📄 uartintr.s
字号:
.module uartintr.c
.area vector(rom, abs)
.org 44
jmp _UART_RX_interrupt
.org 48
jmp _UART_TX_interrupt
.area text(rom, con, rel)
.dbfile E:\avrwork3_pt100\uartintr.c
.dbfunc e InitUART _InitUART fV
; x -> R10
; baudrate -> R16
.even
_InitUART::
xcall push_gset3x
.dbline -1
.dbline 31
; /* Code adapted from Atmel AVR Application Note AVR306
; * Interrupt mode driver for UART.
; */
; #include <iom16v.h>
; #include <macros.h>
; #include "hal.h"
; #include "main.h"
; #include "uart.h"
;
;
; #pragma interrupt_handler UART_RX_interrupt:12 UART_TX_interrupt:13
;
; /* UART Buffer Defines */
; #define UART_RX_BUFFER_SIZE 128 /* 1,2,4,8,16,32,64,128 or 256 bytes */
; #define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
; #define UART_TX_BUFFER_SIZE 128 /* 1,2,4,8,16,32,64,128 or 256 bytes */
; #define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )
;
;
;
; /* Static Variables */
; static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
; static volatile unsigned char UART_RxHead;
; static volatile unsigned char UART_RxTail;
; static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
; static volatile unsigned char UART_TxHead;
; static volatile unsigned char UART_TxTail;
;
; /* initialize UART */
; void InitUART( unsigned char baudrate )
; {
.dbline 33
; unsigned char x;
; UBRR = baudrate; /* set the baud rate */
out 0x9,R16
.dbline 37
; /* enable UART receiver and transmitter, and
; receive interrupt */
; // UCR = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
; UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
ldi R24,152
out 0xa,R24
.dbline 38
; x = 0; /* flush receive buffer */
clr R10
.dbline 39
; UART_RxTail = x;
sts _UART_RxTail,R10
.dbline 40
; UART_RxHead = x;
sts _UART_RxHead,R10
.dbline 41
; UART_TxTail = x;
sts _UART_TxTail,R10
.dbline 42
; UART_TxHead = x;
sts _UART_TxHead,R10
.dbline -2
L1:
xcall pop_gset3x
.dbline 0 ; func end
ret
.dbsym r x 10 c
.dbsym r baudrate 16 c
.dbend
.dbfunc e UART_RX_interrupt _UART_RX_interrupt fV
; data -> R16
; tmphead -> R18
.even
_UART_RX_interrupt::
st -y,R2
st -y,R16
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 47
; }
;
; /* interrupt handlers */
; void UART_RX_interrupt( void )
; {
.dbline 50
; unsigned char data;
; unsigned char tmphead;
; data = UDR; /* read the received data */
in R16,0xc
.dbline 52
; /* calculate buffer index */
; tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
lds R18,_UART_RxHead
subi R18,255 ; addi 1
andi R18,127
.dbline 53
; UART_RxHead = tmphead; /* store new index */
sts _UART_RxHead,R18
.dbline 54
; if ( tmphead == UART_RxTail )
lds R2,_UART_RxTail
cp R18,R2
brne L3
.dbline 55
; {
.dbline 57
; /* ERROR! Receive buffer overflow */
; }
L3:
.dbline 58
; UART_RxBuf[tmphead] = data; /* store received data in buffer */
ldi R24,<_UART_RxBuf
ldi R25,>_UART_RxBuf
mov R30,R18
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline -2
L2:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R16,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r data 16 c
.dbsym r tmphead 18 c
.dbend
.dbfunc e UART_TX_interrupt _UART_TX_interrupt fV
; tmptail -> R16
.even
_UART_TX_interrupt::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 62
; }
;
; void UART_TX_interrupt( void )
; {
.dbline 66
; unsigned char tmptail;
;
; /* check if all data is transmitted */
; if ( UART_TxHead != UART_TxTail )
lds R2,_UART_TxTail
lds R3,_UART_TxHead
cp R3,R2
breq L6
.dbline 67
; {
.dbline 69
; /* calculate buffer index */
; tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
lds R16,_UART_TxTail
subi R16,255 ; addi 1
andi R16,127
.dbline 70
; UART_TxTail = tmptail; /* store new index */
sts _UART_TxTail,R16
.dbline 71
; UDR = UART_TxBuf[tmptail]; /* start transmition */
ldi R24,<_UART_TxBuf
ldi R25,>_UART_TxBuf
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 72
; }
xjmp L7
L6:
.dbline 74
.dbline 75
cbi 0xa,5
.dbline 76
L7:
.dbline -2
L5:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r tmptail 16 c
.dbend
.dbfunc e ReceiveByte _ReceiveByte fc
; tmptail -> R16
.even
_ReceiveByte::
.dbline -1
.dbline 81
; else
; {
; UCSRB &= ~(1<<UDRIE); /* disable UDRE interrupt */
; }
; }
;
; /* Read and write functions */
; unsigned char ReceiveByte( void )
; {
L9:
.dbline 85
L10:
.dbline 84
; unsigned char tmptail;
;
; while ( UART_RxHead == UART_RxTail ) /* wait for incomming data */
lds R2,_UART_RxTail
lds R3,_UART_RxHead
cp R3,R2
breq L9
.dbline 86
; ;
; tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* calculate buffer index */
lds R16,_UART_RxTail
subi R16,255 ; addi 1
andi R16,127
.dbline 87
; UART_RxTail = tmptail; /* store new index */
sts _UART_RxTail,R16
.dbline 88
; return UART_RxBuf[tmptail]; /* return data */
ldi R24,<_UART_RxBuf
ldi R25,>_UART_RxBuf
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbsym r tmptail 16 c
.dbend
.dbfunc e TransmitByte _TransmitByte fV
; tmphead -> R10
; data -> R16
.even
_TransmitByte::
xcall push_gset3x
.dbline -1
.dbline 92
; }
;
; void TransmitByte( unsigned char data )
; {
.dbline 95
; unsigned char tmphead;
; /* calculate buffer index */
; tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK;
lds R24,_UART_TxHead
subi R24,255 ; addi 1
andi R24,127
mov R10,R24
L13:
.dbline 99
L14:
.dbline 98
; /* wait for free space in buffer */
;
; while ( tmphead == UART_TxTail )
lds R2,_UART_TxTail
cp R10,R2
breq L13
.dbline 100
; ;
; UART_TxBuf[tmphead] = data; /* store data in buffer */
ldi R24,<_UART_TxBuf
ldi R25,>_UART_TxBuf
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 101
; UART_TxHead = tmphead; /* store new index */
sts _UART_TxHead,R10
.dbline 102
; UCSRB |= (1<<UDRIE); /* enable UDRE interrupt */
sbi 0xa,5
.dbline -2
L12:
xcall pop_gset3x
.dbline 0 ; func end
ret
.dbsym r tmphead 10 c
.dbsym r data 16 c
.dbend
.dbfunc e DataInReceiveBuffer _DataInReceiveBuffer fc
.even
_DataInReceiveBuffer::
.dbline -1
.dbline 106
; }
;
; unsigned char DataInReceiveBuffer( void )
; {
.dbline 107
; return ( UART_RxHead != UART_RxTail );
lds R2,_UART_RxTail
lds R3,_UART_RxHead
cp R3,R2
breq L17
ldi R16,1
ldi R17,0
xjmp L18
L17:
clr R16
clr R17
L18:
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile E:\avrwork3_pt100\uartintr.c
_UART_TxTail:
.blkb 1
.dbsym s UART_TxTail _UART_TxTail c
_UART_TxHead:
.blkb 1
.dbsym s UART_TxHead _UART_TxHead c
_UART_TxBuf:
.blkb 128
.dbsym s UART_TxBuf _UART_TxBuf A[128:128]c
_UART_RxTail:
.blkb 1
.dbsym s UART_RxTail _UART_RxTail c
_UART_RxHead:
.blkb 1
.dbsym s UART_RxHead _UART_RxHead c
_UART_RxBuf:
.blkb 128
.dbsym s UART_RxBuf _UART_RxBuf A[128:128]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -