📄 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 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 + -