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

📄 uartintr.lis

📁 原创
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -