⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.inc

📁 供AVR的ATiny及ATmega系列单片机使用的bootloader
💻 INC
字号:
;-------------------------------------------------------------------------
;				Receive Byte
;-------------------------------------------------------------------------
;output: a0 = byte
;used: a1
;
getchar:
.if WDTRIGGER
	wdr	
.endif
	SKIP_RXD_1			; wait for RXD = 1
	rjmp	getchar
_rx1:
	SKIP_RXD_0			; wait for RXD = 0 (start bit)
	rjmp	_rx1
	ldi	a1, 8
	movw	twh:twl, baudh:baudl
	lsr	twh
	ror	twl
	rcall	wait_time		; middle of start bit
_rx2:
	rcall	wait_bit_time		;14 + tw
	lsr	a0			;1
	SKIP_RXD_0			;1/2
	ori	a0, 0x80		;1
.if CRC
;------------------------------ CRC --------------------------------------
	sbrc	a0, 7			;1
	eor	crcl, polynoml		;1 crcl.0 ^= a0.7
	lsr	crch			;1
	ror	crcl			;1
	brcc	_rx5			;1
	eor	crcl, polynoml		;1 ^0x01
_rx5:
	brcc	_rx6			;1
	eor	crch, polynomh		;1 ^0xA0
_rx6:
;-------------------------------------------------------------------------
.else
	rjmp	pc+1			;2
	rjmp	pc+1			;2
.endif
	dec	a1			;1
	brne	_rx2			;2 = 24 + tw
	cpi	a0, COMMAND		; needed several times
	ret
;-------------------------------------------------------------------------
;				transmit byte
;-------------------------------------------------------------------------
;input: a0 = byte
;used: a1
;
putchar:
	rcall	wait_bit_time
	TXD_0
.if ONEWIRE
	rjmp	_tx2
syncputchar:				; start with 1->0 from master
	SKIP_RXD_1
	rjmp	syncputchar
_tx1:
	SKIP_RXD_0
	rjmp	_tx1
_tx2:
.else
	lpm	a1, z			;3
.endif
	ldi	a1, 9			;1
	com	a0			;1 = 5
_tx3:
.if CRC
	rjmp	pc+1			;2
	rjmp	pc+1			;2
.endif
	rcall	wait_bit_time		;14 + tw
	lsr	a0			;1
	brcc	_tx4			;1/2
	nop				;1
	TXD_0				;2
	rjmp	_tx5			;2
_tx4:
	TXD_1				;2
	rjmp	_tx5			;2
_tx5:
	dec	a1			;1
	brne	_tx3			;2 = 24 + tw
	ret
;-------------------------------------------------------------------------
;	Wait 14 cycle + tw
;
wait_bit_time:
	movw	twh:twl, baudh:baudl	;1
wait_time:
	sbiw	twh:twl, 4		;2
	brcc	wait_time		;2/1
	cpi	twl, 0xFD		;1
	brcs	_wt1			;2/1 (2)
	breq	_wt1			;2/1 (3)
	cpi	twl, 0xFF		;1
	breq	_wt1			;2/1 (4/5)
_wt1:
	ret				;4 + 3 (rcall) = 14
;-------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -