Blame | Last modification | View Log | SVN | RSS feed
1 .file "uart.c"2 .arch atmega83 __SREG__ = 0x3f4 __SP_H__ = 0x3e5 __SP_L__ = 0x3d6 __tmp_reg__ = 07 __zero_reg__ = 18 .global __do_copy_data9 .global __do_clear_bss11 .text12 .Ltext0:84 .global __vector_1186 __vector_11:1:../avr-lib/drivers/uart/uart.c **** /*************************************************************************2:../avr-lib/drivers/uart/uart.c **** Title: Interrupt UART library with receive/transmit circular buffers3:../avr-lib/drivers/uart/uart.c **** Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury4:../avr-lib/drivers/uart/uart.c **** File: $Id: uart.c,v 1.5.2.10 2005/11/15 19:49:12 peter Exp $5:../avr-lib/drivers/uart/uart.c **** Software: AVR-GCC 3.36:../avr-lib/drivers/uart/uart.c **** Hardware: any AVR with built-in UART,7:../avr-lib/drivers/uart/uart.c **** tested on AT90S8515 at 4 Mhz and ATmega at 1Mhz8:../avr-lib/drivers/uart/uart.c ****9:../avr-lib/drivers/uart/uart.c **** DESCRIPTION:10:../avr-lib/drivers/uart/uart.c **** An interrupt is generated when the UART has finished transmitting or11:../avr-lib/drivers/uart/uart.c **** receiving a byte. The interrupt handling routines use circular buffers12:../avr-lib/drivers/uart/uart.c **** for buffering received and transmitted data.13:../avr-lib/drivers/uart/uart.c ****14:../avr-lib/drivers/uart/uart.c **** The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define15:../avr-lib/drivers/uart/uart.c **** the buffer size in bytes. Note that these variables must be a16:../avr-lib/drivers/uart/uart.c **** power of 2.17:../avr-lib/drivers/uart/uart.c ****18:../avr-lib/drivers/uart/uart.c **** USAGE:19:../avr-lib/drivers/uart/uart.c **** Refere to the header file uart.h for a description of the routines.20:../avr-lib/drivers/uart/uart.c **** See also example test_uart.c.21:../avr-lib/drivers/uart/uart.c ****22:../avr-lib/drivers/uart/uart.c **** NOTES:23:../avr-lib/drivers/uart/uart.c **** Based on Atmel Application Note AVR30624:../avr-lib/drivers/uart/uart.c ****25:../avr-lib/drivers/uart/uart.c **** *************************************************************************/26:../avr-lib/drivers/uart/uart.c **** #include <avr/io.h>27:../avr-lib/drivers/uart/uart.c **** #include <avr/interrupt.h>28:../avr-lib/drivers/uart/uart.c **** #include <avr/pgmspace.h>29:../avr-lib/drivers/uart/uart.c **** #include <drivers/uart/uart.h>30:../avr-lib/drivers/uart/uart.c ****31:../avr-lib/drivers/uart/uart.c ****32:../avr-lib/drivers/uart/uart.c **** /*33:../avr-lib/drivers/uart/uart.c **** * constants and macros34:../avr-lib/drivers/uart/uart.c **** */35:../avr-lib/drivers/uart/uart.c ****36:../avr-lib/drivers/uart/uart.c **** /* size of RX/TX buffers */37:../avr-lib/drivers/uart/uart.c **** #define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)38:../avr-lib/drivers/uart/uart.c **** #define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)39:../avr-lib/drivers/uart/uart.c ****40:../avr-lib/drivers/uart/uart.c **** #if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )41:../avr-lib/drivers/uart/uart.c **** #error RX buffer size is not a power of 242:../avr-lib/drivers/uart/uart.c **** #endif43:../avr-lib/drivers/uart/uart.c **** #if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )44:../avr-lib/drivers/uart/uart.c **** #error TX buffer size is not a power of 245:../avr-lib/drivers/uart/uart.c **** #endif46:../avr-lib/drivers/uart/uart.c ****47:../avr-lib/drivers/uart/uart.c **** #if defined(__AVR_AT90S2313__) \48:../avr-lib/drivers/uart/uart.c **** || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \49:../avr-lib/drivers/uart/uart.c **** || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \50:../avr-lib/drivers/uart/uart.c **** || defined(__AVR_ATmega103__)51:../avr-lib/drivers/uart/uart.c **** /* old AVR classic or ATmega103 with one UART */52:../avr-lib/drivers/uart/uart.c **** #define AT90_UART53:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV54:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA55:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS USR56:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCR57:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR58:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE59:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)60:../avr-lib/drivers/uart/uart.c **** /* old AVR classic with one UART */61:../avr-lib/drivers/uart/uart.c **** #define AT90_UART62:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV63:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA64:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSRA65:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSRB66:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR67:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE68:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \69:../avr-lib/drivers/uart/uart.c **** || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \70:../avr-lib/drivers/uart/uart.c **** || defined(__AVR_ATmega323__)71:../avr-lib/drivers/uart/uart.c **** /* ATmega with one USART */72:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART73:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV74:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA75:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSRA76:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSRB77:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR78:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE79:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega163__)80:../avr-lib/drivers/uart/uart.c **** /* ATmega163 with one UART */81:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_UART82:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV83:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA84:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSRA85:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSRB86:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR87:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE88:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega162__)89:../avr-lib/drivers/uart/uart.c **** /* ATmega with two USART */90:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART091:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART192:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_USART0_RECV93:../avr-lib/drivers/uart/uart.c **** #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV94:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_USART0_DATA95:../avr-lib/drivers/uart/uart.c **** #define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA96:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSR0A97:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSR0B98:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR099:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE0100:../avr-lib/drivers/uart/uart.c **** #define UART1_STATUS UCSR1A101:../avr-lib/drivers/uart/uart.c **** #define UART1_CONTROL UCSR1B102:../avr-lib/drivers/uart/uart.c **** #define UART1_DATA UDR1103:../avr-lib/drivers/uart/uart.c **** #define UART1_UDRIE UDRIE1104:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)105:../avr-lib/drivers/uart/uart.c **** /* ATmega with two USART */106:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART0107:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART1108:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_UART0_RECV109:../avr-lib/drivers/uart/uart.c **** #define UART1_RECEIVE_INTERRUPT SIG_UART1_RECV110:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_UART0_DATA111:../avr-lib/drivers/uart/uart.c **** #define UART1_TRANSMIT_INTERRUPT SIG_UART1_DATA112:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSR0A113:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSR0B114:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR0115:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE0116:../avr-lib/drivers/uart/uart.c **** #define UART1_STATUS UCSR1A117:../avr-lib/drivers/uart/uart.c **** #define UART1_CONTROL UCSR1B118:../avr-lib/drivers/uart/uart.c **** #define UART1_DATA UDR1119:../avr-lib/drivers/uart/uart.c **** #define UART1_UDRIE UDRIE1120:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega161__)121:../avr-lib/drivers/uart/uart.c **** /* ATmega with UART */122:../avr-lib/drivers/uart/uart.c **** #error "AVR ATmega161 currently not supported by this libaray !"123:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega169__)124:../avr-lib/drivers/uart/uart.c **** /* ATmega with one USART */125:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART126:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV127:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA128:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSRA129:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSRB130:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR131:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE132:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATmega48__) ||defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__)133:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART0134:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV135:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA136:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSR0A137:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSR0B138:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR0139:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE0140:../avr-lib/drivers/uart/uart.c **** #elif defined(__AVR_ATtiny2313__)141:../avr-lib/drivers/uart/uart.c **** #define ATMEGA_USART142:../avr-lib/drivers/uart/uart.c **** #define UART0_RECEIVE_INTERRUPT SIG_USART0_RX143:../avr-lib/drivers/uart/uart.c **** #define UART0_TRANSMIT_INTERRUPT SIG_USART0_UDRE144:../avr-lib/drivers/uart/uart.c **** #define UART0_STATUS UCSRA145:../avr-lib/drivers/uart/uart.c **** #define UART0_CONTROL UCSRB146:../avr-lib/drivers/uart/uart.c **** #define UART0_DATA UDR147:../avr-lib/drivers/uart/uart.c **** #define UART0_UDRIE UDRIE148:../avr-lib/drivers/uart/uart.c **** #else149:../avr-lib/drivers/uart/uart.c **** #error "no UART definition for MCU available"150:../avr-lib/drivers/uart/uart.c **** #endif151:../avr-lib/drivers/uart/uart.c ****152:../avr-lib/drivers/uart/uart.c ****153:../avr-lib/drivers/uart/uart.c **** /*154:../avr-lib/drivers/uart/uart.c **** * module global variables155:../avr-lib/drivers/uart/uart.c **** */156:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];157:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];158:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_TxHead;159:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_TxTail;160:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_RxHead;161:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_RxTail;162:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART_LastRxError;163:../avr-lib/drivers/uart/uart.c ****164:../avr-lib/drivers/uart/uart.c **** #if defined( ATMEGA_USART1 )165:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];166:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];167:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_TxHead;168:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_TxTail;169:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_RxHead;170:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_RxTail;171:../avr-lib/drivers/uart/uart.c **** static volatile unsigned char UART1_LastRxError;172:../avr-lib/drivers/uart/uart.c **** #endif173:../avr-lib/drivers/uart/uart.c ****174:../avr-lib/drivers/uart/uart.c ****175:../avr-lib/drivers/uart/uart.c ****176:../avr-lib/drivers/uart/uart.c **** SIGNAL(UART0_RECEIVE_INTERRUPT)177:../avr-lib/drivers/uart/uart.c **** /*************************************************************************178:../avr-lib/drivers/uart/uart.c **** Function: UART Receive Complete interrupt179:../avr-lib/drivers/uart/uart.c **** Purpose: called when the UART has received a character180:../avr-lib/drivers/uart/uart.c **** **************************************************************************/181:../avr-lib/drivers/uart/uart.c **** {88 .LM0:89 /* prologue: frame size=0 */90 0000 1F92 push __zero_reg__91 0002 0F92 push __tmp_reg__92 0004 0FB6 in __tmp_reg__,__SREG__93 0006 0F92 push __tmp_reg__94 0008 1124 clr __zero_reg__95 000a 2F93 push r1896 000c 8F93 push r2497 000e 9F93 push r2598 0010 EF93 push r3099 0012 FF93 push r31100 /* prologue end (size=10) */182:../avr-lib/drivers/uart/uart.c **** unsigned char tmphead;183:../avr-lib/drivers/uart/uart.c **** unsigned char data;184:../avr-lib/drivers/uart/uart.c **** unsigned char usr;185:../avr-lib/drivers/uart/uart.c **** unsigned char lastRxError;186:../avr-lib/drivers/uart/uart.c ****187:../avr-lib/drivers/uart/uart.c ****188:../avr-lib/drivers/uart/uart.c **** /* read UART status register and UART data register */189:../avr-lib/drivers/uart/uart.c **** usr = UART0_STATUS;102 .LM1:103 0014 9BB1 in r25,43-0x20190:../avr-lib/drivers/uart/uart.c **** data = UART0_DATA;105 .LM2:106 0016 2CB1 in r18,44-0x20191:../avr-lib/drivers/uart/uart.c ****192:../avr-lib/drivers/uart/uart.c **** /* */193:../avr-lib/drivers/uart/uart.c **** #if defined( AT90_UART )194:../avr-lib/drivers/uart/uart.c **** lastRxError = (usr & (_BV(FE)|_BV(DOR)) );195:../avr-lib/drivers/uart/uart.c **** #elif defined( ATMEGA_USART )196:../avr-lib/drivers/uart/uart.c **** lastRxError = (usr & (_BV(FE)|_BV(DOR)) );197:../avr-lib/drivers/uart/uart.c **** #elif defined( ATMEGA_USART0 )198:../avr-lib/drivers/uart/uart.c **** lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );199:../avr-lib/drivers/uart/uart.c **** #elif defined ( ATMEGA_UART )200:../avr-lib/drivers/uart/uart.c **** lastRxError = (usr & (_BV(FE)|_BV(DOR)) );201:../avr-lib/drivers/uart/uart.c **** #endif202:../avr-lib/drivers/uart/uart.c ****203:../avr-lib/drivers/uart/uart.c **** /* calculate buffer index */204:../avr-lib/drivers/uart/uart.c **** tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;108 .LM3:109 0018 E091 0000 lds r30,UART_RxHead110 001c EF5F subi r30,lo8(-(1))111 001e EF71 andi r30,lo8(31)205:../avr-lib/drivers/uart/uart.c ****206:../avr-lib/drivers/uart/uart.c **** if ( tmphead == UART_RxTail ) {113 .LM4:114 0020 8091 0000 lds r24,UART_RxTail115 0024 E817 cp r30,r24116 0026 11F4 brne .L2118 .LM5:119 0028 82E0 ldi r24,lo8(2)120 002a 08C0 rjmp .L4121 .L2:123 .LM6:124 002c 892F mov r24,r25125 002e 8871 andi r24,lo8(24)207:../avr-lib/drivers/uart/uart.c **** /* error: receive buffer overflow */208:../avr-lib/drivers/uart/uart.c **** lastRxError = UART_BUFFER_OVERFLOW >> 8;209:../avr-lib/drivers/uart/uart.c **** }else{210:../avr-lib/drivers/uart/uart.c **** /* store new index */211:../avr-lib/drivers/uart/uart.c **** UART_RxHead = tmphead;127 .LM7:128 0030 E093 0000 sts UART_RxHead,r30212:../avr-lib/drivers/uart/uart.c **** /* store received data in buffer */213:../avr-lib/drivers/uart/uart.c **** UART_RxBuf[tmphead] = data;130 .LM8:131 0034 FF27 clr r31132 0036 E050 subi r30,lo8(-(UART_RxBuf))133 0038 F040 sbci r31,hi8(-(UART_RxBuf))134 003a 2083 st Z,r18135 .L4:214:../avr-lib/drivers/uart/uart.c **** }215:../avr-lib/drivers/uart/uart.c **** UART_LastRxError = lastRxError;137 .LM9:138 003c 8093 0000 sts UART_LastRxError,r24139 /* epilogue: frame size=0 */140 0040 FF91 pop r31141 0042 EF91 pop r30142 0044 9F91 pop r25143 0046 8F91 pop r24144 0048 2F91 pop r18145 004a 0F90 pop __tmp_reg__146 004c 0FBE out __SREG__,__tmp_reg__147 004e 0F90 pop __tmp_reg__148 0050 1F90 pop __zero_reg__149 0052 1895 reti150 /* epilogue end (size=10) */151 /* function __vector_11 size 42 (22) */159 .Lscope0:161 .global __vector_12163 __vector_12:216:../avr-lib/drivers/uart/uart.c **** }217:../avr-lib/drivers/uart/uart.c ****218:../avr-lib/drivers/uart/uart.c ****219:../avr-lib/drivers/uart/uart.c **** SIGNAL(UART0_TRANSMIT_INTERRUPT)220:../avr-lib/drivers/uart/uart.c **** /*************************************************************************221:../avr-lib/drivers/uart/uart.c **** Function: UART Data Register Empty interrupt222:../avr-lib/drivers/uart/uart.c **** Purpose: called when the UART is ready to transmit the next byte223:../avr-lib/drivers/uart/uart.c **** **************************************************************************/224:../avr-lib/drivers/uart/uart.c **** {165 .LM10:166 /* prologue: frame size=0 */167 0054 1F92 push __zero_reg__168 0056 0F92 push __tmp_reg__169 0058 0FB6 in __tmp_reg__,__SREG__170 005a 0F92 push __tmp_reg__171 005c 1124 clr __zero_reg__172 005e 8F93 push r24173 0060 9F93 push r25174 0062 EF93 push r30175 0064 FF93 push r31176 /* prologue end (size=9) */225:../avr-lib/drivers/uart/uart.c **** unsigned char tmptail;226:../avr-lib/drivers/uart/uart.c ****227:../avr-lib/drivers/uart/uart.c ****228:../avr-lib/drivers/uart/uart.c **** if ( UART_TxHead != UART_TxTail) {178 .LM11:179 0066 9091 0000 lds r25,UART_TxHead180 006a 8091 0000 lds r24,UART_TxTail181 006e 9817 cp r25,r24182 0070 61F0 breq .L7229:../avr-lib/drivers/uart/uart.c **** /* calculate and store new buffer index */230:../avr-lib/drivers/uart/uart.c **** tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;184 .LM12:185 0072 E091 0000 lds r30,UART_TxTail186 0076 EF5F subi r30,lo8(-(1))187 0078 EF71 andi r30,lo8(31)231:../avr-lib/drivers/uart/uart.c **** UART_TxTail = tmptail;189 .LM13:190 007a E093 0000 sts UART_TxTail,r30232:../avr-lib/drivers/uart/uart.c **** /* get one byte from buffer and write it to UART */233:../avr-lib/drivers/uart/uart.c **** UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */192 .LM14:193 007e FF27 clr r31194 0080 E050 subi r30,lo8(-(UART_TxBuf))195 0082 F040 sbci r31,hi8(-(UART_TxBuf))196 0084 8081 ld r24,Z197 0086 8CB9 out 44-0x20,r24198 0088 01C0 rjmp .L10199 .L7:234:../avr-lib/drivers/uart/uart.c **** }else{235:../avr-lib/drivers/uart/uart.c **** /* tx buffer empty, disable UDRE interrupt */236:../avr-lib/drivers/uart/uart.c **** UART0_CONTROL &= ~_BV(UART0_UDRIE);201 .LM15:202 008a 5598 cbi 42-0x20,5203 .L10:204 /* epilogue: frame size=0 */205 008c FF91 pop r31206 008e EF91 pop r30207 0090 9F91 pop r25208 0092 8F91 pop r24209 0094 0F90 pop __tmp_reg__210 0096 0FBE out __SREG__,__tmp_reg__211 0098 0F90 pop __tmp_reg__212 009a 1F90 pop __zero_reg__213 009c 1895 reti214 /* epilogue end (size=9) */215 /* function __vector_12 size 37 (19) */220 .Lscope1:223 .global uart_init225 uart_init:237:../avr-lib/drivers/uart/uart.c **** }238:../avr-lib/drivers/uart/uart.c **** }239:../avr-lib/drivers/uart/uart.c ****240:../avr-lib/drivers/uart/uart.c ****241:../avr-lib/drivers/uart/uart.c **** /*************************************************************************242:../avr-lib/drivers/uart/uart.c **** Function: uart_init()243:../avr-lib/drivers/uart/uart.c **** Purpose: initialize UART and set baudrate244:../avr-lib/drivers/uart/uart.c **** Input: baudrate using macro UART_BAUD_SELECT()245:../avr-lib/drivers/uart/uart.c **** Returns: none246:../avr-lib/drivers/uart/uart.c **** **************************************************************************/247:../avr-lib/drivers/uart/uart.c **** void uart_init(unsigned int baudrate)248:../avr-lib/drivers/uart/uart.c **** {227 .LM16:228 /* prologue: frame size=0 */229 /* prologue end (size=0) */230 009e 9C01 movw r18,r24249:../avr-lib/drivers/uart/uart.c **** UART_TxHead = 0;232 .LM17:233 00a0 1092 0000 sts UART_TxHead,__zero_reg__250:../avr-lib/drivers/uart/uart.c **** UART_TxTail = 0;235 .LM18:236 00a4 1092 0000 sts UART_TxTail,__zero_reg__251:../avr-lib/drivers/uart/uart.c **** UART_RxHead = 0;238 .LM19:239 00a8 1092 0000 sts UART_RxHead,__zero_reg__252:../avr-lib/drivers/uart/uart.c **** UART_RxTail = 0;241 .LM20:242 00ac 1092 0000 sts UART_RxTail,__zero_reg__253:../avr-lib/drivers/uart/uart.c ****254:../avr-lib/drivers/uart/uart.c **** #if defined( AT90_UART )255:../avr-lib/drivers/uart/uart.c **** /* set baud rate */256:../avr-lib/drivers/uart/uart.c **** UBRR = (unsigned char)baudrate;257:../avr-lib/drivers/uart/uart.c ****258:../avr-lib/drivers/uart/uart.c **** /* enable UART receiver and transmmitter and receive complete interrupt */259:../avr-lib/drivers/uart/uart.c **** UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);260:../avr-lib/drivers/uart/uart.c ****261:../avr-lib/drivers/uart/uart.c **** #elif defined (ATMEGA_USART)262:../avr-lib/drivers/uart/uart.c **** /* Set baud rate */263:../avr-lib/drivers/uart/uart.c **** if ( baudrate & 0x8000 )244 .LM21:245 00b0 97FF sbrs r25,7246 00b2 03C0 rjmp .L12264:../avr-lib/drivers/uart/uart.c **** {265:../avr-lib/drivers/uart/uart.c **** UART0_STATUS = (1<<U2X); //Enable 2x speed248 .LM22:249 00b4 82E0 ldi r24,lo8(2)250 00b6 8BB9 out 43-0x20,r24266:../avr-lib/drivers/uart/uart.c **** baudrate &= ~0x8000;252 .LM23:253 00b8 3F77 andi r19,hi8(32767)254 .L12:267:../avr-lib/drivers/uart/uart.c **** }268:../avr-lib/drivers/uart/uart.c **** UBRRH = (unsigned char)(baudrate>>8);256 .LM24:257 00ba 832F mov r24,r19258 00bc 9927 clr r25259 00be 80BD out 64-0x20,r24269:../avr-lib/drivers/uart/uart.c **** UBRRL = (unsigned char) baudrate;261 .LM25:262 00c0 29B9 out 41-0x20,r18270:../avr-lib/drivers/uart/uart.c ****271:../avr-lib/drivers/uart/uart.c **** /* Enable USART receiver and transmitter and receive complete interrupt */272:../avr-lib/drivers/uart/uart.c **** UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);264 .LM26:265 00c2 88E9 ldi r24,lo8(-104)266 00c4 8AB9 out 42-0x20,r24273:../avr-lib/drivers/uart/uart.c ****274:../avr-lib/drivers/uart/uart.c **** /* Set frame format: asynchronous, 8data, no parity, 1stop bit */275:../avr-lib/drivers/uart/uart.c **** #ifdef URSEL276:../avr-lib/drivers/uart/uart.c **** UCSRC = (1<<URSEL)|(3<<UCSZ0);268 .LM27:269 00c6 86E8 ldi r24,lo8(-122)270 00c8 80BD out 64-0x20,r24271 /* epilogue: frame size=0 */272 00ca 0895 ret273 /* epilogue end (size=1) */274 /* function uart_init size 24 (23) */276 .Lscope2:278 .global uart_getc280 uart_getc:277:../avr-lib/drivers/uart/uart.c **** #else278:../avr-lib/drivers/uart/uart.c **** UCSRC = (3<<UCSZ0);279:../avr-lib/drivers/uart/uart.c **** #endif280:../avr-lib/drivers/uart/uart.c ****281:../avr-lib/drivers/uart/uart.c **** #elif defined (ATMEGA_USART0 )282:../avr-lib/drivers/uart/uart.c **** /* Set baud rate */283:../avr-lib/drivers/uart/uart.c **** if ( baudrate & 0x8000 )284:../avr-lib/drivers/uart/uart.c **** {285:../avr-lib/drivers/uart/uart.c **** UART0_STATUS = (1<<U2X0); //Enable 2x speed286:../avr-lib/drivers/uart/uart.c **** baudrate &= ~0x8000;287:../avr-lib/drivers/uart/uart.c **** }288:../avr-lib/drivers/uart/uart.c **** UBRR0H = (unsigned char)(baudrate>>8);289:../avr-lib/drivers/uart/uart.c **** UBRR0L = (unsigned char) baudrate;290:../avr-lib/drivers/uart/uart.c ****291:../avr-lib/drivers/uart/uart.c **** /* Enable USART receiver and transmitter and receive complete interrupt */292:../avr-lib/drivers/uart/uart.c **** UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);293:../avr-lib/drivers/uart/uart.c ****294:../avr-lib/drivers/uart/uart.c **** /* Set frame format: asynchronous, 8data, no parity, 1stop bit */295:../avr-lib/drivers/uart/uart.c **** #ifdef URSEL0296:../avr-lib/drivers/uart/uart.c **** UCSR0C = (1<<URSEL0)|(3<<UCSZ00);297:../avr-lib/drivers/uart/uart.c **** #else298:../avr-lib/drivers/uart/uart.c **** UCSR0C = (3<<UCSZ00);299:../avr-lib/drivers/uart/uart.c **** #endif300:../avr-lib/drivers/uart/uart.c ****301:../avr-lib/drivers/uart/uart.c **** #elif defined ( ATMEGA_UART )302:../avr-lib/drivers/uart/uart.c **** /* set baud rate */303:../avr-lib/drivers/uart/uart.c **** if ( baudrate & 0x8000 )304:../avr-lib/drivers/uart/uart.c **** {305:../avr-lib/drivers/uart/uart.c **** UART0_STATUS = (1<<U2X); //Enable 2x speed306:../avr-lib/drivers/uart/uart.c **** baudrate &= ~0x8000;307:../avr-lib/drivers/uart/uart.c **** }308:../avr-lib/drivers/uart/uart.c **** UBRRHI = (unsigned char)(baudrate>>8);309:../avr-lib/drivers/uart/uart.c **** UBRR = (unsigned char) baudrate;310:../avr-lib/drivers/uart/uart.c ****311:../avr-lib/drivers/uart/uart.c **** /* Enable UART receiver and transmitter and receive complete interrupt */312:../avr-lib/drivers/uart/uart.c **** UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);313:../avr-lib/drivers/uart/uart.c ****314:../avr-lib/drivers/uart/uart.c **** #endif315:../avr-lib/drivers/uart/uart.c ****316:../avr-lib/drivers/uart/uart.c **** }/* uart_init */317:../avr-lib/drivers/uart/uart.c ****318:../avr-lib/drivers/uart/uart.c ****319:../avr-lib/drivers/uart/uart.c **** /*************************************************************************320:../avr-lib/drivers/uart/uart.c **** Function: uart_getc()321:../avr-lib/drivers/uart/uart.c **** Purpose: return byte from ringbuffer322:../avr-lib/drivers/uart/uart.c **** Returns: lower byte: received byte from ringbuffer323:../avr-lib/drivers/uart/uart.c **** higher byte: last receive error324:../avr-lib/drivers/uart/uart.c **** **************************************************************************/325:../avr-lib/drivers/uart/uart.c **** unsigned int uart_getc(void)326:../avr-lib/drivers/uart/uart.c **** {282 .LM28:283 /* prologue: frame size=0 */284 /* prologue end (size=0) */327:../avr-lib/drivers/uart/uart.c **** unsigned char tmptail;328:../avr-lib/drivers/uart/uart.c **** unsigned char data;329:../avr-lib/drivers/uart/uart.c ****330:../avr-lib/drivers/uart/uart.c ****331:../avr-lib/drivers/uart/uart.c **** if ( UART_RxHead == UART_RxTail ) {286 .LM29:287 00cc 9091 0000 lds r25,UART_RxHead288 00d0 8091 0000 lds r24,UART_RxTail289 00d4 9817 cp r25,r24290 00d6 19F4 brne .L16292 .LM30:293 00d8 80E0 ldi r24,lo8(256)294 00da 91E0 ldi r25,hi8(256)295 00dc 0895 ret296 .L16:332:../avr-lib/drivers/uart/uart.c **** return UART_NO_DATA; /* no data available */333:../avr-lib/drivers/uart/uart.c **** }334:../avr-lib/drivers/uart/uart.c ****335:../avr-lib/drivers/uart/uart.c **** /* calculate /store buffer index */336:../avr-lib/drivers/uart/uart.c **** tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;298 .LM31:299 00de E091 0000 lds r30,UART_RxTail300 00e2 EF5F subi r30,lo8(-(1))301 00e4 EF71 andi r30,lo8(31)337:../avr-lib/drivers/uart/uart.c **** UART_RxTail = tmptail;303 .LM32:304 00e6 E093 0000 sts UART_RxTail,r30338:../avr-lib/drivers/uart/uart.c ****339:../avr-lib/drivers/uart/uart.c **** /* get data from receive buffer */340:../avr-lib/drivers/uart/uart.c **** data = UART_RxBuf[tmptail];306 .LM33:307 00ea FF27 clr r31308 00ec E050 subi r30,lo8(-(UART_RxBuf))309 00ee F040 sbci r31,hi8(-(UART_RxBuf))310 00f0 2081 ld r18,Z341:../avr-lib/drivers/uart/uart.c ****342:../avr-lib/drivers/uart/uart.c **** return (UART_LastRxError << 8) + data;312 .LM34:313 00f2 8091 0000 lds r24,UART_LastRxError314 00f6 9927 clr r25315 00f8 982F mov r25,r24316 00fa 8827 clr r24317 00fc 820F add r24,r18318 00fe 911D adc r25,__zero_reg__343:../avr-lib/drivers/uart/uart.c ****344:../avr-lib/drivers/uart/uart.c **** }/* uart_getc */320 .LM35:321 0100 0895 ret322 /* epilogue: frame size=0 */323 /* epilogue: noreturn */324 /* epilogue end (size=0) */325 /* function uart_getc size 27 (27) */331 .Lscope3:334 .global uart_putc336 uart_putc:345:../avr-lib/drivers/uart/uart.c ****346:../avr-lib/drivers/uart/uart.c ****347:../avr-lib/drivers/uart/uart.c **** /*************************************************************************348:../avr-lib/drivers/uart/uart.c **** Function: uart_putc()349:../avr-lib/drivers/uart/uart.c **** Purpose: write byte to ringbuffer for transmitting via UART350:../avr-lib/drivers/uart/uart.c **** Input: byte to be transmitted351:../avr-lib/drivers/uart/uart.c **** Returns: none352:../avr-lib/drivers/uart/uart.c **** **************************************************************************/353:../avr-lib/drivers/uart/uart.c **** void uart_putc(unsigned char data)354:../avr-lib/drivers/uart/uart.c **** {338 .LM36:339 /* prologue: frame size=0 */340 /* prologue end (size=0) */341 0102 282F mov r18,r24355:../avr-lib/drivers/uart/uart.c **** unsigned char tmphead;356:../avr-lib/drivers/uart/uart.c ****357:../avr-lib/drivers/uart/uart.c ****358:../avr-lib/drivers/uart/uart.c **** tmphead = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;343 .LM37:344 0104 9091 0000 lds r25,UART_TxHead345 0108 9F5F subi r25,lo8(-(1))346 010a 9F71 andi r25,lo8(31)347 .L21:359:../avr-lib/drivers/uart/uart.c ****360:../avr-lib/drivers/uart/uart.c **** while ( tmphead == UART_TxTail ){349 .LM38:350 010c 8091 0000 lds r24,UART_TxTail351 0110 9817 cp r25,r24352 0112 E1F3 breq .L21361:../avr-lib/drivers/uart/uart.c **** ;/* wait for free space in buffer */362:../avr-lib/drivers/uart/uart.c **** }363:../avr-lib/drivers/uart/uart.c ****364:../avr-lib/drivers/uart/uart.c **** UART_TxBuf[tmphead] = data;354 .LM39:355 0114 E92F mov r30,r25356 0116 FF27 clr r31357 0118 E050 subi r30,lo8(-(UART_TxBuf))358 011a F040 sbci r31,hi8(-(UART_TxBuf))359 011c 2083 st Z,r18365:../avr-lib/drivers/uart/uart.c **** UART_TxHead = tmphead;361 .LM40:362 011e 9093 0000 sts UART_TxHead,r25366:../avr-lib/drivers/uart/uart.c ****367:../avr-lib/drivers/uart/uart.c **** /* enable UDRE interrupt */368:../avr-lib/drivers/uart/uart.c **** UART0_CONTROL |= _BV(UART0_UDRIE);364 .LM41:365 0122 559A sbi 42-0x20,5366 /* epilogue: frame size=0 */367 0124 0895 ret368 /* epilogue end (size=1) */369 /* function uart_putc size 18 (17) */374 .Lscope4:377 .global uart_puts379 uart_puts:369:../avr-lib/drivers/uart/uart.c ****370:../avr-lib/drivers/uart/uart.c **** }/* uart_putc */371:../avr-lib/drivers/uart/uart.c ****372:../avr-lib/drivers/uart/uart.c ****373:../avr-lib/drivers/uart/uart.c **** /*************************************************************************374:../avr-lib/drivers/uart/uart.c **** Function: uart_puts()375:../avr-lib/drivers/uart/uart.c **** Purpose: transmit string to UART376:../avr-lib/drivers/uart/uart.c **** Input: string to be transmitted377:../avr-lib/drivers/uart/uart.c **** Returns: none378:../avr-lib/drivers/uart/uart.c **** **************************************************************************/379:../avr-lib/drivers/uart/uart.c **** void uart_puts(const char *s )380:../avr-lib/drivers/uart/uart.c **** {381 .LM42:382 /* prologue: frame size=0 */383 0126 CF93 push r28384 0128 DF93 push r29385 /* prologue end (size=2) */386 012a EC01 movw r28,r24387 012c 02C0 rjmp .L27388 .L28:381:../avr-lib/drivers/uart/uart.c **** while (*s)382:../avr-lib/drivers/uart/uart.c **** uart_putc(*s++);390 .LM43:391 012e 2196 adiw r28,1392 0130 E8DF rcall uart_putc393 .L27:395 .LM44:396 0132 8881 ld r24,Y397 0134 8823 tst r24398 0136 D9F7 brne .L28399 /* epilogue: frame size=0 */400 0138 DF91 pop r29401 013a CF91 pop r28402 013c 0895 ret403 /* epilogue end (size=3) */404 /* function uart_puts size 12 (7) */406 .Lscope5:409 .global uart_puts_p411 uart_puts_p:383:../avr-lib/drivers/uart/uart.c ****384:../avr-lib/drivers/uart/uart.c **** }/* uart_puts */385:../avr-lib/drivers/uart/uart.c ****386:../avr-lib/drivers/uart/uart.c ****387:../avr-lib/drivers/uart/uart.c **** /*************************************************************************388:../avr-lib/drivers/uart/uart.c **** Function: uart_puts_p()389:../avr-lib/drivers/uart/uart.c **** Purpose: transmit string from program memory to UART390:../avr-lib/drivers/uart/uart.c **** Input: program memory string to be transmitted391:../avr-lib/drivers/uart/uart.c **** Returns: none392:../avr-lib/drivers/uart/uart.c **** **************************************************************************/393:../avr-lib/drivers/uart/uart.c **** void uart_puts_p(const char *progmem_s )394:../avr-lib/drivers/uart/uart.c **** {413 .LM45:414 /* prologue: frame size=0 */415 013e CF93 push r28416 0140 DF93 push r29417 /* prologue end (size=2) */418 0142 EC01 movw r28,r24419 0144 01C0 rjmp .L32420 .L33:395:../avr-lib/drivers/uart/uart.c **** register char c;396:../avr-lib/drivers/uart/uart.c ****397:../avr-lib/drivers/uart/uart.c **** while ( (c = pgm_read_byte(progmem_s++)) )398:../avr-lib/drivers/uart/uart.c **** uart_putc(c);422 .LM46:423 0146 DDDF rcall uart_putc424 .L32:425 0148 FE01 movw r30,r28426 .LBB2:428 .LM47:429 014a 2196 adiw r28,1430 /* #APP */431 014c 8491 lpm r24, Z432433 /* #NOAPP */434 .LBE2:435 014e 8823 tst r24436 0150 D1F7 brne .L33437 /* epilogue: frame size=0 */438 0152 DF91 pop r29439 0154 CF91 pop r28440 0156 0895 ret441 /* epilogue end (size=3) */442 /* function uart_puts_p size 16 (11) */448 .Lscope6:449 .lcomm UART_TxBuf,32450 .lcomm UART_RxBuf,32451 .lcomm UART_TxHead,1452 .lcomm UART_TxTail,1453 .lcomm UART_RxHead,1454 .lcomm UART_RxTail,1455 .lcomm UART_LastRxError,1464 .Letext0:465 /* File "../avr-lib/drivers/uart/uart.c": code 176 = 0x00b0 ( 126), prologues 23, epilogues 27 *DEFINED SYMBOLS*ABS*:00000000 uart.c/tmp/ccG6wxDo.s:3 *ABS*:0000003f __SREG__/tmp/ccG6wxDo.s:4 *ABS*:0000003e __SP_H__/tmp/ccG6wxDo.s:5 *ABS*:0000003d __SP_L__/tmp/ccG6wxDo.s:6 *ABS*:00000000 __tmp_reg__/tmp/ccG6wxDo.s:7 *ABS*:00000001 __zero_reg__/tmp/ccG6wxDo.s:86 .text:00000000 __vector_11/tmp/ccG6wxDo.s:452 .bss:00000042 UART_RxHead/tmp/ccG6wxDo.s:453 .bss:00000043 UART_RxTail/tmp/ccG6wxDo.s:449 .bss:00000020 UART_RxBuf/tmp/ccG6wxDo.s:454 .bss:00000044 UART_LastRxError/tmp/ccG6wxDo.s:163 .text:00000054 __vector_12/tmp/ccG6wxDo.s:450 .bss:00000040 UART_TxHead/tmp/ccG6wxDo.s:451 .bss:00000041 UART_TxTail.bss:00000000 UART_TxBuf/tmp/ccG6wxDo.s:225 .text:0000009e uart_init/tmp/ccG6wxDo.s:280 .text:000000cc uart_getc/tmp/ccG6wxDo.s:336 .text:00000102 uart_putc/tmp/ccG6wxDo.s:379 .text:00000126 uart_puts/tmp/ccG6wxDo.s:411 .text:0000013e uart_puts_pUNDEFINED SYMBOLS__do_copy_data__do_clear_bss