📄 stk500i.lst
字号:
00B4 DFAC RCALL _interface_init
(0065) spi_disable();
00B5 D876 RCALL _spi_disable
(0066)
(0067) //clock_speed=eeprom_read_byte(&eeprom_sck_period);
(0068) clock_speed=eeprom_sck_period;
00B6 90200100 LDS R2,eeprom_sck_period
00B8 92200113 STS clock_speed,R2
(0069) if (clock_speed==0xFF) {
00BA 2D82 MOV R24,R2
00BB 3F8F CPI R24,0xFF
00BC F419 BNE 0x00C0
(0070) clock_speed=SPI_SPEED_125KHZ;
00BD E085 LDI R24,5
00BE 93800113 STS clock_speed,R24
(0071) }
(0072) spi_set_speed(clock_speed);
00C0 91000113 LDS R16,clock_speed
00C2 D87F RCALL _spi_set_speed
(0073)
(0074) SEI();
00C3 9478 BSET 7
(0075)
(0076) LED_GN_OFF;
00C4 EF8E LDI R24,0xFE
00C5 EF9F LDI R25,0xFF
00C6 B025 IN R2,0x05
00C7 2228 AND R2,R24
00C8 B825 OUT 0x05,R2
(0077) LED_RT_ON;
00C9 9A29 SBI 0x05,1
(0078) wait_ms(2000);
00CA ED00 LDI R16,0xD0
00CB E017 LDI R17,7
00CC DF87 RCALL _wait_ms
(0079) LED_GN_ON;
00CD 9A28 SBI 0x05,0
(0080) LED_RT_OFF;
00CE EF8D LDI R24,0xFD
00CF EF9F LDI R25,0xFF
00D0 B025 IN R2,0x05
00D1 2228 AND R2,R24
00D2 B825 OUT 0x05,R2
00D3 C07A RJMP 0x014E
(0081)
(0082) while(2) {
(0083) rec_data=interface_getc();
00D4 DF96 RCALL _interface_getc
00D5 0158 MOVW R10,R16
(0084) //if a byte has been received -> process it
(0085) if(rec_data!=-1) {
00D6 01C5 MOVW R24,R10
00D7 3F0F CPI R16,0xFF
00D8 EFEF LDI R30,0xFF
00D9 071E CPC R17,R30
00DA F409 BNE 0x00DC
00DB C072 RJMP 0x014E
(0086) t=rec_data&0xFF;
00DC 2F48 MOV R20,R24
00DD 7050 ANDI R21,0
(0087)
(0088) if(state==ST_START) {
00DE 01C7 MOVW R24,R14
00DF 3080 CPI R24,0
00E0 EFE0 LDI R30,0xF0
00E1 079E CPC R25,R30
00E2 F449 BNE 0x00EC
(0089) if(t==MESSAGE_START) {
00E3 314B CPI R20,0x1B
00E4 F009 BEQ 0x00E6
00E5 C068 RJMP 0x014E
(0090) state = ST_GET_SEQ_NUM;
00E6 E081 LDI R24,1
00E7 EF90 LDI R25,0xF0
00E8 017C MOVW R14,R24
(0091) checksum = MESSAGE_START^0;
00E9 E18B LDI R24,0x1B
00EA 2EC8 MOV R12,R24
(0092) }
(0093) }
00EB C062 RJMP 0x014E
(0094) else {
(0095) if(state==ST_GET_SEQ_NUM) {
00EC 01C7 MOVW R24,R14
00ED 3081 CPI R24,1
00EE EFE0 LDI R30,0xF0
00EF 079E CPC R25,R30
00F0 F431 BNE 0x00F7
(0096) seq_num = t;
00F1 8348 STD Y+0,R20
(0097) state = ST_MSG_SIZE_1;
00F2 E082 LDI R24,2
00F3 EF90 LDI R25,0xF0
00F4 017C MOVW R14,R24
(0098) checksum ^= t;
00F5 26C4 EOR R12,R20
(0099) }
00F6 C057 RJMP 0x014E
(0100) else {
(0101) if(state==ST_MSG_SIZE_1) {
00F7 01C7 MOVW R24,R14
00F8 3082 CPI R24,2
00F9 EFE0 LDI R30,0xF0
00FA 079E CPC R25,R30
00FB F449 BNE 0x0105
(0102) msg_size = t<<8;
00FC 2F64 MOV R22,R20
00FD 2777 CLR R23
00FE 2F76 MOV R23,R22
00FF 2766 CLR R22
(0103) state = ST_MSG_SIZE_2;
0100 E083 LDI R24,3
0101 EF90 LDI R25,0xF0
0102 017C MOVW R14,R24
(0104) checksum ^= t;
0103 26C4 EOR R12,R20
(0105) }
0104 C049 RJMP 0x014E
(0106) else {
(0107) if(state==ST_MSG_SIZE_2) {
0105 01C7 MOVW R24,R14
0106 3083 CPI R24,3
0107 EFE0 LDI R30,0xF0
0108 079E CPC R25,R30
0109 F449 BNE 0x0113
(0108) msg_size |= t;
010A 2E24 MOV R2,R20
010B 2433 CLR R3
010C 2962 OR R22,R2
010D 2973 OR R23,R3
(0109) state = ST_GET_TOKEN;
010E E084 LDI R24,4
010F EF90 LDI R25,0xF0
0110 017C MOVW R14,R24
(0110) checksum ^= t;
0111 24C2 EOR R12,R2
(0111) }
0112 C03B RJMP 0x014E
(0112) else {
(0113) if(state==ST_GET_TOKEN) {
0113 01C7 MOVW R24,R14
0114 3084 CPI R24,4
0115 EFE0 LDI R30,0xF0
0116 079E CPC R25,R30
0117 F479 BNE 0x0127
(0114) if(t==TOKEN) {
0118 304E CPI R20,0xE
0119 F449 BNE 0x0123
(0115) state = ST_GET_DATA;
011A E085 LDI R24,5
011B EF90 LDI R25,0xF0
011C 017C MOVW R14,R24
(0116) checksum ^= t;
011D 26C4 EOR R12,R20
(0117) i=0;
011E 2400 CLR R0
011F 2411 CLR R1
0120 821A STD Y+2,R1
0121 8209 STD Y+1,R0
(0118) }
0122 C02B RJMP 0x014E
(0119) else {
(0120) state = ST_START;
0123 E080 LDI R24,0
0124 EF90 LDI R25,0xF0
0125 017C MOVW R14,R24
(0121) }
(0122) }
0126 C027 RJMP 0x014E
(0123) else {
(0124) if(state==ST_GET_DATA) {
0127 01C7 MOVW R24,R14
0128 3085 CPI R24,5
0129 EFE0 LDI R30,0xF0
012A 079E CPC R25,R30
012B F4B1 BNE 0x0142
(0125) msg_buffer[i++] = t;
012C 8029 LDD R2,Y+1
012D 803A LDD R3,Y+2
012E 01C1 MOVW R24,R2
012F 9601 ADIW R24,1
0130 839A STD Y+2,R25
0131 8389 STD Y+1,R24
0132 E184 LDI R24,0x14
0133 E091 LDI R25,1
0134 01F1 MOVW R30,R2
0135 0FE8 ADD R30,R24
0136 1FF9 ADC R31,R25
0137 8340 STD Z+0,R20
(0126) checksum ^= t;
0138 26C4 EOR R12,R20
(0127) if(i==msg_size) {
0139 8009 LDD R0,Y+1
013A 801A LDD R1,Y+2
013B 1606 CP R0,R22
013C 0617 CPC R1,R23
013D F481 BNE 0x014E
(0128) state = ST_GET_CHECK;
013E E086 LDI R24,6
013F EF90 LDI R25,0xF0
0140 017C MOVW R14,R24
(0129) }
(0130) }
0141 C00C RJMP 0x014E
(0131) else {
(0132) if(state==ST_GET_CHECK) {
0142 01C7 MOVW R24,R14
0143 3086 CPI R24,6
0144 EFE0 LDI R30,0xF0
0145 079E CPC R25,R30
0146 F439 BNE 0x014E
(0133) if(t==checksum) {
0147 154C CP R20,R12
0148 F411 BNE 0x014B
(0134) process_command(seq_num);
0149 8108 LDD R16,Y+0
014A D022 RCALL _process_command
(0135) }
(0136) state = ST_START;
014B E080 LDI R24,0
014C EF90 LDI R25,0xF0
014D 017C MOVW R14,R24
014E CF85 RJMP 0x00D4
014F 9623 ADIW R28,3
0150 9508 RET
(0137) }
(0138) }
(0139) }
(0140) }
(0141) }
(0142) }
(0143) }
(0144) }
(0145) }
(0146) }
(0147)
(0148) /**
(0149) Returns the value of the selected adc channel
(0150)
(0151) @param n Number of ADC channel
(0152)
(0153) @return Value of ADC channel
(0154) */
(0155) unsigned char adc_get(char n)
(0156) {
(0157) ADMUX&=0xF0;
_adc_get:
n --> R16
0151 9180007C LDS R24,0x7C
0153 7F80 ANDI R24,0xF0
0154 9380007C STS 0x7C,R24
(0158) ADMUX|=n&0x7;
0156 2F80 MOV R24,R16
0157 7087 ANDI R24,7
0158 9020007C LDS R2,0x7C
015A 2A28 OR R2,R24
015B 9220007C STS 0x7C,R2
(0159)
(0160) while(ADCSRA&0x40);
015D 9020007A LDS R2,0x7A
015F FC26 SBRC R2,6
0160 CFFC RJMP 0x015D
(0161) ADCSRA|=(1<<ADSC);
0161 9180007A LDS R24,0x7A
0163 6480 ORI R24,0x40
0164 9380007A STS 0x7A,R24
(0162) while(ADCSRA&0x40);
0166 9020007A LDS R2,0x7A
0168 FC26 SBRC R2,6
0169 CFFC RJMP 0x0166
(0163)
(0164) return ADCH;
016A 91000079 LDS R16,0x79
016C 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
016D 931A ST R17,-Y
016E 930A ST R16,-Y
016F D8D4 RCALL push_gset5
0170 972E SBIW R28,0xE
(0165) }
(0166)
(0167) /**
(0168) Processes a command packet received in main loop and located in the global buffer
(0169)
(0170) @param seq_num The sequence number of the command packet
(0171) */
(0172) void process_command(unsigned char seq_num)
(0173) {
(0174) unsigned char cmd;
(0175) unsigned char tmp=0;
0171 2400 CLR R0
0172 860D STD Y+13,R0
(0176) unsigned char mode;
(0177) unsigned int block_size;
(0178) unsigned int i;
(0179) unsigned int num_bytes=0;
0173 2411 CLR R1
0174 861B STD Y+11,R1
0175 860A STD Y+10,R0
(0180) unsigned long polling_address=0;
0176 E040 LDI R20,0
0177 E050 LDI R21,0
0178 E060 LDI R22,0
0179 E070 LDI R23,0
017A 01FE MOVW R30,R28
017B 8342 STD Z+2,R20
017C 8353 STD Z+3,R21
017D 8364 STD Z+4,R22
017E 8375 STD Z+5,R23
(0181) unsigned long start_address = address;
017F 9040010E LDS R4,address+2
0181 9050010F LDS R5,address+3
0183 9020010C LDS R2,address
0185 9030010D LDS R3,address+1
0187 01FE MOVW R30,R28
0188 8226 STD Z+6,R2
0189 8237 STD Z+7,R3
018A 8640 STD Z+8,R4
018B 8651 STD Z+9,R5
(0182)
(0183) cmd = msg_buffer[0];
018C 90200114 LDS R2,msg_buffer
018E 862C STD Y+12,R2
(0184)
(0185) //////////////////////////////////////
(0186) //CMD_SIGN_ON
(0187) //////////////////////////////////////
(0188) if(cmd==CMD_SIGN_ON)
018F 2D82 MOV R24,R2
0190 3081 CPI R24,1
0191 F4A9 BNE 0x01A7
(0189) {
(0190) num_bytes = 11;
0192 E08B LDI R24,0xB
0193 E090 LDI R25,0
0194 879B STD Y+11,R25
0195 878A STD Y+10,R24
(0191) msg_buffer[0] = CMD_SIGN_ON;
0196 E081 LDI R24,1
0197 93800114 STS msg_buffer,R24
(0192) msg_buffer[1] = STATUS_CMD_OK;
0199 2422 CLR R2
019A 92200115 STS msg_buffer+1,R2
(0193) msg_buffer[2] = 8;
019C E088 LDI R24,0x8
019D 93800116 STS msg_buffer+2,R24
(0194) memcpy(msg_buffer+3,"AVRISP_2",8);
019F 8399 STD Y+1,R25
01A0 8388 STD Y+0,R24
01A1 E021 LDI R18,1
01A2 E031 LDI R19,1
01A3 E107 LDI R16,0x17
01A4 E011 LDI R17,1
01A5 D85B RCALL _memcpy
(0195) }
01A6 C71E RJMP 0x08C5
(0196) //////////////////////////////////////
(0197) //CMD_SET_PARAMETER
(0198) //////////////////////////////////////
(0199) else if(cmd==CMD_SET_PARAMETER)
01A7 858C LDD R24,Y+12
01A8 3082 CPI R24,2
01A9 F009 BEQ 0x01AB
01AA C065 RJMP 0x0210
(0200) {
(0201) switch(msg_buffer[1])
01AB 90A00115 LDS R10,msg_buffer+1
01AD 24BB CLR R11
01AE 01C5 MOVW R24,R10
01AF 3988 CPI R24,0x98
01B0 E0E0 LDI R30,0
01B1 079E CPC R25,R30
01B2 F089 BEQ 0x01C4
01B3 3988 CPI R24,0x98
01B4 E0E0 LDI R30,0
01B5 079E CPC R25,R30
01B6 F40C BGE 0x01B8
01B7 C04E RJMP 0x0206
01B8 01C5 MOVW R24,R10
01B9 398E CPI R24,0x9E
01BA E0E0 LDI R30,0
01BB 079E CPC R25,R30
01BC F409 BNE 0x01BE
01BD C03F RJMP 0x01FD
01BE 398F CPI R24,0x9F
01BF E0E0 LDI R30,0
01C0 079E CPC R25,R30
01C1 F409 BNE 0x01C3
01C2 C03F RJMP 0x0202
01C3 C042 RJMP 0x0206
(0202) {
(0203) case PARAM_SCK_DURATION:
(0204) clock_speed=SPI_SPEED_2MHZ;
01C4 E081 LDI R24,1
01C5 93800113 STS clock_speed,R24
(0205) if((msg_buffer[2]) >= 1 ) clock_speed=SPI_SPEED_2MHZ;
01C7 91800116 LDS R24,msg_buffer+2
01C9 3081 CPI R24,1
01CA F018 BCS 0x01CE
01CB E081 LDI R24,1
01CC 93800113 STS clock_speed,R24
(0206) if((msg_buffer[2]) >= 2 ) clock_speed=SPI_SPEED_1MHZ;
01CE 91800116 LDS R24,msg_buffer+2
01D0 3082 CPI R24,2
01D1 F018 BCS 0x01D5
01D2 E082 LDI R24,2
01D3 93800113 STS clock_speed,R24
(0207) if((msg_buffer[2]) >= 4 ) clock_speed=SPI_SPEED_500KHZ;
01D5 91800116 LDS R24,msg_buffer+2
01D7 3084 CPI R24,4
01D8 F018 BCS 0x01DC
01D9 E083 LDI R24,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -