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

📄 main.s

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\avrisp\main.c
	.dbfunc e main _main fV
;              i -> y+1
;       msg_size -> R22,R23
;        seq_num -> y+0
;       checksum -> R12
;              t -> R20
;          state -> R14,R15
;       rec_data -> R10,R11
	.even
_main::
	sbiw R28,3
	.dbline -1
	.dbline 49
; /**	\file
; 	<b>USBisp main</b><br>
; 	Autor: Matthias Wei遝r<br>
; 	Copyright 2005: Matthias Wei遝r<br>
; 	License: QPL (see license.txt)
; 	<hr>
; */
; /*! \mainpage USBisp STK500 v2
; 
; 	(c)2005 by Matthias Weisser
; 
; 	This software is distributed under the QPL
; 	see license.txt for more information
; 
;  	\section Compiler
;  	latest WINAVR
; 
; 	\section version history version history
; 	<b>v1.0</b>
; 	<ul>
; 		<li>First release</li>
; 	</ul>
; */
; #include "stk500.h"
; 
; //States used in the receive state machine
; #define	ST_START		0xF000								/*消息开始0x1B					*/
; #define	ST_GET_SEQ_NUM	0xF001								/*消息包号						*/
; #define ST_MSG_SIZE_1	0xF002								/*消息长度						*/
; #define ST_MSG_SIZE_2	0xF003								/*消息长度						*/
; #define ST_GET_TOKEN	0xF004								/*消息记号0x0E					*/
; #define ST_GET_DATA		0xF005								/*消息数据						*/
; #define	ST_GET_CHECK	0xF006								/*消息校验						*/
; #define	ST_PROCESS		0xF007								/*消息						*/
; 
; void chip_init(void);
; //unsigned char adc_get(char n);
; void process_command(unsigned char seq_num);
; 
; //Some global variables
; unsigned char msg_buffer[300];
; unsigned char clock_speed;			/*下载速度*/
; unsigned char reset_polarity;
; unsigned char param_controller_init;
; unsigned char prgmode;
; 
; unsigned long address;
; 
; void main(void) {
	.dbline 51
; 	
; 	unsigned int i=0;
	clr R0
	clr R1
	std y+2,R1
	std y+1,R0
	.dbline 53
; 
; 	unsigned char seq_num=0;
	std y+0,R0
	.dbline 54
; 	unsigned int msg_size=0;
	clr R22
	clr R23
	.dbline 55
; 	unsigned char checksum=0;
	clr R12
	.dbline 58
; 
; 	/// next state
; 	unsigned int state=ST_START;	/*应该是状态标志*/
	ldi R24,61440
	ldi R25,240
	movw R14,R24
	.dbline 63
; 
; 	unsigned char t;
; 	signed int rec_data;
; 
; 	chip_init();
	rcall _chip_init
	.dbline 64
; 	interface_init();
	rcall _interface_init
	.dbline 65
; 	spi_disable();
	rcall _spi_disable
	.dbline 73
; 
; 	
; 	//clock_speed=eeprom_read_byte(&eeprom_sck_period);
; 	//clock_speed=eeprom_sck_period;
; 	//if (clock_speed==0xFF) {
; 	//	clock_speed=SPI_SPEED_125KHZ;
; 	//	}
; 	clock_speed = SPI_SPEED_230KHz;
	ldi R24,1
	sts _clock_speed,R24
	.dbline 74
; 	spi_set_speed(clock_speed);
	mov R16,R24
	rcall _spi_set_speed
	.dbline 76
; 	
; 	SEI();
	sei
	.dbline 78
; 
; 	LED_GN_OFF;
	ldi R24,-2
	ldi R25,-1
	in R2,0x18
	and R2,R24
	out 0x18,R2
	.dbline 79
; 	LED_RT_ON;
	sbi 0x18,1
	.dbline 80
; 	wait_ms(2000);
	ldi R16,2000
	ldi R17,7
	rcall _wait_ms
	.dbline 81
; 	LED_GN_ON;
	sbi 0x18,0
	.dbline 82
; 	LED_RT_OFF;
	ldi R24,-3
	ldi R25,-1
	in R2,0x18
	and R2,R24
	out 0x18,R2
	rjmp L4
L3:
	.dbline 84
; 	
; 	while(2) {
	.dbline 85
; 		rec_data=interface_getc();
	rcall _interface_getc
	movw R10,R16
	.dbline 87
; 		//if a byte has been received -> process it
; 		if(rec_data!=-1) {
	movw R24,R10
	cpi R16,255
	ldi R30,255
	cpc R17,R30
	brne X1
	rjmp L6
X1:
	.dbline 87
	.dbline 88
; 			t=rec_data&0xFF;
	mov R20,R24
	andi R21,0
	.dbline 90
; 
; 			if(state==ST_START) {
	movw R24,R14
	cpi R24,0
	ldi R30,240
	cpc R25,R30
	brne L8
	.dbline 90
	.dbline 91
; 				if(t==MESSAGE_START) {
	cpi R20,27
	breq X2
	rjmp L9
X2:
	.dbline 91
	.dbline 92
; 					state = ST_GET_SEQ_NUM;
	ldi R24,61441
	ldi R25,240
	movw R14,R24
	.dbline 93
; 					checksum = MESSAGE_START^0;
	ldi R24,27
	mov R12,R24
	.dbline 94
; 					}
	.dbline 95
; 				}
	rjmp L9
L8:
	.dbline 96
; 			else {
	.dbline 97
; 				if(state==ST_GET_SEQ_NUM) {
	movw R24,R14
	cpi R24,1
	ldi R30,240
	cpc R25,R30
	brne L12
	.dbline 97
	.dbline 98
; 					seq_num = t;
	std y+0,R20
	.dbline 99
; 					state = ST_MSG_SIZE_1;
	ldi R24,61442
	ldi R25,240
	movw R14,R24
	.dbline 100
; 					checksum ^= t;
	eor R12,R20
	.dbline 101
; 					}
	rjmp L13
L12:
	.dbline 102
; 				else {
	.dbline 103
; 					if(state==ST_MSG_SIZE_1) {
	movw R24,R14
	cpi R24,2
	ldi R30,240
	cpc R25,R30
	brne L14
	.dbline 103
	.dbline 104
; 						msg_size = t<<8;
	mov R22,R20
	clr R23
	mov R23,R22
	clr R22
	.dbline 105
; 						state = ST_MSG_SIZE_2;
	ldi R24,61443
	ldi R25,240
	movw R14,R24
	.dbline 106
; 						checksum ^= t;
	eor R12,R20
	.dbline 107
; 						}
	rjmp L15
L14:
	.dbline 108
; 					else {
	.dbline 109
; 						if(state==ST_MSG_SIZE_2) {
	movw R24,R14
	cpi R24,3
	ldi R30,240
	cpc R25,R30
	brne L16
	.dbline 109
	.dbline 110
; 							msg_size |= t;
	mov R2,R20
	clr R3
	or R22,R2
	or R23,R3
	.dbline 111
; 							state = ST_GET_TOKEN;
	ldi R24,61444
	ldi R25,240
	movw R14,R24
	.dbline 112
; 							checksum ^= t;
	eor R12,R2
	.dbline 113
; 							}
	rjmp L17
L16:
	.dbline 114
; 						else {
	.dbline 115
; 							if(state==ST_GET_TOKEN) {
	movw R24,R14
	cpi R24,4
	ldi R30,240
	cpc R25,R30
	brne L18
	.dbline 115
	.dbline 116
; 								if(t==TOKEN) {
	cpi R20,14
	brne L20
	.dbline 116
	.dbline 117
; 									state = ST_GET_DATA;
	ldi R24,61445
	ldi R25,240
	movw R14,R24
	.dbline 118
; 									checksum ^= t;
	eor R12,R20
	.dbline 119
; 									i=0;
	clr R0
	clr R1
	std y+2,R1
	std y+1,R0
	.dbline 120
; 									}
	rjmp L19
L20:
	.dbline 121
; 								else {
	.dbline 122
; 									state = ST_START;
	ldi R24,61440
	ldi R25,240
	movw R14,R24
	.dbline 123
; 									}
	.dbline 124
; 								}
	rjmp L19
L18:
	.dbline 125
; 							else {
	.dbline 126
; 								if(state==ST_GET_DATA) {
	movw R24,R14
	cpi R24,5
	ldi R30,240
	cpc R25,R30
	brne L22
	.dbline 126
	.dbline 127
; 									msg_buffer[i++] = t;
	ldd R2,y+1
	ldd R3,y+2
	movw R24,R2
	adiw R24,1
	std y+2,R25
	std y+1,R24
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R2
	add R30,R24
	adc R31,R25
	std z+0,R20
	.dbline 128
; 									checksum ^= t;
	eor R12,R20
	.dbline 129
; 									if(i==msg_size) {
	ldd R0,y+1
	ldd R1,y+2
	cp R0,R22
	cpc R1,R23
	brne L23
	.dbline 129
	.dbline 130
; 										state = ST_GET_CHECK;
	ldi R24,61446
	ldi R25,240
	movw R14,R24
	.dbline 131
; 										}
	.dbline 132
; 									}
	rjmp L23
L22:
	.dbline 133
; 								else {
	.dbline 134
; 									if(state==ST_GET_CHECK) {
	movw R24,R14
	cpi R24,6
	ldi R30,240
	cpc R25,R30
	brne L26
	.dbline 134
	.dbline 135
; 										if(t==checksum) {
	cp R20,R12
	brne L28
	.dbline 135
	.dbline 136
; 											process_command(seq_num);
	ldd R16,y+0
	rcall _process_command
	.dbline 137
; 											}
L28:
	.dbline 138
; 										state = ST_START;
	ldi R24,61440
	ldi R25,240
	movw R14,R24
	.dbline 139
; 										}
L26:
	.dbline 140
; 									}
L23:
	.dbline 141
; 								}
L19:
	.dbline 142
; 							}
L17:
	.dbline 143
; 						}
L15:
	.dbline 144
; 					}
L13:
	.dbline 145
; 				}
L9:
	.dbline 146
; 			}
L6:
	.dbline 147
L4:
	.dbline 84
	rjmp L3
X0:
	.dbline -2
L2:
	adiw R28,3
	.dbline 0 ; func end
	ret
	.dbsym l i 1 i
	.dbsym r msg_size 22 i
	.dbsym l seq_num 0 c
	.dbsym r checksum 12 c
	.dbsym r t 20 c
	.dbsym r state 14 i
	.dbsym r rec_data 10 I
	.dbend
	.dbfunc e process_command _process_command fV
;           mode -> R14
;     block_size -> R10,R11
;  start_address -> y+6
; polling_address -> y+2
;            tmp -> y+13
;            cmd -> y+12
;      num_bytes -> y+10
;              i -> R12,R13
;        seq_num -> y+24
	.even
_process_command::
	st -y,r17
	st -y,r16
	rcall push_gset5
	sbiw R28,14
	.dbline -1
	.dbline 175
; 		}
; }
; 
; /**
; 	Returns the value of the selected adc channel
; 
; 	@param n Number of ADC channel
; 
; 	@return  Value of ADC channel
; */
; /*unsigned char adc_get(char n)
; {
; 	ADMUX&=0xF0;
; 	ADMUX|=n&0x7;
; 
; 	while(ADCSRA&0x40);
; 	ADCSRA|=(1<<ADSC);
; 	while(ADCSRA&0x40);
; 
; 	return ADCH;
; }*/
; 
; /**
; 	Processes a command packet received in main loop and located in the global buffer
; 
; 	@param	seq_num	The sequence number of the command packet
; */
; void process_command(unsigned char seq_num)
; {
	.dbline 177
; 	unsigned char cmd;
; 	unsigned char tmp=0;
	clr R0
	std y+13,R0
	.dbline 181
; 	unsigned char mode;
; 	unsigned int block_size;
; 	unsigned int i;
; 	unsigned int num_bytes=0;
	clr R1
	std y+11,R1
	std y+10,R0
	.dbline 182
; 	unsigned long polling_address=0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+2,R20
	std z+3,R21
	std z+4,R22
	std z+5,R23
	.dbline 183
; 	unsigned long start_address = address;
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
	.dbline 185
; 
; 	cmd = msg_buffer[0];
	lds R2,_msg_buffer
	std y+12,R2
	.dbline 190
; 
; 	//////////////////////////////////////
; 	//CMD_SIGN_ON
; 	//////////////////////////////////////
; 	if(cmd==CMD_SIGN_ON)
	mov R24,R2
	cpi R24,1
	brne L31
	.dbline 191
; 	{
	.dbline 192
; 		num_bytes = 11;
	ldi R24,11
	ldi R25,0
	std y+11,R25
	std y+10,R24
	.dbline 193
; 		msg_buffer[0] = CMD_SIGN_ON;
	ldi R24,1
	sts _msg_buffer,R24
	.dbline 194
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 195
; 		msg_buffer[2] = 8;
	ldi R24,8
	sts _msg_buffer+2,R24
	.dbline 196
; 		memcpy(msg_buffer+3,"AVRISP_2",8);
	std y+1,R25
	std y+0,R24
	ldi R18,<L36
	ldi R19,>L36
	ldi R16,<_msg_buffer+3
	ldi R17,>_msg_buffer+3
	rcall _memcpy
	.dbline 197
; 	}
	rjmp L32
L31:
	.dbline 201
; 	//////////////////////////////////////
; 	//CMD_SET_PARAMETER
; 	//////////////////////////////////////
; 	else if(cmd==CMD_SET_PARAMETER)
	ldd R24,y+12
	cpi R24,2
	brne L37
	.dbline 202
; 	{
	.dbline 203
; 		switch(msg_buffer[1])
	lds R10,_msg_buffer+1
	clr R11
	movw R24,R10
	cpi R24,152
	ldi R30,0
	cpc R25,R30
	breq L43
	cpi R24,152
	ldi R30,0
	cpc R25,R30
	brlt L39
L49:
	movw R24,R10
	cpi R24,158
	ldi R30,0
	cpc R25,R30
	breq L45
	cpi R24,159
	ldi R30,0
	cpc R25,R30
	breq L47
	rjmp L39
X3:
	.dbline 204
; 		{
L43:
	.dbline 206
; 			case PARAM_SCK_DURATION:
; 				clock_speed=msg_buffer[2];
	lds R2,_msg_buffer+2
	sts _clock_speed,R2
	.dbline 211
; 				//if(eeprom_read_byte(&eeprom_sck_period)!=clock_speed) eeprom_write_byte(&eeprom_sck_period,clock_speed);
; 				//if (eeprom_sck_period != clock_speed) {
; 				//	eeprom_sck_period = clock_speed;
; 				//	}
; 				spi_set_speed(clock_speed);
	mov R16,R2
	rcall _spi_set_speed
	.dbline 212
; 				break;
	rjmp L40
L45:
	.dbline 214
; 			case PARAM_RESET_POLARITY:
; 				reset_polarity = msg_buffer[2];
	lds R2,_msg_buffer+2
	sts _reset_polarity,R2
	.dbline 215
; 				break;
	rjmp L40
L47:
	.dbline 217
; 			case PARAM_CONTROLLER_INIT:
; 				param_controller_init = msg_buffer[2];
	lds R2,_msg_buffer+2
	sts _param_controller_init,R2
	.dbline 218
; 				break;
L39:
L40:
	.dbline 221
; 		}
; 		
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+11,R25
	std y+10,R24
	.dbline 222
; 		msg_buffer[0] = CMD_SET_PARAMETER;
	sts _msg_buffer,R24
	.dbline 223
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 224
; 	}
	rjmp L38
L37:
	.dbline 228
; 	//////////////////////////////////////
; 	//CMD_GET_PARAMETER
; 	//////////////////////////////////////
; 	else if(cmd==CMD_GET_PARAMETER)
	ldd R24,y+12
	cpi R24,3
	breq X7
	rjmp L51
X7:
	.dbline 229
; 	{
	.dbline 230
; 		switch(msg_buffer[1])
	lds R10,_msg_buffer+1
	clr R11
	movw R24,R10
	cpi R24,144
	ldi R30,0
	cpc R25,R30
	breq L59
	cpi R24,145
	ldi R30,0
	cpc R25,R30
	breq L60
	cpi R24,146
	ldi R30,0
	cpc R25,R30
	breq L61
	ldi R24,146
	cp R24,R10
	cpc R25,R11
	brlt L66
L65:
	movw R24,R10
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	breq L57
	cpi R24,129
	ldi R30,0
	cpc R25,R30
	breq L58
	rjmp L53

⌨️ 快捷键说明

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