📄 uartintr.lis
字号:
.module uartintr.c
.area vector(rom, abs)
.org 44
002C 0C941100 jmp _UART_RX_interrupt
.org 48
0030 0C943800 jmp _UART_TX_interrupt
.area text(rom, con, rel)
0000 .dbfile E:\avrwork3_pt100\uartintr.c
0000 .dbfunc e InitUART _InitUART fV
0000 ; x -> R10
0000 ; baudrate -> R16
.even
0000 _InitUART::
0000 0E940000 xcall push_gset3x
0004 .dbline -1
0004 .dbline 31
0004 ; /* Code adapted from Atmel AVR Application Note AVR306
0004 ; * Interrupt mode driver for UART.
0004 ; */
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ; #include "hal.h"
0004 ; #include "main.h"
0004 ; #include "uart.h"
0004 ;
0004 ;
0004 ; #pragma interrupt_handler UART_RX_interrupt:12 UART_TX_interrupt:13
0004 ;
0004 ; /* UART Buffer Defines */
0004 ; #define UART_RX_BUFFER_SIZE 128 /* 1,2,4,8,16,32,64,128 or 256 bytes */
0004 ; #define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
0004 ; #define UART_TX_BUFFER_SIZE 128 /* 1,2,4,8,16,32,64,128 or 256 bytes */
0004 ; #define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )
0004 ;
0004 ;
0004 ;
0004 ; /* Static Variables */
0004 ; static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
0004 ; static volatile unsigned char UART_RxHead;
0004 ; static volatile unsigned char UART_RxTail;
0004 ; static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
0004 ; static volatile unsigned char UART_TxHead;
0004 ; static volatile unsigned char UART_TxTail;
0004 ;
0004 ; /* initialize UART */
0004 ; void InitUART( unsigned char baudrate )
0004 ; {
0004 .dbline 33
0004 ; unsigned char x;
0004 ; UBRR = baudrate; /* set the baud rate */
0004 09B9 out 0x9,R16
0006 .dbline 37
0006 ; /* enable UART receiver and transmitter, and
0006 ; receive interrupt */
0006 ; // UCR = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
0006 ; UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
0006 88E9 ldi R24,152
0008 8AB9 out 0xa,R24
000A .dbline 38
000A ; x = 0; /* flush receive buffer */
000A AA24 clr R10
000C .dbline 39
000C ; UART_RxTail = x;
000C A0928200 sts _UART_RxTail,R10
0010 .dbline 40
0010 ; UART_RxHead = x;
0010 A0928300 sts _UART_RxHead,R10
0014 .dbline 41
0014 ; UART_TxTail = x;
0014 A0920000 sts _UART_TxTail,R10
0018 .dbline 42
0018 ; UART_TxHead = x;
0018 A0920100 sts _UART_TxHead,R10
001C .dbline -2
001C L1:
001C 0E940000 xcall pop_gset3x
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r x 10 c
0022 .dbsym r baudrate 16 c
0022 .dbend
0022 .dbfunc e UART_RX_interrupt _UART_RX_interrupt fV
0022 ; data -> R16
0022 ; tmphead -> R18
.even
0022 _UART_RX_interrupt::
0022 2A92 st -y,R2
0024 0A93 st -y,R16
0026 2A93 st -y,R18
0028 3A93 st -y,R19
002A 8A93 st -y,R24
002C 9A93 st -y,R25
002E EA93 st -y,R30
0030 FA93 st -y,R31
0032 2FB6 in R2,0x3f
0034 2A92 st -y,R2
0036 .dbline -1
0036 .dbline 47
0036 ; }
0036 ;
0036 ; /* interrupt handlers */
0036 ; void UART_RX_interrupt( void )
0036 ; {
0036 .dbline 50
0036 ; unsigned char data;
0036 ; unsigned char tmphead;
0036 ; data = UDR; /* read the received data */
0036 0CB1 in R16,0xc
0038 .dbline 52
0038 ; /* calculate buffer index */
0038 ; tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
0038 20918300 lds R18,_UART_RxHead
003C 2F5F subi R18,255 ; addi 1
003E 2F77 andi R18,127
0040 .dbline 53
0040 ; UART_RxHead = tmphead; /* store new index */
0040 20938300 sts _UART_RxHead,R18
0044 .dbline 54
0044 ; if ( tmphead == UART_RxTail )
0044 20908200 lds R2,_UART_RxTail
0048 2215 cp R18,R2
004A 01F4 brne L3
004C .dbline 55
004C ; {
004C .dbline 57
004C ; /* ERROR! Receive buffer overflow */
004C ; }
004C L3:
004C .dbline 58
004C ; UART_RxBuf[tmphead] = data; /* store received data in buffer */
004C 80E0 ldi R24,<_UART_RxBuf
004E 90E0 ldi R25,>_UART_RxBuf
0050 E22F mov R30,R18
0052 FF27 clr R31
0054 E80F add R30,R24
0056 F91F adc R31,R25
0058 0083 std z+0,R16
005A .dbline -2
005A L2:
005A 2990 ld R2,y+
005C 2FBE out 0x3f,R2
005E F991 ld R31,y+
0060 E991 ld R30,y+
0062 9991 ld R25,y+
0064 8991 ld R24,y+
0066 3991 ld R19,y+
0068 2991 ld R18,y+
006A 0991 ld R16,y+
006C 2990 ld R2,y+
006E .dbline 0 ; func end
006E 1895 reti
0070 .dbsym r data 16 c
0070 .dbsym r tmphead 18 c
0070 .dbend
0070 .dbfunc e UART_TX_interrupt _UART_TX_interrupt fV
0070 ; tmptail -> R16
.even
0070 _UART_TX_interrupt::
0070 2A92 st -y,R2
0072 3A92 st -y,R3
0074 0A93 st -y,R16
0076 1A93 st -y,R17
0078 8A93 st -y,R24
007A 9A93 st -y,R25
007C EA93 st -y,R30
007E FA93 st -y,R31
0080 2FB6 in R2,0x3f
0082 2A92 st -y,R2
0084 .dbline -1
0084 .dbline 62
0084 ; }
0084 ;
0084 ; void UART_TX_interrupt( void )
0084 ; {
0084 .dbline 66
0084 ; unsigned char tmptail;
0084 ;
0084 ; /* check if all data is transmitted */
0084 ; if ( UART_TxHead != UART_TxTail )
0084 20900000 lds R2,_UART_TxTail
0088 30900100 lds R3,_UART_TxHead
008C 3214 cp R3,R2
008E 79F0 breq L6
0090 .dbline 67
0090 ; {
0090 .dbline 69
0090 ; /* calculate buffer index */
0090 ; tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
0090 00910000 lds R16,_UART_TxTail
0094 0F5F subi R16,255 ; addi 1
0096 0F77 andi R16,127
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -