📄 stk500i.lst
字号:
(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 + -