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

📄 stk500i.lst

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 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 D7DD      RCALL	_chip_init
(0064) 	interface_init();
    00B3 DFB5      RCALL	_interface_init
(0065) 	spi_disable();
    00B4 D810      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 D821      RCALL	_spi_set_speed
(0075) 	
(0076) 	SEI();
    00BA 9478      BSET	7
(0077) 
(0078) 	LED_GN_OFF;
    00BB EF8E      LDI	R24,0xFE
    00BC EF9F      LDI	R25,0xFF
    00BD B228      IN	R2,0x18
    00BE 2228      AND	R2,R24
    00BF BA28      OUT	0x18,R2
(0079) 	LED_RT_ON;
    00C0 9AC1      SBI	0x18,1
(0080) 	wait_ms(2000);
    00C1 ED00      LDI	R16,0xD0
    00C2 E017      LDI	R17,7
    00C3 DF98      RCALL	_wait_ms
(0081) 	LED_GN_ON;
    00C4 9AC0      SBI	0x18,0
(0082) 	LED_RT_OFF;
    00C5 EF8D      LDI	R24,0xFD
    00C6 EF9F      LDI	R25,0xFF
    00C7 B228      IN	R2,0x18
    00C8 2228      AND	R2,R24
    00C9 BA28      OUT	0x18,R2
    00CA C07A      RJMP	0x0145
