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

📄 avr910.asm

📁 该应用软件可以实现大多数单片机的仿真实验
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;***************************************************************************
;*
;* FUNCTION
;*	show_id
;*
;* DESCRIPTION
;*	Show our ID ("AVR ISP") on the serial line.
;*
;***************************************************************************

show_id:ldi	u_data,0x41		; 'A'
	rcall	putc
	ldi	u_data,0x56		; 'V'
	rcall	putc
	ldi	u_data,0x52		; 'R'
	rcall	putc
	ldi	u_data,0x20		; ' '
	rcall	putc
	ldi	u_data,0x49		; 'I'
	rcall	putc
	ldi	u_data,0x53		; 'S'
	rcall	putc
	ldi	u_data,0x50		; 'P'
	rcall	putc
	ret


;***************************************************************************
;*
;* RESET
;*
;* DESCRIPTION
;*	Initialization
;*
;***************************************************************************

RESET:	clr	temp1
	out	GIMSK,temp1	; disable external interrupt
	ser	temp1		; Initialize
	out	PORTD,temp1
	set_reset		; set RESET=1
	out	PORTB,temp1
	ddrb_release
	rcall	u_init		; Initialize UART
	sei			; Enable interrupts


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

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

;**** Device Type ****

	cpi	u_data,0x54     ; 'T' Device type
	brne	w0
	rcall	getc		; getc();	// dummy
	mov	device,u_data	; putc(device);
	rjmp	put_ret

;**** Return Software Identifier ****

w0:	cpi	u_data,0x53	; 'S' Return software identifier
	brne	w1
	rcall	show_id		; show_id();
	rjmp	waitcmd

;**** Return Software Version ****

w1:	cpi	u_data,0x56	;'V' Return software version
	brne	w2
	ldi	u_data,0x30+SW_MAJOR ; putc(0x30+SW_MAJOR);
	rcall	putc
	ldi	u_data,0x30+SW_MINOR ; putc(0x30+SW_MINOR);
	rcall	putc
	rjmp	waitcmd

;**** Return Hardware Version ****

w2:	cpi	u_data,0x76	;'v' Return hardware version
	brne	w3
	ldi	u_data,0x30+HW_MAJOR ; putc(0x30+HW_MAJOR);
	rcall	putc
	ldi	u_data,0x30+HW_MINOR ; putc(0x30+HW_MINOR);
	rcall	putc
	rjmp	waitcmd

;**** Show Supported Devices ****

w3:	cpi	u_data,0x74	; 't' Show supported devices
	brne	w4
	ldi	u_data,S1200C	; putc(S1200C);
	rcall	putc
	ldi	u_data,S1200D	; putc(S1200D);
	rcall	putc
	ldi	u_data,S2313A	; putc(S2313A);
	rcall	putc
	ldi	u_data,S4414A	; putc(S4414A);
	rcall	putc
	ldi	u_data,S8515A	; putc(S8515A);
	rcall	putc
	ldi	u_data,S2323A	; putc(S2323A);
	rcall	putc
	ldi	u_data,S8252	; putc(S8252);
	rcall	putc
	ldi	u_data,0x00	; putc(0x00);	// end of device list
	rcall	putc
	rjmp	waitcmd

;**** Return Programmer Type ****

w4:	cpi	u_data,0x70     ; 'p' Return programmer type
	brne	w5
	ldi	u_data,0x53     ; putc('S');	// serial programmer
	rcall	putc
	rjmp	waitcmd

;**** Set LED ****

w5:	cpi	u_data,0x78	; 'x' Set LED (ignored)
	brne	w6
	rjmp	put_ret

;**** Clear LED ****

w6:	cpi	u_data,0x79     ; 'y' Clear LED (ignored)
	brne	w7
	rjmp	put_ret

;**** Enter Programming Mode ****

; We require that the device code be selected before any of the other commands

w7:
	cpi	device,S1200C	; if ((device != S1200C) &&
	breq	w72
	cpi	device,S1200D	;     (device != S1200D) &&
	breq	w72
	cpi	device,S8515A	;     (device != S8515A) &&
	breq	w72
	cpi	device,S4414A	;     (device != S4414A) &&
	breq	w72
	cpi	device,S2313A	;     (device != S2313A) &&
	breq	w72
	cpi	device,S8252	;     (device != S8252) &&
	breq	w72
	cpi	device,S01838C	;     (device != S01838C) &&
	breq	w72
	cpi	device,S01838D	;     (device != S01838D) &&
	breq	w72
	cpi	device,S2323A	;     (device != S2323A))
	breq	w72
	rjmp	put_err		;	goto put_err();

w72:	cpi	u_data,0x50	; 'P' Enter programming mode
	brne	w8
	rcall	spiinit		; spiinit();
	rjmp	put_ret

;**** Wait Program Memory ****

;* USAGE
;*	wait_pm(byte cmd, byte c_data);
;*
;*	cmd :		0x28 - wait for high byte written
;*			0x20 - wait for low byte written
;*	u_data :	current data written

;wait_pm:			; do
;				; {
;	mov	s_data,cmd	;	wrser(cmd);		// SPI write (byte 1)
;	rcall	wrser
;	mov	s_data,addrh	;	wrser(addrh);		// SPI write (byte 2)
;	rcall	wrser
;	mov	s_data,addrl	;	wrser(addrl);		// SPI write (byte 3)
;	rcall	wrser
;	rcall	rdser		;	s_data = rdser();	// SPI read (byte 4)
				; }
;	cp	s_data,u_data	; while(s_data != u_data);
;	brne	wait_pm
;	ret

;**** Write Program Memory, High Byte ****

w8:	cpi	u_data,0x43	; 'C' Write program memory, high byte
	brne	w9
	rcall	getc
	cpi	device,S8252	; if (device == S8252)
	brne	w81		; {
	rjmp	put_err		; 	goto err();
				;	// (AT89 series have byte wide program memory !)
				; }
w81:	ldi	s_data,0x48	; wrser(0x48);		// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	; wrser(addrh);		// SPI write (byte 2)
	rcall	wrser
	mov	s_data,addrl	; wrser(addrl);		// SPI write (byte 3)
	rcall	wrser
	cpi	device,S01838C	; invert data on 01838 rev C!
	brne	w81b
	com	u_data
w81b:
	mov	s_data,u_data	; wrser(u_data);	// SPI write (byte 4)
	rcall	wrser
	cpi	device,S01838C	; no delay for S01838 (Uses Page Write Mode instead)
	breq	w82
	cpi	device,S01838D
	breq	w82

	ldi	temp1,0x20	; delay(0x20);		// 24585 cycles delay
	rcall	delay		;			// Page mode requires no delay!
w82:
	ldi	temp1,0x01	; Auto increment address				!!!!
	clr	temp2
	add	addrl,temp1
	adc	addrh,temp2
	rjmp	put_ret		; goto reply();

;**** Write Program Memory, Low Byte ****

w9:	cpi	u_data,0x63     ; 'c' Write program memory, low byte
	brne	w12
	rcall	getc

	cpi	device,S8252	; if (device != S8252)
	breq	w989		; {
	ldi	s_data,0x40	;	wrser(0x40);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	s_data = addrh;
	rjmp	w91		; }
				; else
w989:				; {
	mov	s_data,addrh	;	s_data = (addrh << 3) | 0x02;
	rcall	shift_s_data3
	ori	s_data,0x02
w91:				; }
	rcall	wrser		; wrser(s_data);	// SPI write (byte 2)
	mov	s_data,addrl	; wrser(addrl);		// SPI write (byte 3)
	rcall	wrser
	cpi	device,S01838C	; invert data on 01838 rev C!
	brne	w91b
	com	u_data
