main.s

来自「文档里面的代码是可以正常使用的」· S 代码 · 共 3,673 行 · 第 1/5 页

S
3,673
字号
	.module main.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\icc\stk500\avrasp\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 68
; 	
; 	//clock_speed=eeprom_read_byte(&eeprom_sck_period);
; 	clock_speed=eeprom_sck_period;
	lds R2,_eeprom_sck_period
	sts _clock_speed,R2
	.dbline 69
; 	if (clock_speed==0xFF) {
	mov R24,R2
	cpi R24,255
	brne L3
	.dbline 69
	.dbline 70
; 		clock_speed=SPI_SPEED_125KHZ;
	ldi R24,5
	sts _clock_speed,R24
	.dbline 71
; 		}
L3:
	.dbline 72
; 	spi_set_speed(clock_speed);
	lds R16,_clock_speed
	rcall _spi_set_speed
	.dbline 74
; 	
; 	SEI();
	sei
	.dbline 76
; 
; 	LED_GN_OFF;
	ldi R24,-2
	ldi R25,-1
	in R2,0x5
	and R2,R24
	out 0x5,R2
	.dbline 77
; 	LED_RT_ON;
	sbi 0x5,1
	.dbline 78
; 	wait_ms(2000);
	ldi R16,2000
	ldi R17,7
	rcall _wait_ms
	.dbline 79
; 	LED_GN_ON;
	sbi 0x5,0
	.dbline 80
; 	LED_RT_OFF;
	ldi R24,-3
	ldi R25,-1
	in R2,0x5
	and R2,R24
	out 0x5,R2
	rjmp L6
L5:
	.dbline 82
