📄 sof_usart.lst
字号:
__start:
__text_start:
0032 E5CF LDI R28,0x5F
0033 E0D4 LDI R29,4
0034 BFCD OUT 0x3D,R28
0035 BFDE OUT 0x3E,R29
0036 51C0 SUBI R28,0x10
0037 40D0 SBCI R29,0
0038 EA0A LDI R16,0xAA
0039 8308 STD Y+0,R16
003A 2400 CLR R0
003B E6E0 LDI R30,0x60
003C E0F0 LDI R31,0
003D E010 LDI R17,0
003E 36E0 CPI R30,0x60
003F 07F1 CPC R31,R17
0040 F011 BEQ 0x0043
0041 9201 ST R0,Z+
0042 CFFB RJMP 0x003E
0043 8300 STD Z+0,R16
0044 E6E4 LDI R30,0x64
0045 E0F0 LDI R31,0
0046 E6A0 LDI R26,0x60
0047 E0B0 LDI R27,0
0048 E010 LDI R17,0
0049 36E4 CPI R30,0x64
004A 07F1 CPC R31,R17
004B F021 BEQ 0x0050
004C 95C8 LPM
004D 9631 ADIW R30,1
004E 920D ST R0,X+
004F CFF9 RJMP 0x0049
0050 940E0065 CALL _main
_exit:
0052 CFFF RJMP _exit
FILE: E:\avr\2.5.6\soft_test.c
(0001) // Test Soft-Uart : See Atmel Applicaton Note 305
(0002) // File: soft_test.c
(0003) // Target : mega16
(0004) // Crystal: 7.3728 Mhz
(0005) // Date 05/30/2007
(0006) // Written/adapted by Dipl.Ing.J.Zastrow
(0007) // for Imagecraft ICCAVR Ver. 6.31
(0008) // Usage : if you need more then one UART
(0009) // Tested with STK500 (Atmel)
(0010) // Customer settings : SEE soft_uart.s
(0011) //
(0012)
(0013) #include <iom16v.h>
(0014) #include <macros.h>
(0015)
(0016) //function prototypes for soft_uart.s
(0017) //one byte return value in R16 !!!
(0018) extern unsigned char getit(void);
(0019) //one byte argument in R16 !!!
(0020) extern putit(register unsigned char key);
(0021) //initialise TxD,RxD port pins
(0022) extern void init_soft_uart(void);
(0023)
(0024)
(0025) void port_init(void)
(0026) {
(0027) //default settings all inputs and pull up
(0028) PORTA = 0xFF;
_port_init:
0053 EF8F LDI R24,0xFF
0054 BB8B OUT 0x1B,R24
(0029) DDRA = 0x00;
0055 2422 CLR R2
0056 BA2A OUT 0x1A,R2
(0030) PORTB = 0xFF;
0057 BB88 OUT 0x18,R24
(0031) DDRB = 0xFF;
0058 BB87 OUT 0x17,R24
(0032) PORTC = 0xFF;
0059 BB85 OUT 0x15,R24
(0033) DDRC = 0x00;
005A BA24 OUT 0x14,R2
(0034) PORTD = 0xFF;
005B BB82 OUT 0x12,R24
(0035) DDRD = 0x00;
005C BA21 OUT 0x11,R2
005D 9508 RET
(0036) }
(0037)
(0038) //call this routine to initialise all peripherals
(0039) void init_devices(void)
(0040) {
(0041) //stop errant interrupts until set up
(0042) CLI(); //disable all interrupts
_init_devices:
005E 94F8 BCLR 7
(0043) port_init();
005F DFF3 RCALL _port_init
(0044) MCUCR = 0x00;
0060 2422 CLR R2
0061 BE25 OUT 0x35,R2
(0045) TIMSK = 0x00;
0062 BE29 OUT 0x39,R2
(0046) SEI(); //re-enable interrupts
0063 9478 BSET 7
0064 9508 RET
_main:
buf --> Y+0
s --> R20
i --> R22
0065 9760 SBIW R28,0x10
(0047) //all peripherals are now initialised
(0048) }
(0049)
(0050) //Simply connect RS232 SPARE to
(0051) //PC2 to receive and PC3 to transmitt
(0052)
(0053) void main(void)
(0054) {
(0055) unsigned char s=0,i=0;
0066 2744 CLR R20
0067 2766 CLR R22
(0056) unsigned char buf[]="www.avrvi.com\r\n";
0068 E584 LDI R24,0x54
0069 E090 LDI R25,0
006A 01FE MOVW R30,R28
006B E100 LDI R16,0x10
006C E010 LDI R17,0
006D 93FA ST R31,-Y
006E 93EA ST R30,-Y
006F 939A ST R25,-Y
0070 938A ST R24,-Y
0071 940E00C7 CALL asgncblk
(0057) //defaul
(0058) init_devices();
0073 DFEA RCALL _init_devices
(0059)
(0060) //do custom settings in soft_uart.s !!!
(0061) init_soft_uart();
0074 940E00A0 CALL _init_soft_uart
(0062) for(i=0;i<16;i++)
0076 C009 RJMP 0x0080
(0063) {
(0064) putit(buf[i]);
0077 01CE MOVW R24,R28
0078 2FE6 MOV R30,R22
0079 27FF CLR R31
007A 0FE8 ADD R30,R24
007B 1FF9 ADC R31,R25
007C 8100 LDD R16,Z+0
007D 940E00A5 CALL _putit
007F 9563 INC R22
0080 3160 CPI R22,0x10
0081 F3A8 BCS 0x0077
0082 C01A RJMP 0x009D
(0065) }
(0066) while(1){
(0067) putit('T'); //T
0083 E504 LDI R16,0x54
0084 940E00A5 CALL _putit
(0068) putit('E'); //E
0086 E405 LDI R16,0x45
0087 940E00A5 CALL _putit
(0069) putit('S'); //S
0089 E503 LDI R16,0x53
008A 940E00A5 CALL _putit
(0070) putit('T'); //T
008C E504 LDI R16,0x54
008D 940E00A5 CALL _putit
(0071) putit(':'); //:
008F E30A LDI R16,0x3A
0090 940E00A5 CALL _putit
(0072) s = getit();
0092 940E00B8 CALL _getit
0094 2F40 MOV R20,R16
(0073) putit(s);
0095 940E00A5 CALL _putit
(0074) putit(0x0D);//CR
0097 E00D LDI R16,0xD
0098 940E00A5 CALL _putit
(0075) putit(0x0A);//LF
009A E00A LDI R16,0xA
009B 940E00A5 CALL _putit
009D CFE5 RJMP 0x0083
009E 9660 ADIW R28,0x10
009F 9508 RET
FILE: E:\avr\2.5.6\soft_uart.s
(0001) ;+++ Software Uart according to Atmel +++
(0002) ;+++ application note AVR 305 +++
(0003) ;+++ Adapted for Imagecraft ICCAVR +++
(0004)
(0005) .area text
(0006)
(0007) ;include correct file here ................................
(0008) .include "aiom16.s" ;see path磗,same directory as *.h !!!
(0009) ;..........................................................
(0010)
(0011) ;volatile registers (not needed to restore)
(0012) .define bitcnt R24
(0013) .define temp R25
(0014) .define txbyte R26
(0015) .define rxbyte R27
(0016)
(0017) ; ****** Customizable settings BEGIN ******
(0018) ;change here if wanted/required !!!
(0019)
(0020) .define out_port PORTD ;PORTC is used for TxD here
(0021) .define dir DDRD ;DDRC is used here
(0022) .define in_port PIND ;PINC is used for RxD here
(0023) TxD = 1 ; Px7 pin is used for sending
(0024) RxD = 0 ; Px6 pin is used for receiving
(0025) sb = 1 ; 1 stop bit
(0026) FOSC = 7372800 ; Crystal frequency
(0027) BAUD = 9600 ; Serial bitrate in bps : 0.0% error
(0028)
(0029) ; ****** Customizable settings END ******
(0030)
(0031) ; The b value corresponds to the table on last page
(0032) ; of Application Note AVR 305: Software UART
(0033) b = (((FOSC/BAUD)-22)/6)
(0034)
(0035) ;function to init PORTx and DDRx for sending and receiving
(0036) _init_soft_uart::
(0037) ;for sending
(0038) sbi out_port,TxD ;TxD is high
_init_soft_uart:
00A0 9A91 SBI 0x12,1
(0039) sbi dir,TxD ;TxD is output
00A1 9A89 SBI 0x11,1
(0040) ;for receiving
(0041) sbi out_port,RxD ;RxD is pull up
00A2 9A90 SBI 0x12,0
(0042) cbi dir,RxD ;RxD is input
00A3 9888 CBI 0x11,0
(0043) ret
00A4 9508 RET
(0044)
(0045) ;function to send a byte :first argument is in R16
(0046) _putit:: mov txbyte,R16 ;given char to txbyte
_putit:
00A5 2FA0 MOV R26,R16
(0047) ldi bitcnt,9+sb ;1+8+sb (sb is # of stop bits)
00A6 E08A LDI R24,0xA
(0048) com txbyte ;inverte everything
00A7 95A0 COM R26
(0049) sec ;start bit
00A8 9408 BSET 0
(0050)
(0051) putchar0: brcc putchar1 ;if carry set
00A9 F410 BCC 0x00AC
(0052) cbi out_port,TxD;send a '0'
00AA 9891 CBI 0x12,1
(0053) rjmp putchar2 ;else
00AB C002 RJMP 0x00AE
(0054)
(0055) putchar1: sbi out_port,TxD ;send a '1'
00AC 9A91 SBI 0x12,1
(0056) nop
00AD 0000 NOP
(0057)
(0058) putchar2: rcall UART_delay ;one bit delay
00AE D005 RCALL 0x00B4
(0059) rcall UART_delay
00AF D004 RCALL 0x00B4
(0060)
(0061) lsr txbyte ;get next bit
00B0 95A6 LSR R26
(0062) dec bitcnt ;if not all bit sent
00B1 958A DEC R24
(0063) brne putchar0 ;send next
00B2 F7B1 BNE 0x00A9
(0064) ;else
(0065) ret ;done return
00B3 9508 RET
(0066)
(0067) ;function for delay
(0068) UART_delay: ldi temp,b
00B4 E79C LDI R25,0x7C
(0069) UART_delay1: dec temp
00B5 959A DEC R25
(0070) brne UART_delay1
00B6 F7F1 BNE 0x00B5
(0071) ret
00B7 9508 RET
(0072) ;
(0073)
(0074) ;function to receive a byte and return in R16
(0075) _getit::
(0076) ldi bitcnt,9 ;8 data bit + 1 stop bit
_getit:
00B8 E089 LDI R24,0x9
(0077)
(0078) getchar1: sbic in_port,RxD ;wait for start bit
00B9 9980 SBIC 0x10,0
(0079) rjmp getchar1
00BA CFFE RJMP 0x00B9
(0080) rcall UART_delay ;0.5 bit delay
00BB DFF8 RCALL 0x00B4
(0081)
(0082) getchar2: rcall UART_delay ;1 bit delay
00BC DFF7 RCALL 0x00B4
(0083) rcall UART_delay
00BD DFF6 RCALL 0x00B4
(0084)
(0085) clc ;clear carry
00BE 9488 BCLR 0
(0086) sbic in_port,RxD ;if RX pin high
00BF 9980 SBIC 0x10,0
(0087) sec ;set carry flag in SREG
00C0 9408 BSET 0
(0088)
(0089) dec bitcnt ;if bit is stop bit
00C1 958A DEC R24
(0090) breq getchar3 ;return
00C2 F011 BEQ 0x00C5
(0091) ;else
(0092) ror rxbyte ;shift bit into rxbyte
00C3 95B7 ROR R27
(0093) rjmp getchar2 ;go get next
00C4 CFF7 RJMP 0x00BC
(0094)
(0095) getchar3: mov R16,rxbyte ;move rxbyte to R16
00C5 2F0B MOV R16,R27
(0096) ret ;return from function call
FILE: <library>
00C6 9508 RET
asgncblk:
00C7 93AA ST R26,-Y
00C8 93BA ST R27,-Y
00C9 93EA ST R30,-Y
00CA 93FA ST R31,-Y
00CB 920A ST R0,-Y
00CC 81AF LDD R26,Y+7
00CD 85B8 LDD R27,Y+8
00CE 81ED LDD R30,Y+5
00CF 81FE LDD R31,Y+6
00D0 3000 CPI R16,0
00D1 0701 CPC R16,R17
00D2 F031 BEQ 0x00D9
00D3 95C8 LPM
00D4 920D ST R0,X+
00D5 9631 ADIW R30,1
00D6 5001 SUBI R16,1
00D7 4010 SBCI R17,0
00D8 CFF7 RJMP 0x00D0
00D9 9009 LD R0,Y+
00DA 91F9 LD R31,Y+
00DB 91E9 LD R30,Y+
00DC 91B9 LD R27,Y+
00DD 91A9 LD R26,Y+
00DE 9624 ADIW R28,4
00DF 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -