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

📄 main.s

📁 很好的制作AVR32 ICE的资料
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile E:\单片机\源程序\Snail_mkII\STK500_V2\ICC\main.c
	.dbfunc e main _main fI
;      rec_data1 -> R10,R11
;             t0 -> R10
;         state0 -> R20,R21
;      checksum0 -> R22
;      msg_size0 -> R12,R13
;       seq_num0 -> y+2
;             i0 -> y+0
	.even
_main::
	sbiw R28,4
	.dbline -1
	.dbline 65
; /**	\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 <stdlib.h>
; #include <string.h>
; #include <iccioavr.h>
; #include <eeprom.h>
; #include <macros.h>
; #include "interface.h"
; #include "spi.h"
; #include "tools.h"
; #include "extern_vars.h"
; 
; //Atmel Includes
; #include "command.h"
; 
; #include "config.h"
; 
; //States used in the receive state machine
; #define	ST_START		0xF000
; #define	ST_GET_SEQ_NUM	0xF001
; #define ST_MSG_SIZE_1	0xF002
; #define ST_MSG_SIZE_2	0xF003
; #define ST_GET_TOKEN	0xF004
; #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;
; 
; int main(void)
; {
	.dbline 66
;   unsigned int i=0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 68
; 
;   unsigned char seq_num=0;
	std y+2,R0
	.dbline 69
;   unsigned int msg_size=0;
	clr R12
	clr R13
	.dbline 70
;   unsigned char checksum=0;
	clr R22
	.dbline 73
; 
;   /// next state
;   unsigned int state=ST_START;
	ldi R20,61440
	ldi R21,240
	.dbline 78
; 
;   unsigned char t;
;   signed int rec_data;
; 
;   chip_init();
	xcall _chip_init
	.dbline 79
;   interface_init();
	xcall _interface_init
	.dbline 80
;   spi_disable();
	xcall _spi_disable
	.dbline 82
; 
;   clock_speed=EEPROMread((int)&eeprom_sck_period);
	ldi R16,<_eeprom_sck_period
	ldi R17,>_eeprom_sck_period
	xcall _EEPROMread
	sts _clock_speed,R16
	.dbline 83
;   if (clock_speed==0xFF) clock_speed=SPI_SPEED_125KHZ;
	cpi R16,255
	brne L3
X0:
	.dbline 83
	ldi R24,5
	sts _clock_speed,R24
L3:
	.dbline 84
;   spi_set_speed(clock_speed);
	lds R16,_clock_speed
	xcall _spi_set_speed
	.dbline 86
; 
;   SEI();
	sei
	.dbline 88
; 
;   LED_GN_ON;
	sbi 0x12,2
	.dbline 89
;   LED_RT_OFF;
	ldi R24,-9
	ldi R25,-1
	in R2,0x12
	and R2,R24
	out 0x12,R2
	xjmp L6
L5:
	.dbline 106
; 
;   /*
;   while(2)
;   {
;   	rec_data=interface_getc();
;   	//if a byte has been received -> process it
;   	if(rec_data!=-1)
;   	{
;   		interface_putc(rec_data);
;   		LED_GN_TOG;
;   		LED_RT_TOG;
;   	}
;   }
;   */
; 
;   while (2)
;     {
	.dbline 108
;       
;       rec_data=interface_getc();
	xcall _interface_getc
	movw R10,R16
	.dbline 112
;       
;       
;       //if a aviliable byte has been received -> process it.
;       if (rec_data!=-1)
	movw R24,R10
	cpi R16,255
	ldi R30,255
	cpc R17,R30
	brne X14
	xjmp L8
X14:
X1:
	.dbline 113
;         {
	.dbline 114
;           t=rec_data&0xFF;
	andi R25,0
	mov R10,R24
	.dbline 116
; 
;           if (state==ST_START)
	cpi R20,0
	ldi R30,240
	cpc R21,R30
	brne L10
X2:
	.dbline 117
;             {
	.dbline 118
;               if (t==MESSAGE_START)
	cpi R24,27
	breq X15
	xjmp L11
X15:
X3:
	.dbline 119
;                 {
	.dbline 120
;                   state = ST_GET_SEQ_NUM;
	ldi R20,61441
	ldi R21,240
	.dbline 121
;                   checksum = MESSAGE_START^0;
	ldi R22,27
	.dbline 122
;                 }
	.dbline 123
;             }
	xjmp L11
L10:
	.dbline 124
;           else if (state==ST_GET_SEQ_NUM)
	cpi R20,1
	ldi R30,240
	cpc R21,R30
	brne L14
X4:
	.dbline 125
;             {
	.dbline 126
;               seq_num = t;
	std y+2,R10
	.dbline 127
;               state = ST_MSG_SIZE_1;
	ldi R20,61442
	ldi R21,240
	.dbline 128
;               checksum ^= t;
	eor R22,R10
	.dbline 129
;             }
	xjmp L15
L14:
	.dbline 130
;           else if (state==ST_MSG_SIZE_1)
	cpi R20,2
	ldi R30,240
	cpc R21,R30
	brne L16
X5:
	.dbline 131
;             {
	.dbline 132
;               msg_size = t<<8;
	mov R12,R10
	clr R13
	mov R13,R12
	clr R12
	.dbline 133
;               state = ST_MSG_SIZE_2;
	ldi R20,61443
	ldi R21,240
	.dbline 134
;               checksum ^= t;
	eor R22,R10
	.dbline 135
;             }
	xjmp L17
L16:
	.dbline 136
;           else if (state==ST_MSG_SIZE_2)
	cpi R20,3
	ldi R30,240
	cpc R21,R30
	brne L18
X6:
	.dbline 137
;             {
	.dbline 138
;               msg_size |= t;
	mov R2,R10
	clr R3
	or R12,R2
	or R13,R3
	.dbline 139
;               state = ST_GET_TOKEN;
	ldi R20,61444
	ldi R21,240
	.dbline 140
;               checksum ^= t;
	eor R22,R2
	.dbline 141
;             }
	xjmp L19
L18:
	.dbline 142
;           else if (state==ST_GET_TOKEN)
	cpi R20,4
	ldi R30,240
	cpc R21,R30
	brne L20
X7:
	.dbline 143
;             {
	.dbline 144
;               if (t==TOKEN)
	mov R24,R10
	cpi R24,14
	brne L22
X8:
	.dbline 145
;                 {
	.dbline 146
;                   state = ST_GET_DATA;
	ldi R20,61445
	ldi R21,240
	.dbline 147
;                   checksum ^= t;
	eor R22,R24
	.dbline 148
;                   i=0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 149
;                 }
	xjmp L21
L22:
	.dbline 150
;               else state = ST_START;
	ldi R20,61440
	ldi R21,240
	.dbline 151
;             }
	xjmp L21
L20:
	.dbline 152
;           else if (state==ST_GET_DATA)
	cpi R20,5
	ldi R30,240
	cpc R21,R30
	brne L24
X9:
	.dbline 153
;             {
	.dbline 154
;               msg_buffer[i++] = t;
	ldd R14,y+0
	ldd R15,y+1
	movw R24,R14
	adiw R24,1
	std y+1,R25
	std y+0,R24
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R14
	add R30,R24
	adc R31,R25
	std z+0,R10
	.dbline 155
;               checksum ^= t;
	eor R22,R10
	.dbline 156
;               if (i==msg_size)
	ldd R0,y+0
	ldd R1,y+1
	cp R0,R12
	cpc R1,R13
	brne L25
X10:
	.dbline 157
;                 {
	.dbline 158
;                   state = ST_GET_CHECK;
	ldi R20,61446
	ldi R21,240
	.dbline 159
;                 }
	.dbline 160
;             }
	xjmp L25
L24:
	.dbline 161
;           else if (state==ST_GET_CHECK)
	cpi R20,6
	ldi R30,240
	cpc R21,R30
	brne L28
X11:
	.dbline 162
;             {
	.dbline 163
;               if (t==checksum)
	cp R10,R22
	brne L30
X12:
	.dbline 164
;                 {
	.dbline 165
;                   process_command(seq_num);
	ldd R16,y+2
	xcall _process_command
	.dbline 166
;                 }
L30:
	.dbline 168
; 
;               state = ST_START;
	ldi R20,61440
	ldi R21,240
	.dbline 169
;             }
L28:
L25:
L21:
L19:
L17:
L15:
L11:
	.dbline 171
; 
;         }//if(rec_data!=-1)
L8:
	.dbline 172
;     }//while(2)
L6:
	.dbline 105
	xjmp L5
