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

📄 90stest.asm

📁 AT90s 串口下载线,稍加改动,能支持stk500自动升级程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;*
;* FUNCTION
;*	putc
;*
;* DESCRIPTION
;*	Send a character on the UART Tx line.
;*
;***************************************************************************

putc:
	sbis	USR,UDRE		; test for TX register empty
	rjmp	putc			; loop until TX empty
	out	UDR,u_data			; send the byte
	ret

;***************************************************************************
;*
;* FUNCTION
;*	put_string
;*
;* DESCRIPTION
;*	Send Z - pointed null-terminated string on the UART Tx line.
;*
;***************************************************************************
	
put_string:
	lpm
	tst	r0
	breq	ps_ret			; check for end of string (0x00)
	mov	u_data,r0
	rcall	putc			; putc(char)
	adiw	ZL,1			; next char
	rjmp	put_string
ps_ret:	ret	

;***************************************************************************
;*
;* FUNCTION
;*	put_table
;*
;* DESCRIPTION
;*	Send Z - pointed table on the UART Tx line.
;*
;***************************************************************************
	
put_table:
	lpm
	tst	r0
	breq	pt_ret			; check for end of table (0x00)
	mov	u_data,r0	
	rcall	putc			; putc(Byte)
	adiw	ZL,2			; skip MSB
	rjmp	put_table
pt_ret:	ret	

;***************************************************************************
;*
;* FUNCTION
;*	bel_table
;*
;* DESCRIPTION
;*	C=0 if device belongs to table.
;*
;***************************************************************************

bel_table:
	lpm						; read table
	tst	r0					; check for end of table
	breq	c1_ret
	cp	device,r0
	breq	c0_ret			; C=0
	adiw	ZL,2			; skip MSB
	rjmp	bel_table	
c1_ret:	sec					; C=1
c0_ret:	ret		

;***************************************************************************
;*
;* FUNCTION
;*	set_pagesize
;*
;* DESCRIPTION
;*	sets programming Page size for selected Device.
;*
;***************************************************************************

set_pagesize:
	lpm						; read table
	tst	r0					; check for end of table
	breq	spa_end			; no Pagesize to set
	cp	device,r0
	breq	spa_set			; C=0
	adiw	ZL,2			; skip MSB
	rjmp	set_pagesize	
spa_set:
	adiw	ZL,1			; Point to high Byte of Word
	lpm						; get Pagesize to R0
	mov Pagewords,r0
	mov Bcnt3,Pagewords		; initiate Counter
spa_end:
	ret		

;***************************************************************************
;*
;* FUNCTION
;*	set_pollcode
;*
;* DESCRIPTION
;*	sets Code for Polling Flash for selected Device.
;*
;***************************************************************************

set_pollcode:
	lpm						; read table
	tst	r0					; check for end of table
	breq	spo_end			; no Pollcode to set
	cp	device,r0
	breq	spo_set			; C=0
	adiw	ZL,2			; skip MSB
	rjmp	set_pollcode	
spo_set:
	adiw	ZL,1			; Point to high Byte of Word
	lpm						; get Pagesize to R0
	mov PollcodeF,r0		; Set Pollcode for Flash Rom
spo_end:
	ret		

;***************************************************************************
;*
;* FUNCTION
;*	delay
;*
;* DESCRIPTION
;*	 Make delay 1mS (x temp1).
;*
;***************************************************************************

delay:	
	ldi	temp2,40
dl2:	ldi	temp3,(XTAL/120)
dl1:	dec	temp3
	brne	dl1
	dec	temp2
	brne	dl2
	dec	temp1
	brne	delay
	ret

;***************************************************************************
;*
;* FUNCTION
;*	 spi123
;*
;* DESCRIPTION
;*	 Write bytes 1 to 3 on the SPI. Byte 1 must be loadet into s_data
;*       Byte 2 ist addrh, Byte 3 ist addrl
;*
;***************************************************************************

spi123:
	rcall	wrser			; wrser(s_data) SPI write (byte 1)
	mov	s_data,addrh
	rcall	wrser			; wrser(addrh)  SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl)  SPI write (byte 3)
	ret

;***************************************************************************
;*
;* FUNCTION
;*	 w1234 (for Code simplification,)
;*
;* DESCRIPTION
;*	 Write SPI bytes 1 to 4.
;            Byte 1 must be loadet into cmd1
;            Byte 2 must be loadet into cmd2
;            Byte 3 must be loadet into cmd3
;            Byte 4 must be loadet into u_data
;*
;***************************************************************************
w1234:
	mov s_data,cmd1
	rcall wrser
	mov s_data,cmd2
	rcall wrser
	mov s_data,cmd3
	rcall wrser
	mov s_data,u_data		; get Byte 4 from serial
	rcall wrser
	ret

;***************************************************************************
;*
;* FUNCTION
;*	 w123r4 (for Code simplification)
;*
;* DESCRIPTION
;*	 Write SPI bytes 1 to 3, read Byte 4 to serial.
;            Byte 1 must be loadet into cmd1
;            Byte 2 must be loadet into cmd2
;            Byte 3 must be loadet into cmd3
;*
;***************************************************************************
w123r4:
	mov s_data,cmd1
	rcall wrser
	mov s_data,cmd2
	rcall wrser
	mov s_data,cmd3
	rcall wrser
	rcall rdser
	mov u_data,s_data		; put Byte 4 to serial
	rcall putc
	ret


;***************************************************************************
;*
;* FUNCTION
;*	rdser, wrser
;*
;* DESCRIPTION
;*	 Write and read bytes on the SPI.
;*
;***************************************************************************

rdser:	
	clr	s_data
wrser:	
	ldi	temp1,8			; load bit counter
	ldi	rd_s_data,0
wrs0:
	rol	s_data
	brcc	wrs1
	set_MOSI			; MOSI = 1
	rjmp	wrs2
wrs1:
	clr_MOSI			; MOSI = 0
wrs2:
	lsl	rd_s_data
	sbic_MISO			; read MISO
	ori	rd_s_data,1
	pulse_SCK			; pulse SCK
	dec	temp1			; advance bit counter
	brne	wrs0			; loop
	mov	s_data,rd_s_data
	ret



;***************************************************************************
;*
;* FUNCTION
;*	read_send_progmem
;*
;* DESCRIPTION
;*	 Read one adress (2 Byte) from Program Memory and send it through UART
;*
;***************************************************************************
read_send_progmem:
	tst	device
	brmi	rsp1			; S89 device
	ldi	s_data,0x20		; read low Byte
	rcall	wrser			; wrser(0x28)  SPI write (byte 1)
	mov	s_data,addrh
	rjmp	rsp2
rsp1:
	mov	s_data,addrh		; s_data = (addrh << 3) | 0x01;
	rcall	shift_s_data3
	ori	s_data,0x01
rsp2:
	rcall	wrser			; wrser(addrh) SPI write (byte 2) (S89=byte1)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl) SPI write (byte 3)
	rcall	rdser			;              SPI read  (byte 4)
	mov	u_data,s_data
	rcall	putc			; send data
	tst	device
	brmi	rsp3			; S89 device
	ldi	s_data,0x28			; read High Byte
	rcall	wrser			; wrser(0x20)  SPI write (byte 1)
	mov	s_data,addrh	
	rcall	wrser			; wrser(addrh) SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl) SPI write (byte 3)
	rcall	rdser			;              SPI read  (byte 4)
	mov	u_data,s_data
	rcall	putc			; send data
rsp3:
	adiw	addrl,1			; Auto increment address
	ret

;***************************************************************************
;*
;* FUNCTION
;*	read_send_datamem
;*
;* DESCRIPTION
;*	 Read one Byte from Data Memory (eeprom) and send it through UART
;*
;***************************************************************************
read_send_datamem:			; Subroutine to read one eeprom Address
	tst	device
	brmi	rsd1			; S89 device
	ldi	s_data,0xa0
	rcall	wrser			; wrser(0xa0)   SPI write (byte 1)
	mov	s_data,addrh
	rjmp	rsd2
rsd1:
	cpi	device,0x87		; if (device == S53)
	breq	rsd3			; no Support for 89S53 device due to Bug in AVRProg V1.37
	mov	s_data,addrh
	rcall	shift_s_data3
	ori	s_data,0x05
rsd2:
	rcall	wrser			; wrser(addrh)  SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl)  SPI write (byte 3)
	rcall	rdser			;               SPI read  (byte 4)
	mov	u_data,s_data
	rcall	putc			; send data
	adiw	addrl,1			; Auto increment address
	ret
rsd3:
	pop	temp1			; remove return Adress from Stack in case of Error
	pop	temp1
	rjmp	put_err



;***************************************************************************
;*
;* FUNCTION
;*	eeprom_write
;*
;* DESCRIPTION
;*	 Write u_data to Data Memory (eeprom)
;*
;***************************************************************************
eeprom_write:
	tst	device
	brmi	eew1			; S89 device
	ldi	s_data,0xc0
	rcall	wrser			; wrser(0xc0)   SPI write (byte 1)
	mov	s_data,addrh
	rjmp	eew2	
eew1:
	cpi	device,0x87		; if (device == S53)
	breq	eew3
	mov	s_data,addrh
	rcall	shift_s_data3
	ori	s_data,0x06
eew2:
	rcall	wrser			; wrser(addrh)  SPI write (byte 2)
	mov	s_data,addrl
	rcall	wrser			; wrser(addrl)  SPI write (byte 3)
	mov	s_data,u_data
	rcall	wrser			; wrser(u_data) SPI write (byte 4)
	ldi	temp1,10		; delay 10mS
	rcall	delay

	adiw	addrl,1			; Auto increment address
	ret
eew3:
	pop temp1			; remove return Adress from Stack in case of failure
	pop temp1
	rjmp	put_err

;***************************************************************************
;*
;* FUNCTION
;*	shift_s_data3
;*
;* DESCRIPTION
;*	 Shift s_data 3 times left for S89 device.
;*
;***************************************************************************

shift_s_data3:
	lsl	s_data
	lsl	s_data
	lsl	s_data
	brcc	s3_ret
	cpi	device,0x87		; if (device != S53)
	brne	s3_ret	
	sbr	s_data, 4		; a13 +
s3_ret:	ret


;***************************************************************************
;*
;* FUNCTION
;*	healthcheck
;*
;* DESCRIPTION
;*	 changes color of dual color led.
;*
;***************************************************************************

healthcheck:				; for dual color LED
	clr_LED					; LED red
	ldi temp1,200			; 200 ms
	rcall delay		
	ldi temp1,200			; again 200 ms
	rcall delay
	ldi s_data,200			; counter Register

LEDloop:					; Pulse for yellow LED
	set_LED					; LED green
	ldi temp1,2				; 2 ms
	rcall delay
	clr_LED					; LED red
	ldi temp1,1				; 1 ms
	rcall delay
	dec s_data				; dec. counter
	brne LEDloop
	set_LED					; LED green
	ret

;***************************************************************************
;***************************************************************************
;***************************************************************************
;*
;* INIT
;*
;* DESCRIPTION
;*	Initialization
;*
;***************************************************************************
;***************************************************************************
;***************************************************************************

INIT:
	ldi	temp1,RAMEND
	out SPL,temp1			; Locate stack
	ldi	temp1,PAGESIZE		; default Pagesize
	mov Pagewords,temp1
	mov Bcnt3,Pagewords		; set counter for Pagesize
	ldi	device,0x20			; S2313 as default
	clr B_Mode				; Flag for Block Modes (see Note 16)
	clr B_Flag				; Flag for eNhanced Block write
	init_ports				; Initialize ports
	release_ports			; Release ports
	rcall	u_init			; Initialize UART
	rcall healthcheck		; show that Prog is working after Powerup (LED test)

	 	
;***************************************************************************
;*
;* PROGRAM
;*	waitcmd -> main
;*
;* DESCRIPTION
;*	Wait for and execute commands.
;*
;***************************************************************************

waitcmd:
	rcall	getc			; while (getc() == ESC) {};
	cpi	u_data,0x1b
	breq	waitcmd

;====== 'T' - Device Type ==================================================

	cpi	u_data,'T'		; 'T' Device type
	brne	w0
	rcall	getc
	mov	device,u_data		; get device type
	table Dev_M				; prepare to set Pagesize
	rcall set_pagesize		; If device has Page Mode support, set Pagesize
	ldi	temp1,0xFF
	mov	PollcodeF,temp1		; preset PollcodeF with 0xFF, will be overwritten if Pollcode known
	table Dev_S				; prepare to set Polling Code
	rcall set_pollcode		; If device has no Page Size support, set code for Polling Flash
	rjmp	put_ret

;====== 'S' - Return Software Identifier ===================================

w0:	
	cpi	u_data,'S'		; 'S' Return software identifier
	brne	w1
	table	ID_Str
	rcall	put_string		; put string "AVR ISP"
	rjmp	waitcmd

⌨️ 快捷键说明

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