; 	
; 	while(2) {
	.dbline 83
; 		rec_data=interface_getc();
	rcall _interface_getc
	movw R10,R16
	.dbline 85
; 		//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 L8
X1:
	.dbline 85
	.dbline 86
; 			t=rec_data&0xFF;
	mov R20,R24
	andi R21,0
	.dbline 88
; 
; 			if(state==ST_START) {
	movw R24,R14
	cpi R24,0
	ldi R30,240
	cpc R25,R30
	brne L10
	.dbline 88
	.dbline 89
; 				if(t==MESSAGE_START) {
	cpi R20,27
	breq X2
	rjmp L11
X2:
	.dbline 89
	.dbline 90
; 					state = ST_GET_SEQ_NUM;
	ldi R24,61441
	ldi R25,240
	movw R14,R24
	.dbline 91
; 					checksum = MESSAGE_START^0;
	ldi R24,27
	mov R12,R24
	.dbline 92
; 					}
	.dbline 93
; 				}
	rjmp L11
L10:
	.dbline 94
; 			else {
	.dbline 95
; 				if(state==ST_GET_SEQ_NUM) {
	movw R24,R14
	cpi R24,1
	ldi R30,240
	cpc R25,R30
	brne L14
	.dbline 95
	.dbline 96
; 					seq_num = t;
	std y+0,R20
	.dbline 97
; 					state = ST_MSG_SIZE_1;
	ldi R24,61442
	ldi R25,240
	movw R14,R24
	.dbline 98
; 					checksum ^= t;
	eor R12,R20
	.dbline 99
; 					}
	rjmp L15
L14:
	.dbline 100
; 				else {
	.dbline 101
; 					if(state==ST_MSG_SIZE_1) {
	movw R24,R14
	cpi R24,2
	ldi R30,240
	cpc R25,R30
	brne L16
	.dbline 101
	.dbline 102
; 						msg_size = t<<8;
	mov R22,R20
	clr R23
	mov R23,R22
	clr R22
	.dbline 103
; 						state = ST_MSG_SIZE_2;
	ldi R24,61443
	ldi R25,240
	movw R14,R24
	.dbline 104
; 						checksum ^= t;
	eor R12,R20
	.dbline 105
; 						}
	rjmp L17
L16:
	.dbline 106
; 					else {
	.dbline 107
; 						if(state==ST_MSG_SIZE_2) {
	movw R24,R14
	cpi R24,3
	ldi R30,240
	cpc R25,R30
	brne L18
	.dbline 107
	.dbline 108
; 							msg_size |= t;
	mov R2,R20
	clr R3
	or R22,R2
	or R23,R3
	.dbline 109
; 							state = ST_GET_TOKEN;
	ldi R24,61444
	ldi R25,240
	movw R14,R24
	.dbline 110
; 							checksum ^= t;
	eor R12,R2
	.dbline 111
; 							}
	rjmp L19
L18:
	.dbline 112
; 						else {
	.dbline 113
; 							if(state==ST_GET_TOKEN) {
	movw R24,R14
	cpi R24,4
	ldi R30,240
	cpc R25,R30
	brne L20
	.dbline 113
	.dbline 114
; 								if(t==TOKEN) {
	cpi R20,14
	brne L22
	.dbline 114
	.dbline 115
; 									state = ST_GET_DATA;
	ldi R24,61445
	ldi R25,240
	movw R14,R24
	.dbline 116
; 									checksum ^= t;
	eor R12,R20
	.dbline 117
; 									i=0;
	clr R0
	clr R1
	std y+2,R1
	std y+1,R0
	.dbline 118
; 									}
	rjmp L21
L22:
	.dbline 119
; 								else {
	.dbline 120
; 									state = ST_START;
	ldi R24,61440
	ldi R25,240
	movw R14,R24
	.dbline 121
; 									}
	.dbline 122
; 								}
	rjmp L21
L20:
	.dbline 123
; 							else {
	.dbline 124
; 								if(state==ST_GET_DATA) {
	movw R24,R14
	cpi R24,5
	ldi R30,240
	cpc R25,R30
	brne L24
	.dbline 124
	.dbline 125
; 									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 126
; 									checksum ^= t;
	eor R12,R20
	.dbline 127
; 									if(i==msg_size) {
	ldd R0,y+1
	ldd R1,y+2
	cp R0,R22
	cpc R1,R23
	brne L25
	.dbline 127
	.dbline 128
; 										state = ST_GET_CHECK;
	ldi R24,61446
	ldi R25,240
	movw R14,R24
	.dbline 129
; 										}
	.dbline 130
; 									}
	rjmp L25
L24:
	.dbline 131
; 								else {
	.dbline 132
; 									if(state==ST_GET_CHECK) {
	movw R24,R14
	cpi R24,6
	ldi R30,240
	cpc R25,R30
	brne L28
	.dbline 132
	.dbline 133
; 										if(t==checksum) {
	cp R20,R12
	brne L30
	.dbline 133
	.dbline 134
; 											process_command(seq_num);
	ldd R16,y+0
	rcall _process_command
	.dbline 135
; 											}
L30:
	.dbline 136
; 										state = ST_START;
	ldi R24,61440
	ldi R25,240
	movw R14,R24
	.dbline 137
; 										}
L28:
	.dbline 138
; 									}
L25:
	.dbline 139
; 								}
L21:
	.dbline 140
; 							}
L19:
	.dbline 141
; 						}
L17:
	.dbline 142
; 					}
L15:
	.dbline 143
; 				}
L11:
	.dbline 144
; 			}
L8:
	.dbline 145
L6:
	.dbline 82
	rjmp L5
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 adc_get _adc_get fc
;              n -> R16
	.even
_adc_get::
	.dbline -1
	.dbline 156
; 		}
; }
; 
; /**
; 	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)
; {
	.dbline 157
; 	ADMUX&=0xF0;
	lds R24,124
	andi R24,240
	sts 124,R24
	.dbline 158
; 	ADMUX|=n&0x7;
	mov R24,R16
	andi R24,7
	lds R2,124
	or R2,R24
	sts 124,R2
L33:
	.dbline 160
L34:
	.dbline 160
; 
; 	while(ADCSRA&0x40);
	lds R2,122
	sbrc R2,6
	rjmp L33
	.dbline 161
; 	ADCSRA|=(1<<ADSC);
	lds R24,122
	ori R24,64
	sts 122,R24
L36:
	.dbline 162
L37:
	.dbline 162
; 	while(ADCSRA&0x40);
	lds R2,122
	sbrc R2,6
	rjmp L36
	.dbline 164
; 
; 	return ADCH;
	lds R16,121
	.dbline -2
L32:
	.dbline 0 ; func end
	ret
	.dbsym r n 16 c
	.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 173
; }
; 
; /**
; 	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 175
; 	unsigned char cmd;
; 	unsigned char tmp=0;
	clr R0
	std y+13,R0
	.dbline 179
; 	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 180
; 	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 181
; 	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 183
; 
; 	cmd = msg_buffer[0];
	lds R2,_msg_buffer
	std y+12,R2
	.dbline 188
; 
; 	//////////////////////////////////////
; 	//CMD_SIGN_ON
; 	//////////////////////////////////////
; 	if(cmd==CMD_SIGN_ON)
	mov R24,R2
	cpi R24,1
	brne L40
	.dbline 189
; 	{
	.dbline 190
; 		num_bytes = 11;
	ldi R24,11
	ldi R25,0
	std y+11,R25
	std y+10,R24
	.dbline 191
; 		msg_buffer[0] = CMD_SIGN_ON;
	ldi R24,1
	sts _msg_buffer,R24
	.dbline 192
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 193
; 		msg_buffer[2] = 8;
	ldi R24,8
	sts _msg_buffer+2,R24
	.dbline 194
; 		memcpy(msg_buffer+3,"AVRISP_2",8);
	std y+1,R25
	std y+0,R24
	ldi R18,<L45
	ldi R19,>L45
	ldi R16,<_msg_buffer+3
	ldi R17,>_msg_buffer+3
	rcall _memcpy
	.dbline 195
; 	}
	rjmp L41
L40:
	.dbline 199
; 	//////////////////////////////////////
; 	//CMD_SET_PARAMETER
; 	//////////////////////////////////////
; 	else if(cmd==CMD_SET_PARAMETER)
	ldd R24,y+12
	cpi R24,2
	breq X7
	rjmp L46
X7:
	.dbline 200
; 	{
	.dbline 201
; 		switch(msg_buffer[1])
	lds R10,_msg_buffer+1
	clr R11
	movw R24,R10
	cpi R24,152
	ldi R30,0
	cpc R25,R30
	breq L52
	cpi R24,152
	ldi R30,0
	cpc R25,R30
	brge X8
	rjmp L48
X8:
L77:
	movw R24,R10
	cpi R24,158
	ldi R30,0
	cpc R25,R30
	brne X9
	rjmp L73
X9:
	cpi R24,159
	ldi R30,0
	cpc R25,R30
	brne X10
	rjmp L75
X10:
	rjmp L48
X3:
	.dbline 202
; 		{
L52:
	.dbline 204
; 			case PARAM_SCK_DURATION:
; 				clock_speed=SPI_SPEED_2MHZ;
	ldi R24,1
	sts _clock_speed,R24
	.dbline 205
; 				if((msg_buffer[2]) >= 1  ) clock_speed=SPI_SPEED_2MHZ;
	lds R24,_msg_buffer+2
	cpi R24,1
	brlo L53
	.dbline 205
	ldi R24,1
	sts _clock_speed,R24
L53:
	.dbline 206
; 				if((msg_buffer[2]) >= 2  ) clock_speed=SPI_SPEED_1MHZ;
	lds R24,_msg_buffer+2
	cpi R24,2
	brlo L56
	.dbline 206
	ldi R24,2
	sts _clock_speed,R24
L56:
	.dbline 207
; 				if((msg_buffer[2]) >= 4  ) clock_speed=SPI_SPEED_500KHZ;
	lds R24,_msg_buffer+2
	cpi R24,4
	brlo L59
	.dbline 207
	ldi R24,3
	sts _clock_speed,R24
L59:
	.dbline 208
; 				if((msg_buffer[2]) >= 8  ) clock_speed=SPI_SPEED_250KHZ;
	lds R24,_msg_buffer+2
	cpi R24,8
	brlo L62
	.dbline 208
	ldi R24,4
	sts _clock_speed,R24
L62:
	.dbline 209
; 				if((msg_buffer[2]) >= 16 ) clock_speed=SPI_SPEED_125KHZ;
	lds R24,_msg_buffer+2
	cpi R24,16
	brlo L65
	.dbline 209
	ldi R24,5
	sts _clock_speed,R24
L65:
	.dbline 210
; 				if((msg_buffer[2]) >= 32 ) clock_speed=SPI_SPEED_62KHZ;
	lds R24,_msg_buffer+2
	cpi R24,32
	brlo L68
	.dbline 210
	ldi R24,6
	sts _clock_speed,R24
L68:
	.dbline 212
; 				//if(eeprom_read_byte(&eeprom_sck_period)!=clock_speed) eeprom_write_byte(&eeprom_sck_period,clock_speed);
; 				if (eeprom_sck_period != clock_speed) {
	lds R2,_clock_speed
	lds R3,_eeprom_sck_period
	cp R3,R2

⌨️ 快捷键说明

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