w91b:
	mov	s_data,u_data	; wrser(u_data);	// SPI write (byte 4)
	rcall	wrser
	cpi	device,S01838C	; no delay for S01838 (Uses Page Write Mode instead)
	breq	w92
	cpi	device,S01838D
	breq	w92
	ldi	temp1,0x20	; delay(0x20);		// 24585 cycles delay
	rcall	delay		;			// Page mode requires no delay!
w92:
	rjmp	put_ret		; goto reply();

;**** Read Program Memory ****

w12:	cpi	u_data,0x52	; 'R' Read program memory
	brne	w10		;
	cpi	device,S8252	; if (device != S8252)
	breq	w1289		; {
	ldi	s_data,0x28	;	wrser(0x28);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	s_data = addrh;
	rjmp	w121		; }
				; else
w1289:				; {
	mov	s_data,addrh	;	s_data = (addrh << 3) | 0x01;
	rcall	shift_s_data3
	ori	s_data,0x01
w121:				; }
	rcall	wrser		; wrser(s_data);	// SPI write (byte 2)
	mov	s_data,addrl	; wrser(addrl);		// SPI write (byte 3)
	rcall	wrser
	rcall	rdser		; putc(rdser());	// Send data (byte 4)
	mov	u_data,s_data
	rcall	putc
	cpi	device,S8252	; if (device == S8252)
	brne	w122		; {
	rjmp	waitcmd		;	goto waitcmd();
				; }
				; else
w122:				; {
	ldi	s_data,0x20	;	wrser(0x20);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	wrser(addrh);	// SPI write (byte 2)
	rcall	wrser
	mov	s_data,addrl	;	wrser(addrl);	// SPI write (byte 3)
	rcall	wrser
	rcall	rdser		;	putc(rdser());	// Send data (byte 4)
	mov	u_data,s_data
	rcall	putc

	ldi	temp1,0x01	;	Auto increment address				!!!!
	clr	temp2
	add	addrl,temp1
	adc	addrh,temp2

	rjmp	waitcmd		;	goto waitcmd();
				; }
shift_s_data3:
	lsl	s_data
	lsl	s_data
	lsl	s_data
	ret

;**** Load Address ****

w10:	cpi	u_data,0x41	; 'A' Load address
	brne	w11
	rcall	getc		; addrh = getc();
	mov	addrh,u_data
	rcall	getc		; addrl = getc();
	mov	addrl,u_data
	rjmp	put_ret		; goto reply();

;**** Write Data Memory ****

w11:	cpi	u_data,0x44	; 'D' Write data memory
	brne	w13
	rcall	getc
	cpi	device,S8252
	breq	w1189

	ldi	s_data,0xc0
	rcall	wrser
	mov	s_data,addrh
	rjmp	w111

w1189:	mov	s_data,addrh
	rcall	shift_s_data3
	ori	s_data,0x06

w111:	rcall	wrser
	mov	s_data,addrl
	rcall	wrser
	mov	s_data,u_data
	rcall	wrser
	ldi	temp1,0x20
	rcall	delay
	rjmp	put_ret

;;**** Read Data Memory ****

w13:	cpi	u_data,0x64	; 'd' Read data memory
	brne	w14
	cpi	device,S8252	; if (device != S8252)
	breq	w1389		; {
	ldi	s_data,0xa0	;	wrser(0xA0);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	s_data = addrh;
	rjmp	w131		; }
				; else
w1389:				; {
	mov	s_data,addrh	;	s_data = (addrh << 3) | 0x05;
	rcall	shift_s_data3
	ori	s_data,0x05
w131:				; }
	rcall	wrser		; wrser(s_data);	// SPI write (byte 2)
	mov	s_data,addrl	; wrser(addrl);		// SPI write (byte 3)
	rcall	wrser
	rcall	rdser		; putc(rdser());	// Send data (byte 4)
	mov	u_data,s_data
	rcall	putc
	rjmp	waitcmd		; goto waitcmd();