(0083) 	
(0084) 	while(2) {
(0085) 		rec_data=interface_getc();
    00CB DFA4      RCALL	_interface_getc
    00CC 0158      MOVW	R10,R16
(0086) 		//if a byte has been received -> process it
(0087) 		if(rec_data!=-1) {
    00CD 01C5      MOVW	R24,R10
    00CE 3F0F      CPI	R16,0xFF
    00CF EFEF      LDI	R30,0xFF
    00D0 071E      CPC	R17,R30
    00D1 F409      BNE	0x00D3
    00D2 C072      RJMP	0x0145
(0088) 			t=rec_data&0xFF;
    00D3 2F48      MOV	R20,R24
    00D4 7050      ANDI	R21,0
(0089) 
(0090) 			if(state==ST_START) {
    00D5 01C7      MOVW	R24,R14
    00D6 3080      CPI	R24,0
    00D7 EFE0      LDI	R30,0xF0
    00D8 079E      CPC	R25,R30
    00D9 F449      BNE	0x00E3
(0091) 				if(t==MESSAGE_START) {
    00DA 314B      CPI	R20,0x1B
    00DB F009      BEQ	0x00DD
    00DC C068      RJMP	0x0145
(0092) 					state = ST_GET_SEQ_NUM;
    00DD E081      LDI	R24,1
    00DE EF90      LDI	R25,0xF0
    00DF 017C      MOVW	R14,R24
(0093) 					checksum = MESSAGE_START^0;
    00E0 E18B      LDI	R24,0x1B
    00E1 2EC8      MOV	R12,R24
(0094) 					}
(0095) 				}
    00E2 C062      RJMP	0x0145
(0096) 			else {
(0097) 				if(state==ST_GET_SEQ_NUM) {
    00E3 01C7      MOVW	R24,R14
    00E4 3081      CPI	R24,1
    00E5 EFE0      LDI	R30,0xF0
    00E6 079E      CPC	R25,R30
    00E7 F431      BNE	0x00EE
(0098) 					seq_num = t;
    00E8 8348      STD	Y+0,R20
(0099) 					state = ST_MSG_SIZE_1;
    00E9 E082      LDI	R24,2
    00EA EF90      LDI	R25,0xF0
    00EB 017C      MOVW	R14,R24
(0100) 					checksum ^= t;
    00EC 26C4      EOR	R12,R20
(0101) 					}
    00ED C057      RJMP	0x0145
(0102) 				else {
(0103) 					if(state==ST_MSG_SIZE_1) {
    00EE 01C7      MOVW	R24,R14
    00EF 3082      CPI	R24,2
    00F0 EFE0      LDI	R30,0xF0
    00F1 079E      CPC	R25,R30
    00F2 F449      BNE	0x00FC
(0104) 						msg_size = t<<8;
    00F3 2F64      MOV	R22,R20
    00F4 2777      CLR	R23
    00F5 2F76      MOV	R23,R22
    00F6 2766      CLR	R22
(0105) 						state = ST_MSG_SIZE_2;
    00F7 E083      LDI	R24,3
    00F8 EF90      LDI	R25,0xF0
    00F9 017C      MOVW	R14,R24
(0106) 						checksum ^= t;
    00FA 26C4      EOR	R12,R20
(0107) 						}
    00FB C049      RJMP	0x0145
(0108) 					else {
(0109) 						if(state==ST_MSG_SIZE_2) {
    00FC 01C7      MOVW	R24,R14
    00FD 3083      CPI	R24,3
    00FE EFE0      LDI	R30,0xF0
    00FF 079E      CPC	R25,R30
    0100 F449      BNE	0x010A
(0110) 							msg_size |= t;
    0101 2E24      MOV	R2,R20
    0102 2433      CLR	R3
    0103 2962      OR	R22,R2
    0104 2973      OR	R23,R3
(0111) 							state = ST_GET_TOKEN;
    0105 E084      LDI	R24,4
    0106 EF90      LDI	R25,0xF0
    0107 017C      MOVW	R14,R24
(0112) 							checksum ^= t;
    0108 24C2      EOR	R12,R2
(0113) 							}
    0109 C03B      RJMP	0x0145
(0114) 						else {
(0115) 							if(state==ST_GET_TOKEN) {
    010A 01C7      MOVW	R24,R14
    010B 3084      CPI	R24,4
    010C EFE0      LDI	R30,0xF0
    010D 079E      CPC	R25,R30
    010E F479      BNE	0x011E
(0116) 								if(t==TOKEN) {
    010F 304E      CPI	R20,0xE
    0110 F449      BNE	0x011A
(0117) 									state = ST_GET_DATA;
    0111 E085      LDI	R24,5
    0112 EF90      LDI	R25,0xF0
    0113 017C      MOVW	R14,R24
(0118) 									checksum ^= t;
    0114 26C4      EOR	R12,R20
(0119) 									i=0;
    0115 2400      CLR	R0
    0116 2411      CLR	R1
    0117 821A      STD	Y+2,R1
    0118 8209      STD	Y+1,R0
(0120) 									}
    0119 C02B      RJMP	0x0145
(0121) 								else {
(0122) 									state = ST_START;
    011A E080      LDI	R24,0
    011B EF90      LDI	R25,0xF0
    011C 017C      MOVW	R14,R24
(0123) 									}
(0124) 								}
    011D C027      RJMP	0x0145
(0125) 							else {
(0126) 								if(state==ST_GET_DATA) {
    011E 01C7      MOVW	R24,R14
    011F 3085      CPI	R24,5
    0120 EFE0      LDI	R30,0xF0
    0121 079E      CPC	R25,R30
    0122 F4B1      BNE	0x0139
(0127) 									msg_buffer[i++] = t;
    0123 8029      LDD	R2,Y+1
    0124 803A      LDD	R3,Y+2
    0125 01C1      MOVW	R24,R2
    0126 9601      ADIW	R24,1
    0127 839A      STD	Y+2,R25
    0128 8389      STD	Y+1,R24
    0129 E784      LDI	R24,0x74
    012A E090      LDI	R25,0
    012B 01F1      MOVW	R30,R2
    012C 0FE8      ADD	R30,R24
    012D 1FF9      ADC	R31,R25
    012E 8340      STD	Z+0,R20
(0128) 									checksum ^= t;
    012F 26C4      EOR	R12,R20
(0129) 									if(i==msg_size) {
    0130 8009      LDD	R0,Y+1
    0131 801A      LDD	R1,Y+2
    0132 1606      CP	R0,R22
    0133 0617      CPC	R1,R23
    0134 F481      BNE	0x0145
(0130) 										state = ST_GET_CHECK;
    0135 E086      LDI	R24,6
    0136 EF90      LDI	R25,0xF0
    0137 017C      MOVW	R14,R24
(0131) 										}
(0132) 									}
    0138 C00C      RJMP	0x0145
(0133) 								else {
(0134) 									if(state==ST_GET_CHECK) {
    0139 01C7      MOVW	R24,R14
    013A 3086      CPI	R24,6
    013B EFE0      LDI	R30,0xF0
    013C 079E      CPC	R25,R30
    013D F439      BNE	0x0145
(0135) 										if(t==checksum) {
    013E 154C      CP	R20,R12
    013F F411      BNE	0x0142
(0136) 											process_command(seq_num);
    0140 8108      LDD	R16,Y+0
    0141 D006      RCALL	_process_command
(0137) 											}
(0138) 										state = ST_START;
    0142 E080      LDI	R24,0
    0143 EF90      LDI	R25,0xF0
    0144 017C      MOVW	R14,R24
    0145 CF85      RJMP	0x00CB
    0146 9623      ADIW	R28,3
    0147 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
    0148 931A      ST	R17,-Y
    0149 930A      ST	R16,-Y
    014A D86A      RCALL	push_gset5
    014B 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;
    014C 2400      CLR	R0
    014D 860D      STD	Y+13,R0
(0178) 	unsigned char mode;
(0179) 	unsigned int block_size;
(0180) 	unsigned int i;
(0181) 	unsigned int num_bytes=0;
    014E 2411      CLR	R1
    014F 861B      STD	Y+11,R1
    0150 860A      STD	Y+10,R0
(0182) 	unsigned long polling_address=0;
    0151 E040      LDI	R20,0
    0152 E050      LDI	R21,0
    0153 E060      LDI	R22,0
    0154 E070      LDI	R23,0
    0155 01FE      MOVW	R30,R28
    0156 8342      STD	Z+2,R20
    0157 8353      STD	Z+3,R21
    0158 8364      STD	Z+4,R22
    0159 8375      STD	Z+5,R23
(0183) 	unsigned long start_address = address;
    015A 9040006E  LDS	R4,address+2
    015C 9050006F  LDS	R5,address+3
    015E 9020006C  LDS	R2,address
    0160 9030006D  LDS	R3,address+1
    0162 01FE      MOVW	R30,R28
    0163 8226      STD	Z+6,R2
    0164 8237      STD	Z+7,R3
    0165 8640      STD	Z+8,R4
    0166 8651      STD	Z+9,R5
(0184) 
(0185) 	cmd = msg_buffer[0];
    0167 90200074  LDS	R2,msg_buffer
    0169 862C      STD	Y+12,R2
(0186) 
(0187) 	//////////////////////////////////////
(0188) 	//CMD_SIGN_ON
(0189) 	//////////////////////////////////////
(0190) 	if(cmd==CMD_SIGN_ON)
    016A 2D82      MOV	R24,R2
    016B 3081      CPI	R24,1
    016C F4A9      BNE	0x0182
(0191) 	{
(0192) 		num_bytes = 11;
    016D E08B      LDI	R24,0xB
    016E E090      LDI	R25,0
    016F 879B      STD	Y+11,R25
    0170 878A      STD	Y+10,R24
(0193) 		msg_buffer[0] = CMD_SIGN_ON;
    0171 E081      LDI	R24,1
    0172 93800074  STS	msg_buffer,R24
(0194) 		msg_buffer[1] = STATUS_CMD_OK;
    0174 2422      CLR	R2
    0175 92200075  STS	msg_buffer+1,R2
(0195) 		msg_buffer[2] = 8;
    0177 E088      LDI	R24,0x8
    0178 93800076  STS	msg_buffer+2,R24
(0196) 		memcpy(msg_buffer+3,"AVRISP_2",8);
    017A 8399      STD	Y+1,R25
    017B 8388      STD	Y+0,R24
    017C E620      LDI	R18,0x60
    017D E030      LDI	R19,0
    017E E707      LDI	R16,0x77
    017F E010      LDI	R17,0
    0180 D7F1      RCALL	_memcpy
(0197) 	}
    0181 C6E8      RJMP	0x086A
(0198) 	//////////////////////////////////////
(0199) 	//CMD_SET_PARAMETER
(0200) 	//////////////////////////////////////
(0201) 	else if(cmd==CMD_SET_PARAMETER)
    0182 858C      LDD	R24,Y+12
    0183 3082      CPI	R24,2
    0184 F581      BNE	0x01B5
(0202) 	{
(0203) 		switch(msg_buffer[1])
    0185 90A00075  LDS	R10,msg_buffer+1
    0187 24BB      CLR	R11
    0188 01C5      MOVW	R24,R10
    0189 3988      CPI	R24,0x98
    018A E0E0      LDI	R30,0
    018B 079E      CPC	R25,R30
    018C F071      BEQ	0x019B
    018D 3988      CPI	R24,0x98
    018E E0E0      LDI	R30,0
    018F 079E      CPC	R25,R30
    0190 F0D4      BLT	0x01AB
    0191 01C5      MOVW	R24,R10
    0192 398E      CPI	R24,0x9E
    0193 E0E0      LDI	R30,0
    0194 079E      CPC	R25,R30
    0195 F061      BEQ	0x01A2
    0196 398F      CPI	R24,0x9F
    0197 E0E0      LDI	R30,0
    0198 079E      CPC	R25,R30
    0199 F069      BEQ	0x01A7
    019A C010      RJMP	0x01AB
(0204) 		{
(0205) 			case PARAM_SCK_DURATION:
(0206) 				clock_speed=msg_buffer[2];
    019B 90200076  LDS	R2,msg_buffer+2
    019D 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);

⌨️ 快捷键说明

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