📄 soft_uart.lis
字号:
0002 CPHA =2
0001 SPR1 =1
0000 SPR0 =0
0000 ;
000C UDR =0x0c
000B UCSRA =0x0b
0007 RXC =7
0006 TXC =6
0005 UDRE =5
0004 FE =4
0003 DOR =3 ; original bit name
0003 OVR =3 ; bit name used in C header
0002 PE =2
0001 U2X =1
0000 MPCM =0
000A UCSRB =0x0a
0007 RXCIE =7
0006 TXCIE =6
0005 UDRIE =5
0004 RXEN =4
0003 TXEN =3
0002 UCSZ2 =2
0001 RXB8 =1
0000 TXB8 =0
0009 UBRR =0x09
0000 ;
0008 ACSR =0x08
0007 ACD =7
0006 ACBG =6
0005 ACO =5
0004 ACI =4
0003 ACIE =3
0002 ACIC =2
0001 ACIS1 =1
0000 ACIS0 =0
0000 ;
0007 ADMUX =0x07
0007 REFS1 =7
0006 REFS0 =6
0005 ADLAR =5
0004 MUX4 =4
0003 MUX3 =3
0002 MUX2 =2
0001 MUX1 =1
0000 MUX0 =0
0006 ADCSRA =0x06
0006 ADCSR =0x06
0007 ADEN =7
0006 ADSC =6
0005 ADFR =5
0005 ADATE =5
0004 ADIF =4
0003 ADIE =3
0002 ADPS2 =2
0001 ADPS1 =1
0000 ADPS0 =0
0005 ADCH =0x05
0004 ADCL =0x04
0004 ADC =0x04 ; 16 bit base address
0000 ;
0003 TWDR =0x03
0002 TWAR =0x02
0000 TWGCE =0
0001 TWSR =0x01
0001 TWPS1 =1
0000 TWPS0 =0
0000 TWBR =0x00
0000 ;
0000 ;-------------------------------------------------
0000 ; fuse and lock bit definitions
0000 ;
0000 ; ; lock byte
0005 BLB12 =5
0004 BLB12 =4
0003 BLB02 =3
0002 BLB01 =2
0001 LB2 =1
0000 LB1 =0
0000 ;
0000 ; ; fuses high byte
0007 OCDEN =7
0006 JTAGEN =6
0005 SPIEN =5
0004 CKOPT =4
0003 EESAVE =3
0002 BOOTSZ1=2
0001 BOOTSZ0=1
0000 BOOTRST=0
0000 ; ; fuses low byte
0007 BODLEVEL=7
0006 BODEN =6
0005 SUT1 =5
0004 SUT0 =4
0003 CKSEL3 =3
0002 CKSEL2 =2
0001 CKSEL1 =1
0000 CKSEL0 =0
0000 ;
0000 ;-------------------------------------------------
0000 ; macros creating int vectors
0000 ;
0000 .macro set_vector_table
0000 .area vector (abs)
0000 .org 4
0000 jmp EXT_INT0
0000 jmp EXT_INT1
0000 jmp TIM2_COMP
0000 jmp TIM2_OVF
0000 jmp TIM1_CAPT
0000 jmp TIM1_COMPA
0000 jmp TIM1_COMPB
0000 jmp TIM1_OVF
0000 jmp TIM0_OVF
0000 jmp SPI_STC
0000 jmp USART_RXC
0000 jmp USART_UDRE
0000 jmp USART_TXC
0000 jmp ADC
0000 jmp EE_RDY
0000 jmp ANA_COMP
0000 jmp TWSI
0000 jmp EXT_INT2
0000 jmp TIM0_COMP
0000 jmp SPM_RDY
0000 .area text
0000 .macro set_vector_INT0
0000 .area vector (abs)
0000 .org 4
0000 jmp @0
0000 .area text
0000 .macro set_vector_INT1
0000 .area vector (abs)
0000 .org 8
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER2_COMP
0000 .area vector (abs)
0000 .org 12
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER2_OVF
0000 .area vector (abs)
0000 .org 16
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER1_CAPT
0000 .area vector (abs)
0000 .org 20
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER1_COMPA
0000 .area vector (abs)
0000 .org 24
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER1_COMPB
0000 .area vector (abs)
0000 .org 28
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER1_OVF
0000 .area vector (abs)
0000 .org 32
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER0_OVF
0000 .area vector (abs)
0000 .org 36
0000 jmp @0
0000 .area text
0000 .macro set_vector_SPI_STC
0000 .area vector (abs)
0000 .org 40
0000 jmp @0
0000 .area text
0000 .macro set_vector_USART_RX
0000 .area vector (abs)
0000 .org 44
0000 jmp @0
0000 .area text
0000 .macro set_vector_USART_RXC
0000 .area vector (abs)
0000 .org 44
0000 jmp @0
0000 .area text
0000 .macro set_vector_USART_DRE
0000 .area vector (abs)
0000 .org 48
0000 jmp @0
0000 .area text
0000 .macro set_vector_USART_UDRE
0000 .area vector (abs)
0000 .org 48
0000 jmp @0
0000 .area text
0000 .macro set_vector_USART_TX
0000 .area vector (abs)
0000 .org 52
0000 jmp @0
0000 .area text
0000 .macro set_vector_USART_TXC
0000 .area vector (abs)
0000 .org 52
0000 jmp @0
0000 .area text
0000 .macro set_vector_ADC
0000 .area vector (abs)
0000 .org 56
0000 jmp @0
0000 .area text
0000 .macro set_vector_EE_RDY
0000 .area vector (abs)
0000 .org 60
0000 jmp @0
0000 .area text
0000 .macro set_vector_EE_READY
0000 .area vector (abs)
0000 .org 60
0000 jmp @0
0000 .area text
0000 .macro set_vector_ANA_COMP
0000 .area vector (abs)
0000 .org 64
0000 jmp @0
0000 .area text
0000 .macro set_vector_ANALOG_COMP
0000 .area vector (abs)
0000 .org 64
0000 jmp @0
0000 .area text
0000 .macro set_vector_TWI
0000 .area vector (abs)
0000 .org 68
0000 jmp @0
0000 .area text
0000 .macro set_vector_TWSI
0000 .area vector (abs)
0000 .org 68
0000 jmp @0
0000 .area text
0000 .macro set_vector_INT2
0000 .area vector (abs)
0000 .org 72
0000 jmp @0
0000 .area text
0000 .macro set_vector_TIMER0_COMP
0000 .area vector (abs)
0000 .org 76
0000 jmp @0
0000 .area text
0000 .macro set_vector_SPM_RDY
0000 .area vector (abs)
0000 .org 80
0000 jmp @0
0000 .area text
0000 .macro set_vector_SPM_READY
0000 .area vector (abs)
0000 .org 80
0000 jmp @0
0000 .area text
0000 .define bitcnt R24
0000 .define temp R25
0000 .define txbyte R26
0000 .define rxbyte R27
0000
0000 ; ****** Customizable settings BEGIN ******
0000 ;change here if wanted/required !!!
0000
0000 .define out_port PORTD ;PORTC is used for TxD here
0000 .define dir DDRD ;DDRC is used here
0000 .define in_port PIND ;PINC is used for RxD here
0001 TxD = 1 ; Px7 pin is used for sending
0000 RxD = 0 ; Px6 pin is used for receiving
0001 sb = 1 ; 1 stop bit
708000 FOSC = 7372800 ; Crystal frequency
2580 BAUD = 9600 ; Serial bitrate in bps : 0.0% error
0000
0000 ; ****** Customizable settings END ******
0000
0000 ; The b value corresponds to the table on last page
0000 ; of Application Note AVR 305: Software UART
007C b = (((FOSC/BAUD)-22)/6)
0000
0000 ;function to init PORTx and DDRx for sending and receiving
0000 _init_soft_uart::
0000 ;for sending
0000 919A sbi out_port,TxD ;TxD is high
0002 899A sbi dir,TxD ;TxD is output
0004 ;for receiving
0004 909A sbi out_port,RxD ;RxD is pull up
0006 8898 cbi dir,RxD ;RxD is input
0008 0895 ret
000A
000A ;function to send a byte :first argument is in R16
000A A02F _putit:: mov txbyte,R16 ;given char to txbyte
000C 8AE0 ldi bitcnt,9+sb ;1+8+sb (sb is # of stop bits)
000E A095 com txbyte ;inverte everything
0010 0894 sec ;start bit
0012
0012 10F4 putchar0: brcc putchar1 ;if carry set
0014 9198 cbi out_port,TxD;send a '0'
0016 02C0 rjmp putchar2 ;else
0018
0018 919A putchar1: sbi out_port,TxD ;send a '1'
001A 0000 nop
001C
001C 05D0 putchar2: rcall UART_delay ;one bit delay
001E 04D0 rcall UART_delay
0020
0020 A695 lsr txbyte ;get next bit
0022 8A95 dec bitcnt ;if not all bit sent
0024 B1F7 brne putchar0 ;send next
0026 ;else
0026 0895 ret ;done return
0028
0028 ;function for delay
0028 9CE7 UART_delay: ldi temp,b
002A 9A95 UART_delay1: dec temp
002C F1F7 brne UART_delay1
002E 0895 ret
0030 ;
0030
0030 ;function to receive a byte and return in R16
0030 _getit::
0030 89E0 ldi bitcnt,9 ;8 data bit + 1 stop bit
0032
0032 8099 getchar1: sbic in_port,RxD ;wait for start bit
0034 FECF rjmp getchar1
0036 F8DF rcall UART_delay ;0.5 bit delay
0038
0038 F7DF getchar2: rcall UART_delay ;1 bit delay
003A F6DF rcall UART_delay
003C
003C 8894 clc ;clear carry
003E 8099 sbic in_port,RxD ;if RX pin high
0040 0894 sec ;set carry flag in SREG
0042
0042 8A95 dec bitcnt ;if bit is stop bit
0044 11F0 breq getchar3 ;return
0046 ;else
0046 B795 ror rxbyte ;shift bit into rxbyte
0048 F7CF rjmp getchar2 ;go get next
004A
004A 0B2F getchar3: mov R16,rxbyte ;move rxbyte to R16
004C 0895 ret ;return from function call
004E
004E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -