📄 stk500_isp.lst
字号:
1A2 DF82 RCALL _spi_transfer_8
(0298) spi_transfer_8((d>>8)&0xFF);
1A3 E088 LDI R24,0x8
1A4 E090 LDI R25,0
1A5 8108 LDD R16,Y+0
1A6 8119 LDD R17,Y+1
1A7 812A LDD R18,Y+2
1A8 813B LDD R19,Y+3
1A9 938A ST R24,-Y
1AA 940E 0B46 CALL lsr32
1AC 0118 MOVW R2,R16
1AD 0129 MOVW R4,R18
1AE EF8F LDI R24,0xFF
1AF E090 LDI R25,0
1B0 E0A0 LDI R26,0
1B1 E0B0 LDI R27,0
1B2 2228 AND R2,R24
1B3 2239 AND R3,R25
1B4 224A AND R4,R26
1B5 225B AND R5,R27
1B6 2D02 MOV R16,R2
1B7 DF6D RCALL _spi_transfer_8
(0299) return spi_transfer_8(d&0xFF);
1B8 EF8F LDI R24,0xFF
1B9 E090 LDI R25,0
1BA E0A0 LDI R26,0
1BB E0B0 LDI R27,0
1BC 8028 LDD R2,Y+0
1BD 8039 LDD R3,Y+1
1BE 804A LDD R4,Y+2
1BF 805B LDD R5,Y+3
1C0 2228 AND R2,R24
1C1 2239 AND R3,R25
1C2 224A AND R4,R26
1C3 225B AND R5,R27
1C4 2D02 MOV R16,R2
1C5 DF5F RCALL _spi_transfer_8
1C6 9624 ADIW R28,4
1C7 9508 RET
_Timer1_COMPA_ISR:
1C8 938A ST R24,-Y
1C9 939A ST R25,-Y
1CA B78F IN R24,0x3F
1CB 938A ST R24,-Y
FILE: E:\单片机\源程序\Snail_mkII\STK500_V2\ICC\tools.c
(0001) /** \file
(0002) <b>some tools</b><br>
(0003) Autor: Matthias Wei遝r<br>
(0004) Copyright 2005: Matthias Wei遝r<br>
(0005) License: QPL (see license.txt)
(0006) <hr>
(0007) */
(0008) #include <iccioavr.h>
(0009) #include <eeprom.h>
(0010)
(0011) #include "tools.h"
(0012)
(0013) volatile unsigned char t1_tick;
(0014) unsigned char t1_cnt;
(0015)
(0016) //Konstanten im EEPROM
(0017) //#define EEPROM __attribute__ ((section (".eeprom")))
(0018)
(0019) //Variablen im EEPROM
(0020) #pragma data:eeprom
(0021) unsigned char eeprom_sck_period = 10;
(0022) #pragma data:data
(0023)
(0024) #pragma interrupt_handler Timer1_COMPA_ISR:iv_TIMER1_COMPA
(0025) void Timer1_COMPA_ISR(void)
(0026) {
(0027) t1_tick=1;
1CC E081 LDI R24,1
1CD 9380 006C STS t1_tick,R24
(0028) t1_cnt++;
1CF 9180 006B LDS R24,t1_cnt
1D1 5F8F SUBI R24,0xFF
1D2 9380 006B STS t1_cnt,R24
1D4 9189 LD R24,Y+
1D5 BF8F OUT 0x3F,R24
1D6 9199 LD R25,Y+
1D7 9189 LD R24,Y+
1D8 9518 RETI
(0029) }
(0030)
(0031) unsigned char get_t1_tick(void)
(0032) {
(0033) if (t1_tick)
_get_t1_tick:
1D9 9020 006C LDS R2,t1_tick
1DB 2022 TST R2
1DC F029 BEQ 0x01E2
(0034) {
(0035) t1_tick=0;
1DD 2422 CLR R2
1DE 9220 006C STS t1_tick,R2
(0036) return 1;
1E0 E001 LDI R16,1
1E1 C001 RJMP 0x01E3
(0037) }
(0038) return 0;
1E2 2700 CLR R16
1E3 9508 RET
_wait_ms:
n --> R20
1E4 934A ST R20,-Y
1E5 935A ST R21,-Y
1E6 01A8 MOVW R20,R16
(0039) }
(0040)
(0041) /**
(0042) Wartet n*1ms - 1ms max.
(0043) */
(0044) void wait_ms(unsigned int n)
(0045) {
1E7 C005 RJMP 0x01ED
(0046) while (n)
(0047) {
(0048) if (get_t1_tick()) n--;
1E8 DFF0 RCALL _get_t1_tick
1E9 2300 TST R16
1EA F011 BEQ 0x01ED
1EB 5041 SUBI R20,1
1EC 4050 SBCI R21,0
1ED 3040 CPI R20,0
1EE 0745 CPC R20,R21
1EF F7C1 BNE 0x01E8
1F0 9159 LD R21,Y+
1F1 9149 LD R20,Y+
1F2 9508 RET
_main:
rec_data1 --> R10
t0 --> R10
state0 --> R20
checksum0 --> R22
msg_size0 --> R12
seq_num0 --> Y,+2
i0 --> Y,+0
1F3 9724 SBIW R28,4
FILE: E:\单片机\源程序\Snail_mkII\STK500_V2\ICC\main.c
(0001) /** \file
(0002) <b>USBisp main</b><br>
(0003) Autor: Matthias Wei遝r<br>
(0004) Copyright 2005: Matthias Wei遝r<br>
(0005) License: QPL (see license.txt)
(0006) <hr>
(0007) */
(0008) /*! \mainpage USBisp STK500 v2
(0009)
(0010) (c)2005 by Matthias Weisser
(0011)
(0012) This software is distributed under the QPL
(0013) see license.txt for more information
(0014)
(0015) \section Compiler
(0016) latest WINAVR
(0017)
(0018) \section version history version history
(0019) <b>v1.0</b>
(0020) <ul>
(0021) <li>First release</li>
(0022) </ul>
(0023) */
(0024)
(0025) #include <stdlib.h>
(0026) #include <string.h>
(0027) #include <iccioavr.h>
(0028) #include <eeprom.h>
(0029) #include <macros.h>
(0030) #include "interface.h"
(0031) #include "spi.h"
(0032) #include "tools.h"
(0033) #include "extern_vars.h"
(0034)
(0035) //Atmel Includes
(0036) #include "command.h"
(0037)
(0038) #include "config.h"
(0039)
(0040) //States used in the receive state machine
(0041) #define ST_START 0xF000
(0042) #define ST_GET_SEQ_NUM 0xF001
(0043) #define ST_MSG_SIZE_1 0xF002
(0044) #define ST_MSG_SIZE_2 0xF003
(0045) #define ST_GET_TOKEN 0xF004
(0046) #define ST_GET_DATA 0xF005
(0047) #define ST_GET_CHECK 0xF006
(0048) #define ST_PROCESS 0xF007
(0049)
(0050)
(0051) void chip_init(void);
(0052) unsigned char adc_get(char n);
(0053) void process_command(unsigned char seq_num);
(0054)
(0055) //Some global variables
(0056) unsigned char msg_buffer[300];
(0057) unsigned char clock_speed;
(0058) unsigned char reset_polarity;
(0059) unsigned char param_controller_init;
(0060) unsigned char prgmode;
(0061)
(0062) unsigned long address;
(0063)
(0064) int main(void)
(0065) {
(0066) unsigned int i=0;
1F4 2400 CLR R0
1F5 2411 CLR R1
1F6 8219 STD Y+1,R1
1F7 8208 STD Y+0,R0
(0067)
(0068) unsigned char seq_num=0;
1F8 820A STD Y+2,R0
(0069) unsigned int msg_size=0;
1F9 24CC CLR R12
1FA 24DD CLR R13
(0070) unsigned char checksum=0;
1FB 2766 CLR R22
(0071)
(0072) /// next state
(0073) unsigned int state=ST_START;
1FC E040 LDI R20,0
1FD EF50 LDI R21,0xF0
(0074)
(0075) unsigned char t;
(0076) signed int rec_data;
(0077)
(0078) chip_init();
1FE 940E 0AF6 CALL _chip_init
(0079) interface_init();
200 940E 0052 CALL _interface_init
(0080) spi_disable();
202 940E 00CA CALL _spi_disable
(0081)
(0082) clock_speed=EEPROMread((int)&eeprom_sck_period);
204 E000 LDI R16,0
205 E010 LDI R17,0
206 940E 0B52 CALL _EEPROMread
208 9300 0074 STS clock_speed,R16
(0083) if (clock_speed==0xFF) clock_speed=SPI_SPEED_125KHZ;
20A 3F0F CPI R16,0xFF
20B F419 BNE 0x020F
20C E085 LDI R24,5
20D 9380 0074 STS clock_speed,R24
(0084) spi_set_speed(clock_speed);
20F 9100 0074 LDS R16,clock_speed
211 940E 00DD CALL _spi_set_speed
(0085)
(0086) SEI();
213 9478 BSET 7
(0087)
(0088) LED_GN_ON;
214 9A92 SBI 0x12,2
(0089) LED_RT_OFF;
215 EF87 LDI R24,0xF7
216 EF9F LDI R25,0xFF
217 B222 IN R2,0x12
218 2228 AND R2,R24
219 BA22 OUT 0x12,R2
21A C06C RJMP 0x0287
(0090)
(0091) /*
(0092) while(2)
(0093) {
(0094) rec_data=interface_getc();
(0095) //if a byte has been received -> process it
(0096) if(rec_data!=-1)
(0097) {
(0098) interface_putc(rec_data);
(0099) LED_GN_TOG;
(0100) LED_RT_TOG;
(0101) }
(0102) }
(0103) */
(0104)
(0105) while (2)
(0106) {
(0107)
(0108) rec_data=interface_getc();
21B 940E 0059 CALL _interface_getc
21D 0158 MOVW R10,R16
(0109)
(0110)
(0111) //if a aviliable byte has been received -> process it.
(0112) if (rec_data!=-1)
21E 01C5 MOVW R24,R10
21F 3F0F CPI R16,0xFF
220 EFEF LDI R30,0xFF
221 071E CPC R17,R30
222 F409 BNE 0x0224
223 C063 RJMP 0x0287
(0113) {
(0114) t=rec_data&0xFF;
224 7090 ANDI R25,0
225 2EA8 MOV R10,R24
(0115)
(0116) if (state==ST_START)
226 3040 CPI R20,0
227 EFE0 LDI R30,0xF0
228 075E CPC R21,R30
229 F439 BNE 0x0231
(0117) {
(0118) if (t==MESSAGE_START)
22A 318B CPI R24,0x1B
22B F009 BEQ 0x022D
22C C05A RJMP 0x0287
(0119) {
(0120) state = ST_GET_SEQ_NUM;
22D E041 LDI R20,1
22E EF50 LDI R21,0xF0
(0121) checksum = MESSAGE_START^0;
22F E16B LDI R22,0x1B
(0122) }
(0123) }
230 C056 RJMP 0x0287
(0124) else if (state==ST_GET_SEQ_NUM)
231 3041 CPI R20,1
232 EFE0 LDI R30,0xF0
233 075E CPC R21,R30
234 F429 BNE 0x023A
(0125) {
(0126) seq_num = t;
235 82AA STD Y+2,R10
(0127) state = ST_MSG_SIZE_1;
236 E042 LDI R20,2
237 EF50 LDI R21,0xF0
(0128) checksum ^= t;
238 256A EOR R22,R10
(0129) }
239 C04D RJMP 0x0287
(0130) else if (state==ST_MSG_SIZE_1)
23A 3042 CPI R20,2
23B EFE0 LDI R30,0xF0
23C 075E CPC R21,R30
23D F441 BNE 0x0246
(0131) {
(0132) msg_size = t<<8;
23E 2CCA MOV R12,R10
23F 24DD CLR R13
240 2CDC MOV R13,R12
241 24CC CLR R12
(0133) state = ST_MSG_SIZE_2;
242 E043 LDI R20,3
243 EF50 LDI R21,0xF0
(0134) checksum ^= t;
244 256A EOR R22,R10
(0135) }
245 C041 RJMP 0x0287
(0136) else if (state==ST_MSG_SIZE_2)
246 3043 CPI R20,3
247 EFE0 LDI R30,0xF0
248 075E CPC R21,R30
249 F441 BNE 0x0252
(0137) {
(0138) msg_size |= t;
24A 2C2A MOV R2,R10
24B 2433 CLR R3
24C 28C2 OR R12,R2
24D 28D3 OR R13,R3
(0139) state = ST_GET_TOKEN;
24E E044 LDI R20,4
24F EF50 LDI R21,0xF0
(0140) checksum ^= t;
250 2562 EOR R22,R2
(0141) }
251 C035 RJMP 0x0287
(0142) else if (state==ST_GET_TOKEN)
252 3044 CPI R20,4
253 EFE0 LDI R30,0xF0
254 075E CPC R21,R30
255 F471 BNE 0x0264
(0143) {
(0144) if (t==TOKEN)
256 2D8A MOV R24,R10
257 308E CPI R24,0xE
258 F441 BNE 0x0261
(0145) {
(0146) state = ST_GET_DATA;
259 E045 LDI R20,5
25A EF50 LDI R21,0xF0
(0147) checksum ^= t;
25B 2768 EOR R22,R24
(0148) i=0;
25C 2400 CLR R0
25D 2411 CLR R1
25E 8219 STD Y+1,R1
25F 8208 STD Y+0,R0
(0149) }
260 C026 RJMP 0x0287
(0150) else state = ST_START;
261 E040 LDI R20,0
262 EF50 LDI R21,0xF0
(0151) }
263 C023 RJMP 0x0287
(0152) else if (state==ST_GET_DATA)
264 3045 CPI R20,5
265 EFE0 LDI R30,0xF0
266 075E CPC R21,R30
267 F4A9 BNE 0x027D
(0153) {
(0154) msg_buffer[i++] = t;
268 80E8 LDD R14,Y+0
269 80F9 LDD R15,Y+1
26A 01C7 MOVW R24,R14
26B 9601 ADIW R24,1
26C 8399 STD Y+1,R25
26D 8388 STD Y+0,R24
26E E785 LDI R24,0x75
26F E090 LDI R25,0
270 01F7 MOVW R30,R14
271 0FE8 ADD R30,R24
272 1FF9 ADC R31,R25
273 82A0 STD Z+0,R10
(0155) checksum ^= t;
274 256A EOR R22,R10
(0156) if (i==msg_size)
275 8008 LDD R0,Y+0
276 8019 LDD R1,Y+1
277 140C CP R0,R12
278 041D CPC R1,R13
279 F469 BNE 0x0287
(0157) {
(0158) state = ST_GET_CHECK;
27A E046 LDI R20,6
27B EF50 LDI R21,0xF0
(0159) }
(0160) }
27C C00A RJMP 0x0287
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -