📄 soft_uart.s
字号:
;+++ Software Uart according to Atmel +++
;+++ application note AVR 305 +++
;+++ Adapted for Imagecraft ICCAVR +++
.area text
;include correct file here ................................
.include "aiom16.s" ;see path磗,same directory as *.h !!!
;..........................................................
;volatile registers (not needed to restore)
.define bitcnt R24
.define temp R25
.define txbyte R26
.define rxbyte R27
; ****** Customizable settings BEGIN ******
;change here if wanted/required !!!
.define out_port PORTD ;PORTD is used for TxD here
.define dir DDRD ;DDRD is used here
.define in_port PIND ;PIND is used for RxD here
TxD = 1 ; Px1 pin is used for sending
RxD = 0 ; Px0 pin is used for receiving
sb = 1 ; 1 stop bit
FOSC = 7372800 ; Crystal frequency
BAUD = 9600 ; Serial bitrate in bps : 0.0% error
; ****** Customizable settings END ******
; The b value corresponds to the table on last page
; of Application Note AVR 305: Software UART
b = (((FOSC/BAUD)-22)/6)
;function to init PORTx and DDRx for sending and receiving
_init_soft_uart::
;for sending
sbi out_port,TxD ;TxD is high
sbi dir,TxD ;TxD is output
;for receiving
sbi out_port,RxD ;RxD is pull up
cbi dir,RxD ;RxD is input
ret
;function to send a byte :first argument is in R16
_putit:: mov txbyte,R16 ;given char to txbyte
ldi bitcnt,9+sb ;1+8+sb (sb is # of stop bits)
com txbyte ;inverte everything
sec ;start bit
putchar0: brcc putchar1 ;if carry set
cbi out_port,TxD;send a '0'
rjmp putchar2 ;else
putchar1: sbi out_port,TxD ;send a '1'
nop
putchar2: rcall UART_delay ;one bit delay
rcall UART_delay
lsr txbyte ;get next bit
dec bitcnt ;if not all bit sent
brne putchar0 ;send next
;else
ret ;done return
;function for delay
UART_delay: ldi temp,b
UART_delay1: dec temp
brne UART_delay1
ret
;
;function to receive a byte and return in R16
_getit::
ldi bitcnt,9 ;8 data bit + 1 stop bit
getchar1: sbic in_port,RxD ;wait for start bit
rjmp getchar1
rcall UART_delay ;0.5 bit delay
getchar2: rcall UART_delay ;1 bit delay
rcall UART_delay
clc ;clear carry
sbic in_port,RxD ;if RX pin high
sec ;set carry flag in SREG
dec bitcnt ;if bit is stop bit
breq getchar3 ;return
;else
ror rxbyte ;shift bit into rxbyte
rjmp getchar2 ;go get next
getchar3: mov R16,rxbyte ;move rxbyte to R16
ret ;return from function call
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -