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

📄 avr_910_avr_isp_(auto_adr_inc_19200bps).asm

📁 Collected AVR assembler code samples to learn assembler. I use it in my classes.
💻 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,SW_MAJOR
	rcall	putc
	ldi	u_data,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,tn12	; putc(tiny12);
	rcall	putc
	ldi	u_data,tn15	; putc(tiny15);
	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,S2343A	; putc(S2343A);
	rcall	putc
	ldi	u_data,S2333A	; putc(S2333A);
	rcall	putc
	ldi	u_data,S4433A	; putc(S4433A);
	rcall	putc
	ldi	u_data,S4434	; putc(S4434);
	rcall	putc
	ldi	u_data,S8535	; putc(S8535);
	rcall	putc
	ldi	u_data,m83	; putc(m83);
	rcall	putc
	ldi	u_data,m161	; putc(mega161);
	rcall	putc
	ldi	u_data,m163	; putc(mega163);
	rcall	putc
	ldi	u_data,m103	; putc(mega103);
	rcall	putc
	ldi	u_data,m603	; putc(mega603);
	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	w51
	ldi	u_data,0x53     ; putc('S');	// serial programmer
	rcall	putc
	rjmp	waitcmd

;**** Return autoincrement address support

w51:	
	cpi	u_data,'a'	; 'a' Return address auto increment
	brne	w5
	ldi	u_data,'Y'	; putc('Y'); 	// supports autoinc
	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,tn12	; if ((device != tn12) &&
	breq	w72
	cpi	device,tn15	; if ((device != tn15) &&
	breq	w72
	cpi	device,S1200D	; if ((device != S1200D) &&
	breq	w72
	cpi	device,S2313A	;	(device != S2313A) &&
	breq	w72
	cpi	device,S4414A	;	(device != S4414A) &&
	breq	w72
	cpi	device,S8515A	;	(device != S8515A) &&
	breq	w72
	cpi	device,S2323A	;	(device != S2323A))
	breq	w72
	cpi	device,S2343A	;	(device != S2343A))
	breq	w72
	cpi	device,S2333A	;	(device != S2333A) &&
	breq	w72
	cpi	device,S4433A	;	(device != S4433A) &&
	breq	w72
	cpi	device,S4434	;	(device != S4434A) &&
	breq	w72
	cpi	device,S8535	;	(device != S8535) &&
	breq	w72
	cpi	device,m83	;	(device != m83) &&
	breq	w72
	cpi	device,m161	;	(device != m161) &&
	breq	w72
	cpi	device,m163	;	(device != m163) &&
	breq	w72
	cpi	device,m603	;	(device != m603) &&
	breq	w72
	cpi	device,m103	;	(device != m103) &&
	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
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

	mov	s_data,u_data	; wrser(u_data);	// SPI write (byte 4)
	rcall	wrser

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

	rjmp	writeFLASHdelay

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

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

	ldi	s_data,0x40	;	wrser(0x40);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	s_data = addrh;
w91:				; }
	rcall	wrser		; wrser(s_data);	// SPI write (byte 2)
	mov	s_data,addrl	; wrser(addrl);		// SPI write (byte 3)
	rcall	wrser
	mov	s_data,u_data	; wrser(u_data);	// SPI write (byte 4)
	rcall	wrser

writeFLASHdelay:
	cpi	device,m103
	breq	w92
	cpi	device,m83
	breq	w92
	cpi	device,m603
	breq	w92
	cpi	device,m161
	breq	w92
	cpi	device,m163
	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		;
	ldi	s_data,0x28	;	wrser(0x28);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	s_data = addrh;
	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

	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

	rjmp	readaddrinc
;**** 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

	ldi	s_data,0xc0
	rcall	wrser
	mov	s_data,addrh
	rcall	wrser
	mov	s_data,addrl
	rcall	wrser
	mov	s_data,u_data
	rcall	wrser
	ldi	temp1,0x20
	rcall	delay

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

	rjmp	put_ret

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

w13:	
	cpi	u_data,0x64	; 'd' Read data memory
	brne	w14
	ldi	s_data,0xa0	;	wrser(0xA0);	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	;	s_data = addrh;
	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

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

	rjmp	waitcmd		; goto waitcmd();


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

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

;**** Chip Erase ****

w15:	
	cpi	u_data,0x65     ; 'e' Chip erase
        brne	w16
	ldi	s_data,0xac
	rcall	wrser
	ldi	s_data,0x80
	rcall	wrser
	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
	andi	s_data,0x06
	ori	s_data,0xe0
	rcall	wrser
	ldi	s_data,0x00
	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
	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	w191

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

;**** New Universal Command ****

w191:	
	cpi	u_data,'.'	; '.' New Universal Command
	brne	w99

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

NewUniversal:
	mov	s_data,cmd1
	rcall	wrser
	mov	s_data,cmd2
	rcall	wrser
	mov	s_data,cmd3
	rcall	wrser
	mov	s_data,u_data
	rcall	wrser

	mov	u_data,rd_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

delay1us:			;    count               R16
        nop                                                       
        cpi     temp1,0x03
        breq    finished
        nop
        nop
loop:   
	dec     temp1 
        cpi     temp1,0x03
        brne    loop               
finished:
        ret     


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

⌨️ 快捷键说明

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