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

📄 avr910.asm

📁 AVR 单片机嵌入式开发源程序
💻 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 commandsw7:	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_dataw81b:	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		; }				; elsew989:				; {	mov	s_data,addrh	;	s_data = (addrh << 3) | 0x02;	rcall	shift_s_data3	ori	s_data,0x02w91:				; }	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_dataw91b:	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		; }				; elsew1289:				; {	mov	s_data,addrh	;	s_data = (addrh << 3) | 0x01;	rcall	shift_s_data3	ori	s_data,0x01w121:				; }	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();				; }				; elsew122:				; {	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	w111w1189:	mov	s_data,addrh	rcall	shift_s_data3	ori	s_data,0x06w111:	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		; }				; elsew1389:				; {	mov	s_data,addrh	;	s_data = (addrh << 3) | 0x05;	rcall	shift_s_data3	ori	s_data,0x05w131:				; }	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_retw141:	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	wrserw1589:	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	w162w1689:	andi	s_data,0xe0	ori	s_data,0x07	rcall	wrserw162:	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_errw17begin:	ldi	param1,0x02	rcall	w17call	ldi	param1,0x01	rcall	w17call	ldi	param1,0x00	rcall	w17call	rjmp	waitcmdw17call: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_retuniversal:	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	retw99:;**** 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 + -