⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartintr.s

📁 原创
💻 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 + -