;**** Leave Programming Mode ****

w14:	cpi	u_data,0x4c	; 'L' Leave programming mode
	brne	w15
	ddrb_release
	cpi	device,S8252
	breq	w141
	set_reset		; set RESET = 1
	rjmp    put_ret
w141:	clr_reset		; set RESET = 0
	rjmp	put_ret

;**** Chip Erase ****

w15:	cpi	u_data,0x65     ; 'e' Chip erase
        brne	w16
	ldi	s_data,0xac
	rcall	wrser
	cpi	device,S8252
	breq	w1589
	ldi	s_data,0x80
	rcall	wrser
w1589:	ldi	s_data,0x04
	rcall	wrser
	ldi	s_data,0x00
	rcall	wrser
	ldi	temp1,0x30
	rcall	delay
	rjmp	put_ret

;**** Write Lock Bits ****

w16:	cpi	u_data,0x6c	; 'l' Write lock bits
	brne	w17
	rcall	getc
	ldi	s_data,0xac
	rcall	wrser
	mov	s_data,u_data
	cpi	device,S8252
	breq	w1689
	andi	s_data,0x06
	ori	s_data,0xe0
	rcall	wrser
	ldi	s_data,0x00
	rcall	wrser
	rjmp	w162

w1689:	andi	s_data,0xe0
	ori	s_data,0x07
	rcall	wrser
w162:	ldi	s_data,0x00
	rcall	wrser
	ldi	temp1,0x30
	rcall	delay
	rjmp	put_ret

;**** Read Signature Bytes ****

w17:	cpi	u_data,0x73	; 's' Read signature bytes
	brne	w18
	cpi	device,S8252
	brne	w17begin
	rjmp	put_err
w17begin:
	ldi	param1,0x02
	rcall	w17call
	ldi	param1,0x01
	rcall	w17call
	ldi	param1,0x00
	rcall	w17call
	rjmp	waitcmd

w17call:ldi	s_data,0x30
	rcall	wrser
	ldi	s_data,0x00
	rcall	wrser
	mov	s_data,param1
	rcall	wrser
	rcall	rdser
	mov	u_data,s_data
	rcall	putc
	ret


;**** Write Program Memory Page ****

w18:	cpi	u_data,0x6D	; 'm' Write Program Memory Page
	brne	w19

	ldi	s_data,0x4c	;	wrser(0x4c);	// SPI write (byte 1)
	rcall	wrser

	mov	s_data,addrh	;	wrser(addrh);	// SPI write (byte 2)
	rcall	wrser
	mov	s_data,addrl	;	wrser(addrl);	// SPI write (byte 3)
	rcall	wrser

	ldi	s_data,0x00	;	wrser(0x00);	// SPI write (byte 4)
	rcall	wrser
	ldi	temp1,0xff	; 	delay(0xFF);	// 0x20 = 24585 cycles delay
	rcall	delay
	rjmp	put_ret

;**** Universal Command ****

w19:	cpi	u_data,0x3A	; ':' Universal Command
	brne	w99

	rcall	getc
	mov	cmd1,u_data
	rcall	getc
	mov	cmd2,u_data
	rcall	getc
	mov	cmd3,u_data
	rcall	universal
	ldi	temp1,0xff	; 	delay(0xFF);	// 0x20 = 24585 cycles delay
	rcall	delay
	rjmp	put_ret

universal:
	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
	rcall	putc
	ret

w99:

;**** Command Error ****

put_err:ldi	u_data,0x3f	; putc('?');	\\ send '?'
	rcall	putc
	rjmp	waitcmd

;**** Reply Command ****

put_ret:ldi	u_data,0x0d	; putc(0x0D);	\\ send CR
	rcall	putc
	rjmp	waitcmd

;**** End of File ****

⌨️ 快捷键说明

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