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

📄 stk500i.lst

📁 AVR单片机,STK500下载线制作全套资料,包括程序,电路图
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0034) #define	ST_PROCESS		0xF007								/*消息						*/
(0035) 
(0036) void chip_init(void);
(0037) //unsigned char adc_get(char n);
(0038) void process_command(unsigned char seq_num);
(0039) 
(0040) //Some global variables
(0041) unsigned char msg_buffer[300];
(0042) unsigned char clock_speed;			/*下载速度*/
(0043) unsigned char reset_polarity;
(0044) unsigned char param_controller_init;
(0045) unsigned char prgmode;
(0046) 
(0047) unsigned long address;
(0048) 
(0049) void main(void) {
(0050) 	
(0051) 	unsigned int i=0;
    00A7 2400      CLR	R0
    00A8 2411      CLR	R1
    00A9 821A      STD	Y+2,R1
    00AA 8209      STD	Y+1,R0
(0052) 
(0053) 	unsigned char seq_num=0;
    00AB 8208      STD	Y+0,R0
(0054) 	unsigned int msg_size=0;
    00AC 2766      CLR	R22
    00AD 2777      CLR	R23
(0055) 	unsigned char checksum=0;
    00AE 24CC      CLR	R12
(0056) 
(0057) 	/// next state
(0058) 	unsigned int state=ST_START;	/*应该是状态标志*/
    00AF E080      LDI	R24,0
    00B0 EF90      LDI	R25,0xF0
    00B1 017C      MOVW	R14,R24
(0059) 
(0060) 	unsigned char t;
(0061) 	signed int rec_data;
(0062) 
(0063) 	chip_init();
    00B2 D7CD      RCALL	_chip_init
(0064) 	interface_init();
    00B3 DFB5      RCALL	_interface_init
(0065) 	spi_disable();
    00B4 D7F8      RCALL	_spi_disable
(0066) 
(0067) 	
(0068) 	//clock_speed=eeprom_read_byte(&eeprom_sck_period);
(0069) 	//clock_speed=eeprom_sck_period;
(0070) 	//if (clock_speed==0xFF) {
(0071) 	//	clock_speed=SPI_SPEED_125KHZ;
(0072) 	//	}
(0073) 	clock_speed = SPI_SPEED_230KHz;
    00B5 E081      LDI	R24,1
    00B6 93800073  STS	clock_speed,R24
(0074) 	spi_set_speed(clock_speed);
    00B8 2F08      MOV	R16,R24
    00B9 D805      RCALL	_spi_set_speed
(0075) 	
(0076) 	SEI();
    00BA 9478      BSET	7
(0077) 
(0078) 	LED_GN_OFF;
    00BB 9895      CBI	0x12,5
(0079) 	LED_RT_ON;
    00BC 9A96      SBI	0x12,6
(0080) 	wait_ms(2000);
    00BD ED00      LDI	R16,0xD0
    00BE E017      LDI	R17,7
    00BF DF9C      RCALL	_wait_ms
(0081) 	LED_GN_ON;
    00C0 9A95      SBI	0x12,5
(0082) 	LED_RT_OFF;
    00C1 9896      CBI	0x12,6
    00C2 C07A      RJMP	0x013D
(0083) 	
(0084) 	while(2) {
(0085) 		rec_data=interface_getc();
    00C3 DFAC      RCALL	_interface_getc
    00C4 0158      MOVW	R10,R16
(0086) 		//if a byte has been received -> process it
(0087) 		if(rec_data!=-1) {
    00C5 01C5      MOVW	R24,R10
    00C6 3F0F      CPI	R16,0xFF
    00C7 EFEF      LDI	R30,0xFF
    00C8 071E      CPC	R17,R30
    00C9 F409      BNE	0x00CB
    00CA C072      RJMP	0x013D
(0088) 			t=rec_data&0xFF;
    00CB 2F48      MOV	R20,R24
    00CC 7050      ANDI	R21,0
(0089) 
(0090) 			if(state==ST_START) {
    00CD 01C7      MOVW	R24,R14
    00CE 3080      CPI	R24,0
    00CF EFE0      LDI	R30,0xF0
    00D0 079E      CPC	R25,R30
    00D1 F449      BNE	0x00DB
(0091) 				if(t==MESSAGE_START) {
    00D2 314B      CPI	R20,0x1B
    00D3 F009      BEQ	0x00D5
    00D4 C068      RJMP	0x013D
(0092) 					state = ST_GET_SEQ_NUM;
    00D5 E081      LDI	R24,1
    00D6 EF90      LDI	R25,0xF0
    00D7 017C      MOVW	R14,R24
(0093) 					checksum = MESSAGE_START^0;
    00D8 E18B      LDI	R24,0x1B
    00D9 2EC8      MOV	R12,R24
(0094) 					}
(0095) 				}
    00DA C062      RJMP	0x013D
(0096) 			else {
(0097) 				if(state==ST_GET_SEQ_NUM) {
    00DB 01C7      MOVW	R24,R14
    00DC 3081      CPI	R24,1
    00DD EFE0      LDI	R30,0xF0
    00DE 079E      CPC	R25,R30
    00DF F431      BNE	0x00E6
(0098) 					seq_num = t;
    00E0 8348      STD	Y+0,R20
(0099) 					state = ST_MSG_SIZE_1;
    00E1 E082      LDI	R24,2
    00E2 EF90      LDI	R25,0xF0
    00E3 017C      MOVW	R14,R24
(0100) 					checksum ^= t;
    00E4 26C4      EOR	R12,R20
(0101) 					}
    00E5 C057      RJMP	0x013D
(0102) 				else {
(0103) 					if(state==ST_MSG_SIZE_1) {
    00E6 01C7      MOVW	R24,R14
    00E7 3082      CPI	R24,2
    00E8 EFE0      LDI	R30,0xF0
    00E9 079E      CPC	R25,R30
    00EA F449      BNE	0x00F4
(0104) 						msg_size = t<<8;
    00EB 2F64      MOV	R22,R20
    00EC 2777      CLR	R23
    00ED 2F76      MOV	R23,R22
    00EE 2766      CLR	R22
(0105) 						state = ST_MSG_SIZE_2;
    00EF E083      LDI	R24,3
    00F0 EF90      LDI	R25,0xF0
    00F1 017C      MOVW	R14,R24
(0106) 						checksum ^= t;
    00F2 26C4      EOR	R12,R20
(0107) 						}
    00F3 C049      RJMP	0x013D
(0108) 					else {
(0109) 						if(state==ST_MSG_SIZE_2) {
    00F4 01C7      MOVW	R24,R14
    00F5 3083      CPI	R24,3
    00F6 EFE0      LDI	R30,0xF0
    00F7 079E      CPC	R25,R30
    00F8 F449      BNE	0x0102
(0110) 							msg_size |= t;
    00F9 2E24      MOV	R2,R20
    00FA 2433      CLR	R3
    00FB 2962      OR	R22,R2
    00FC 2973      OR	R23,R3
(0111) 							state = ST_GET_TOKEN;
    00FD E084      LDI	R24,4
    00FE EF90      LDI	R25,0xF0
    00FF 017C      MOVW	R14,R24
(0112) 							checksum ^= t;
    0100 24C2      EOR	R12,R2
(0113) 							}
    0101 C03B      RJMP	0x013D
(0114) 						else {
(0115) 							if(state==ST_GET_TOKEN) {
    0102 01C7      MOVW	R24,R14
    0103 3084      CPI	R24,4
    0104 EFE0      LDI	R30,0xF0
    0105 079E      CPC	R25,R30
    0106 F479      BNE	0x0116
(0116) 								if(t==TOKEN) {
    0107 304E      CPI	R20,0xE
    0108 F449      BNE	0x0112
(0117) 									state = ST_GET_DATA;
    0109 E085      LDI	R24,5
    010A EF90      LDI	R25,0xF0
    010B 017C      MOVW	R14,R24
(0118) 									checksum ^= t;
    010C 26C4      EOR	R12,R20
(0119) 									i=0;
    010D 2400      CLR	R0
    010E 2411      CLR	R1
    010F 821A      STD	Y+2,R1
    0110 8209      STD	Y+1,R0
(0120) 									}
    0111 C02B      RJMP	0x013D
(0121) 								else {
(0122) 									state = ST_START;
    0112 E080      LDI	R24,0
    0113 EF90      LDI	R25,0xF0
    0114 017C      MOVW	R14,R24
(0123) 									}
(0124) 								}
    0115 C027      RJMP	0x013D
(0125) 							else {
(0126) 								if(state==ST_GET_DATA) {
    0116 01C7      MOVW	R24,R14
    0117 3085      CPI	R24,5
    0118 EFE0      LDI	R30,0xF0
    0119 079E      CPC	R25,R30
    011A F4B1      BNE	0x0131
(0127) 									msg_buffer[i++] = t;
    011B 8029      LDD	R2,Y+1
    011C 803A      LDD	R3,Y+2
    011D 01C1      MOVW	R24,R2
    011E 9601      ADIW	R24,1
    011F 839A      STD	Y+2,R25
    0120 8389      STD	Y+1,R24
    0121 E784      LDI	R24,0x74
    0122 E090      LDI	R25,0
    0123 01F1      MOVW	R30,R2
    0124 0FE8      ADD	R30,R24
    0125 1FF9      ADC	R31,R25
    0126 8340      STD	Z+0,R20
(0128) 									checksum ^= t;
    0127 26C4      EOR	R12,R20
(0129) 									if(i==msg_size) {
    0128 8009      LDD	R0,Y+1
    0129 801A      LDD	R1,Y+2
    012A 1606      CP	R0,R22
    012B 0617      CPC	R1,R23
    012C F481      BNE	0x013D
(0130) 										state = ST_GET_CHECK;
    012D E086      LDI	R24,6
    012E EF90      LDI	R25,0xF0
    012F 017C      MOVW	R14,R24
(0131) 										}
(0132) 									}
    0130 C00C      RJMP	0x013D
(0133) 								else {
(0134) 									if(state==ST_GET_CHECK) {
    0131 01C7      MOVW	R24,R14
    0132 3086      CPI	R24,6
    0133 EFE0      LDI	R30,0xF0
    0134 079E      CPC	R25,R30
    0135 F439      BNE	0x013D
(0135) 										if(t==checksum) {
    0136 154C      CP	R20,R12
    0137 F411      BNE	0x013A
(0136) 											process_command(seq_num);
    0138 8108      LDD	R16,Y+0
    0139 D006      RCALL	_process_command
(0137) 											}
(0138) 										state = ST_START;
    013A E080      LDI	R24,0
    013B EF90      LDI	R25,0xF0
    013C 017C      MOVW	R14,R24
    013D CF85      RJMP	0x00C3
    013E 9623      ADIW	R28,3
    013F 9508      RET
_process_command:
  mode                 --> R14
  block_size           --> R10
  start_address        --> Y+6
  polling_address      --> Y+2
  tmp                  --> Y+13
  cmd                  --> Y+12
  num_bytes            --> Y+10
  i                    --> R12
  seq_num              --> Y+24
    0140 931A      ST	R17,-Y
    0141 930A      ST	R16,-Y
    0142 D856      RCALL	push_gset5
    0143 972E      SBIW	R28,0xE
(0139) 										}
(0140) 									}
(0141) 								}
(0142) 							}
(0143) 						}
(0144) 					}
(0145) 				}
(0146) 			}
(0147) 		}
(0148) }
(0149) 
(0150) /**
(0151) 	Returns the value of the selected adc channel
(0152) 
(0153) 	@param n Number of ADC channel
(0154) 
(0155) 	@return  Value of ADC channel
(0156) */
(0157) /*unsigned char adc_get(char n)
(0158) {
(0159) 	ADMUX&=0xF0;
(0160) 	ADMUX|=n&0x7;
(0161) 
(0162) 	while(ADCSRA&0x40);
(0163) 	ADCSRA|=(1<<ADSC);
(0164) 	while(ADCSRA&0x40);
(0165) 
(0166) 	return ADCH;
(0167) }*/
(0168) 
(0169) /**
(0170) 	Processes a command packet received in main loop and located in the global buffer
(0171) 
(0172) 	@param	seq_num	The sequence number of the command packet
(0173) */
(0174) void process_command(unsigned char seq_num)
(0175) {
(0176) 	unsigned char cmd;
(0177) 	unsigned char tmp=0;
    0144 2400      CLR	R0
    0145 860D      STD	Y+13,R0
(0178) 	unsigned char mode;
(0179) 	unsigned int block_size;
(0180) 	unsigned int i;
(0181) 	unsigned int num_bytes=0;
    0146 2411      CLR	R1
    0147 861B      STD	Y+11,R1
    0148 860A      STD	Y+10,R0
(0182) 	unsigned long polling_address=0;
    0149 E040      LDI	R20,0
    014A E050      LDI	R21,0
    014B E060      LDI	R22,0
    014C E070      LDI	R23,0
    014D 01FE      MOVW	R30,R28
    014E 8342      STD	Z+2,R20
    014F 8353      STD	Z+3,R21
    0150 8364      STD	Z+4,R22
    0151 8375      STD	Z+5,R23
(0183) 	unsigned long start_address = address;
    0152 9040006E  LDS	R4,address+2
    0154 9050006F  LDS	R5,address+3
    0156 9020006C  LDS	R2,address
    0158 9030006D  LDS	R3,address+1
    015A 01FE      MOVW	R30,R28
    015B 8226      STD	Z+6,R2
    015C 8237      STD	Z+7,R3
    015D 8640      STD	Z+8,R4
    015E 8651      STD	Z+9,R5
(0184) 
(0185) 	cmd = msg_buffer[0];
    015F 90200074  LDS	R2,msg_buffer
    0161 862C      STD	Y+12,R2
(0186) 
(0187) 	//////////////////////////////////////
(0188) 	//CMD_SIGN_ON
(0189) 	//////////////////////////////////////
(0190) 	if(cmd==CMD_SIGN_ON)
    0162 2D82      MOV	R24,R2
    0163 3081      CPI	R24,1
    0164 F4A9      BNE	0x017A
(0191) 	{
(0192) 		num_bytes = 11;
    0165 E08B      LDI	R24,0xB
    0166 E090      LDI	R25,0
    0167 879B      STD	Y+11,R25
    0168 878A      STD	Y+10,R24
(0193) 		msg_buffer[0] = CMD_SIGN_ON;
    0169 E081      LDI	R24,1
    016A 93800074  STS	msg_buffer,R24
(0194) 		msg_buffer[1] = STATUS_CMD_OK;
    016C 2422      CLR	R2
    016D 92200075  STS	msg_buffer+1,R2
(0195) 		msg_buffer[2] = 8;
    016F E088      LDI	R24,0x8
    0170 93800076  STS	msg_buffer+2,R24
(0196) 		memcpy(msg_buffer+3,"AVRISP_2",8);
    0172 8399      STD	Y+1,R25
    0173 8388      STD	Y+0,R24
    0174 E620      LDI	R18,0x60
    0175 E030      LDI	R19,0
    0176 E707      LDI	R16,0x77
    0177 E010      LDI	R17,0
    0178 D7DD      RCALL	_memcpy
(0197) 	}
    0179 C6E0      RJMP	0x085A
(0198) 	//////////////////////////////////////
(0199) 	//CMD_SET_PARAMETER
(0200) 	//////////////////////////////////////
(0201) 	else if(cmd==CMD_SET_PARAMETER)
    017A 858C      LDD	R24,Y+12
    017B 3082      CPI	R24,2
    017C F581      BNE	0x01AD
(0202) 	{
(0203) 		switch(msg_buffer[1])
    017D 90A00075  LDS	R10,msg_buffer+1
    017F 24BB      CLR	R11
    0180 01C5      MOVW	R24,R10
    0181 3988      CPI	R24,0x98
    0182 E0E0      LDI	R30,0
    0183 079E      CPC	R25,R30
    0184 F071      BEQ	0x0193
    0185 3988      CPI	R24,0x98
    0186 E0E0      LDI	R30,0
    0187 079E      CPC	R25,R30
    0188 F0D4      BLT	0x01A3
    0189 01C5      MOVW	R24,R10
    018A 398E      CPI	R24,0x9E
    018B E0E0      LDI	R30,0
    018C 079E      CPC	R25,R30
    018D F061      BEQ	0x019A
    018E 398F      CPI	R24,0x9F
    018F E0E0      LDI	R30,0
    0190 079E      CPC	R25,R30
    0191 F069      BEQ	0x019F
    0192 C010      RJMP	0x01A3
(0204) 		{
(0205) 			case PARAM_SCK_DURATION:
(0206) 				clock_speed=msg_buffer[2];
    0193 90200076  LDS	R2,msg_buffer+2
    0195 92200073  STS	clock_speed,R2
(0207) 				//if(eeprom_read_byte(&eeprom_sck_period)!=clock_speed) eeprom_write_byte(&eeprom_sck_period,clock_speed);
(0208) 				//if (eeprom_sck_period != clock_speed) {
(0209) 				//	eeprom_sck_period = clock_speed;
(0210) 				//	}
(0211) 				spi_set_speed(clock_speed);
    0197 2D02      MOV	R16,R2
    0198 D726      RCALL	_spi_set_speed
(0212) 				break;
    0199 C009      RJMP	0x01A3
(0213) 			case PARAM_RESET_POLARITY:
(0214) 				reset_polarity = msg_buffer[2];
    019A 90200076  LDS	R2,msg_buffer+2
    019C 92200072  STS	reset_polarity,R2

⌨️ 快捷键说明

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