X13:
	.dbline -2
L2:
	.dbline 0 ; func end
	adiw R28,4
	ret
	.dbsym r rec_data1 10 I
	.dbsym r t0 10 c
	.dbsym r state0 20 i
	.dbsym r checksum0 22 c
	.dbsym r msg_size0 12 i
	.dbsym l seq_num0 2 c
	.dbsym l i0 0 i
	.dbend
	.dbfunc e adc_get _adc_get fc
;              n -> R16
	.even
_adc_get::
	.dbline -1
	.dbline 186
; 
;   return 0;
; 
; }
; 
; /**
; 	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 187
;   ADMUX&=0xF0;
	in R24,0x7
	andi R24,240
	out 0x7,R24
	.dbline 188
;   ADMUX|=n&0x7;
	mov R24,R16
	andi R24,7
	in R2,0x7
	or R2,R24
	out 0x7,R2
L33:
	.dbline 190
; 
;   while (ADCSRA&0x40);
L34:
	.dbline 190
	sbic 0x6,6
	rjmp L33
X16:
	.dbline 191
;   ADCSRA|=(1<<ADSC);
	sbi 0x6,6
L36:
	.dbline 192
;   while (ADCSRA&0x40);
L37:
	.dbline 192
	sbic 0x6,6
	rjmp L36
X17:
	.dbline 194
; 
;   return ADCH;
	in R16,0x5
	.dbline -2
L32:
	.dbline 0 ; func end
	ret
	.dbsym r n 16 c
	.dbend
	.dbfunc e process_command _process_command fV
; bytes_to_transmit0 -> y+12
;       rx_from0 -> y+14
;      rx_bytes0 -> R12
;      tx_bytes0 -> y+10
;           Reg9 -> R12,R13
;          Reg80 -> y+14
;          Reg26 -> y+16
;          Reg48 -> R12,R13
;          Reg17 -> y+16
;          Reg39 -> R12,R13
;          Reg65 -> y+16
;          Reg72 -> y+16
;          Reg59 -> R12,R13
;          Reg29 -> y+20
;          Reg12 -> y+16
;            i29 -> R12,R13
;          tmp47 -> R14
;            i23 -> R12,R13
;            i20 -> R14,R15
;          tmp39 -> R14
;            i16 -> R14,R15
;          mode7 -> y+12
;    block_size6 -> y+14
;            i13 -> R14,R15
;          tmp37 -> y+14
;    block_size4 -> y+12
;            i10 -> R14,R15
;          tmp31 -> R12
;             i6 -> R14,R15
;          mode0 -> y+14
;    block_size2 -> y+12
;             i3 -> R12,R13
;          tmp29 -> y+12
;    block_size0 -> y+14
;          tmp24 -> R14
;          tmp23 -> R14
;          tmp22 -> R14
;          tmp21 -> R14
;          tmp16 -> R14
;          tmp15 -> R14
;          tmp14 -> R14
;          tmp13 -> R14
;          tmp12 -> R14
;          tmp11 -> R14
;          tmp10 -> R14
;           tmp9 -> R14
;           tmp8 -> R14
;           tmp7 -> R14
;           tmp6 -> R14
;           tmp5 -> R14
;           tmp2 -> R12
;     num_bytes1 -> R10,R11
;             i0 -> R14,R15
;           cmd0 -> y+10
; start_address0 -> y+6
; polling_address0 -> y+2
;           tmp0 -> y+18
;        seq_num -> y+32
	.even
_process_command::
	st -y,r17
	st -y,r16
	xcall push_xgsetF0FC
	sbiw R28,22
	.dbline -1
	.dbline 203
; }
; 
; /**
; 	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 205
;   unsigned char cmd;
;   unsigned char tmp=0;
	clr R0
	std y+18,R0
	.dbline 209
;   unsigned char mode;
;   unsigned int block_size;
;   unsigned int i;
;   unsigned int num_bytes=0;
	clr R10
	clr R11
	.dbline 210
;   unsigned long polling_address=0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	std y+2,R20
	std y+3,R21
	std y+4,R22
	std y+5,R23
	.dbline 211
;   unsigned long start_address = address;
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	std y+6,R2
	std y+7,R3
	std y+8,R4
	std y+9,R5
	.dbline 213
; 
;   cmd = msg_buffer[0];
	lds R2,_msg_buffer
	std y+10,R2
	.dbline 218
; 
;   //////////////////////////////////////
;   //CMD_SIGN_ON
;   //////////////////////////////////////
;   if (cmd==CMD_SIGN_ON)
	mov R24,R2
	cpi R24,1
	brne L40
X18:
	.dbline 219
;     {
	.dbline 220
;       num_bytes = 11;
	ldi R24,11
	ldi R25,0
	movw R10,R24
	.dbline 221
;       msg_buffer[0] = CMD_SIGN_ON;
	ldi R24,1
	sts _msg_buffer,R24
	.dbline 222
;       msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 223
;       msg_buffer[2] = 8;
	ldi R24,8
	sts _msg_buffer+2,R24
	.dbline 224
;       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
	xcall _memcpy
	.dbline 225
;     }
	xjmp L41
L40:
	.dbline 229
;   //////////////////////////////////////
;   //CMD_SET_PARAMETER
;   //////////////////////////////////////
;   else if (cmd==CMD_SET_PARAMETER)
	ldd R24,y+10
	cpi R24,2
	breq X135
	xjmp L46
X135:
X19:
	.dbline 230
;     {
	.dbline 231
;       switch (msg_buffer[1])
	lds R12,_msg_buffer+1
	mov R24,R12
	cpi R24,152
	breq L52
X20:
	cpi R24,152
	brsh X136
	xjmp L48
X136:
X21:
L77:
	mov R24,R12
	cpi R24,158
	brne X137
	xjmp L73
X137:
X22:
	cpi R24,159
	brne X138
	xjmp L75
X138:
X23:
	xjmp L48
L52:
	.dbline 234
;         {
;         case PARAM_SCK_DURATION:
;           clock_speed=SPI_SPEED_2MHZ;

⌨️ 快捷键说明

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