📄 uart-16sm.lis
字号:
.module uart-16sm.c
.area text(rom, con, rel)
0000 .dbfile C:\+samples-16small\UART-16sm\uart-16sm.c
.area vector(rom, abs)
.org 44
002C 0C940000 jmp _uart_rx_isr
.area text(rom, con, rel)
0000 .dbfile C:\+samples-16small\UART-16sm\uart-16sm.c
.area data(ram, con, rel)
0000 .dbfile C:\+samples-16small\UART-16sm\uart-16sm.c
0000 _rec_head::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile C:\+samples-16small\UART-16sm\uart-16sm.c
0002 .dbsym e rec_head _rec_head I
0002 _rec_tail::
0002 .blkb 2
.area idata
0002 0000 .word 0
.area data(ram, con, rel)
0004 .dbfile C:\+samples-16small\UART-16sm\uart-16sm.c
0004 .dbsym e rec_tail _rec_tail I
.area text(rom, con, rel)
0000 .dbfile C:\+samples-16small\UART-16sm\uart-16sm.c
0000 .dbfunc e uart_rx_isr _uart_rx_isr fV
.even
0000 _uart_rx_isr::
0000 2A92 st -y,R2
0002 3A92 st -y,R3
0004 8A93 st -y,R24
0006 9A93 st -y,R25
0008 EA93 st -y,R30
000A FA93 st -y,R31
000C 2FB6 in R2,0x3f
000E 2A92 st -y,R2
0010 .dbline -1
0010 .dbline 52
0010 ; // Title: UART-16sm.c
0010 ; // Operation:
0010 ; // This program make echo to PC sending in Baudrate 38400
0010 ; // it receives sending from PC and sends the received one back to PC
0010 ; // The LED group1 (the left one) makes counting on received data
0010 ; // The LED group2 display the received data in binary
0010 ; // Attention: A terminal program "Tera Term Pro" is contained in CD
0010 ; // for PC to communicate with the AVR Study Board
0010 ;
0010 ; /* UCSRA: Control & Status Register A
0010 ; b7-RXC: USART receive complete
0010 ; b6-TXC: USART transmit complete
0010 ; b5-UDRE: USART Data register empty
0010 ; b4-FE: Frame Error
0010 ; b3-DOR: Data overtun
0010 ; b2-PE: Parity error
0010 ; b1-U2X: double the USART transmission speed
0010 ; b0-MPCM: multi-processor communication mode
0010 ;
0010 ; USARB
0010 ; * b7-RXCIE: RX complete interrupt enable
0010 ; b6-TXCIE: TX complete interrupt enable
0010 ; b5-UDRIE: USART data register empty interrupt enable
0010 ; * b4-RXEN: Receiver enable
0010 ; * b3-TXEN: Transmitter enable
0010 ; b2-UCSZ2: chracter size ------->0
0010 ; b1-RXB8 receive data bit 8
0010 ; b0-TXB8: Transmit data 8
0010 ;
0010 ; UCSRC
0010 ; * b7-URSEL: register select 0/UBRRH, 1/UCSRC
0010 ; b6-UMSEL: USART mode select 0/Asyn 1/Synchronous
0010 ; b5-UPM1: -------- Parity mode 00/disable, 01 reserved
0010 ; b4-UPM0: -------- 10 even, 11 odd
0010 ; b3-USBS: stop bit selection 0/1-bit, 1/2-bit
0010 ; * b2-UCSZ1 --------> 1
0010 ; * b1-UCSZ0 --------> 1
0010 ; b0-UCPOL: clock polarity 0 rising XCK edge, 1 falling XCK edge
0010 ; */
0010 ;
0010 ;
0010 ; #include <iom16v.h>
0010 ; #include <macros.h>
0010 ;
0010 ; #pragma interrupt_handler uart_rx_isr: 12
0010 ;
0010 ; unsigned char RecBuf[40];
0010 ; int rec_head=0, rec_tail=0;
0010 ; unsigned rec_data;
0010 ;
0010 ; void uart_rx_isr(void)
0010 ; {
0010 .dbline 53
0010 ; RecBuf[rec_head]=UDR;
0010 80E0 ldi R24,<_RecBuf
0012 90E0 ldi R25,>_RecBuf
0014 E0910000 lds R30,_rec_head
0018 F0910100 lds R31,_rec_head+1
001C E80F add R30,R24
001E F91F adc R31,R25
0020 2CB0 in R2,0xc
0022 2082 std z+0,R2
0024 .dbline 54
0024 ; rec_head++;
0024 80910000 lds R24,_rec_head
0028 90910100 lds R25,_rec_head+1
002C 0196 adiw R24,1
002E 90930100 sts _rec_head+1,R25
0032 80930000 sts _rec_head,R24
0036 .dbline 55
0036 ; if(rec_head>=40)
0036 8832 cpi R24,40
0038 E0E0 ldi R30,0
003A 9E07 cpc R25,R30
003C 34F0 brlt L2
003E X0:
003E .dbline 56
003E ; rec_head=0;
003E 2224 clr R2
0040 3324 clr R3
0042 30920100 sts _rec_head+1,R3
0046 20920000 sts _rec_head,R2
004A L2:
004A .dbline -2
004A L1:
004A .dbline 0 ; func end
004A 2990 ld R2,y+
004C 2FBE out 0x3f,R2
004E F991 ld R31,y+
0050 E991 ld R30,y+
0052 9991 ld R25,y+
0054 8991 ld R24,y+
0056 3990 ld R3,y+
0058 2990 ld R2,y+
005A 1895 reti
005C .dbend
005C .dbfunc e port_init _port_init fV
.even
005C _port_init::
005C .dbline -1
005C .dbline 60
005C ; }
005C ;
005C ; void port_init(void)
005C ; {
005C .dbline 61
005C ; DDRA = 0xFF; //set PortA output
005C 8FEF ldi R24,255
005E 8ABB out 0x1a,R24
0060 .dbline 62
0060 ; DDRB = 0xff; //set PORTB output
0060 87BB out 0x17,R24
0062 .dbline 63
0062 ; DDRC = 0x00; //set PORTC output
0062 2224 clr R2
0064 24BA out 0x14,R2
0066 .dbline 64
0066 ; PORTC = 0xff;
0066 85BB out 0x15,R24
0068 .dbline 65
0068 ; DDRD = 0x7f; //set PD.7 input for RX
0068 8FE7 ldi R24,127
006A 81BB out 0x11,R24
006C .dbline -2
006C L4:
006C .dbline 0 ; func end
006C 0895 ret
006E .dbend
006E .dbfunc e USART_init _USART_init fV
.even
006E _USART_init::
006E 2297 sbiw R28,2
0070 .dbline -1
0070 .dbline 69
0070 ; }
0070 ;
0070 ; void USART_init(void)
0070 ; {
0070 .dbline 70
0070 ; UCSRB=0x00;
0070 2224 clr R2
0072 2AB8 out 0xa,R2
0074 .dbline 71
0074 ; UCSRA=0x00;
0074 2BB8 out 0xb,R2
0076 .dbline 72
0076 ; UCSRB=0b10011000; //b7: RXCIE enabeled, b4: RXEN enabled, B3: TXEN enabled
0076 88E9 ldi R24,152
0078 8AB9 out 0xa,R24
007A .dbline 73
007A ; UBRRH=0x00; //
007A 20BC out 0x20,R2
007C .dbline 77
007C ; //Crystal=16MHx
007C ; //UBRRL=103; //Bausdrate=9600 tested work fine
007C ; //UBRRL=51; //Baudrate=19200 tested work fine
007C ; UBRRL=25; //Baudrate=38400 tested work fine
007C 89E1 ldi R24,25
007E 89B9 out 0x9,R24
0080 .dbline 79
0080 ; //UBRRL=8; //Baurate=115200 tested work fine
0080 ; UCSRC=0b10000110; //Asyn, No parity, 1-stop, 8-bit, rising edge
0080 86E8 ldi R24,134
0082 80BD out 0x20,R24
0084 .dbline 80
0084 ; memset(RecBuf, 0, sizeof(RecBuf));
0084 88E2 ldi R24,40
0086 90E0 ldi R25,0
0088 9983 std y+1,R25
008A 8883 std y+0,R24
008C 2227 clr R18
008E 3327 clr R19
0090 00E0 ldi R16,<_RecBuf
0092 10E0 ldi R17,>_RecBuf
0094 0E940000 xcall _memset
0098 .dbline 81
0098 ; rec_head=0;
0098 2224 clr R2
009A 3324 clr R3
009C 30920100 sts _rec_head+1,R3
00A0 20920000 sts _rec_head,R2
00A4 .dbline 82
00A4 ; rec_tail=0;
00A4 30920300 sts _rec_tail+1,R3
00A8 20920200 sts _rec_tail,R2
00AC .dbline -2
00AC L5:
00AC .dbline 0 ; func end
00AC 2296 adiw R28,2
00AE 0895 ret
00B0 .dbend
00B0 .dbfunc e delay _delay fV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -