📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\单片机\源程序\Snail_mkII\STK500_V2\ICC\main.c
.dbfunc e main _main fI
; rec_data1 -> R10,R11
; t0 -> R10
; state0 -> R20,R21
; checksum0 -> R22
; msg_size0 -> R12,R13
; seq_num0 -> y+2
; i0 -> y+0
.even
_main::
sbiw R28,4
.dbline -1
.dbline 65
; /** \file
; <b>USBisp main</b><br>
; Autor: Matthias Wei遝r<br>
; Copyright 2005: Matthias Wei遝r<br>
; License: QPL (see license.txt)
; <hr>
; */
; /*! \mainpage USBisp STK500 v2
;
; (c)2005 by Matthias Weisser
;
; This software is distributed under the QPL
; see license.txt for more information
;
; \section Compiler
; latest WINAVR
;
; \section version history version history
; <b>v1.0</b>
; <ul>
; <li>First release</li>
; </ul>
; */
;
; #include <stdlib.h>
; #include <string.h>
; #include <iccioavr.h>
; #include <eeprom.h>
; #include <macros.h>
; #include "interface.h"
; #include "spi.h"
; #include "tools.h"
; #include "extern_vars.h"
;
; //Atmel Includes
; #include "command.h"
;
; #include "config.h"
;
; //States used in the receive state machine
; #define ST_START 0xF000
; #define ST_GET_SEQ_NUM 0xF001
; #define ST_MSG_SIZE_1 0xF002
; #define ST_MSG_SIZE_2 0xF003
; #define ST_GET_TOKEN 0xF004
; #define ST_GET_DATA 0xF005
; #define ST_GET_CHECK 0xF006
; #define ST_PROCESS 0xF007
;
;
; void chip_init(void);
; unsigned char adc_get(char n);
; void process_command(unsigned char seq_num);
;
; //Some global variables
; unsigned char msg_buffer[300];
; unsigned char clock_speed;
; unsigned char reset_polarity;
; unsigned char param_controller_init;
; unsigned char prgmode;
;
; unsigned long address;
;
; int main(void)
; {
.dbline 66
; unsigned int i=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 68
;
; unsigned char seq_num=0;
std y+2,R0
.dbline 69
; unsigned int msg_size=0;
clr R12
clr R13
.dbline 70
; unsigned char checksum=0;
clr R22
.dbline 73
;
; /// next state
; unsigned int state=ST_START;
ldi R20,61440
ldi R21,240
.dbline 78
;
; unsigned char t;
; signed int rec_data;
;
; chip_init();
xcall _chip_init
.dbline 79
; interface_init();
xcall _interface_init
.dbline 80
; spi_disable();
xcall _spi_disable
.dbline 82
;
; clock_speed=EEPROMread((int)&eeprom_sck_period);
ldi R16,<_eeprom_sck_period
ldi R17,>_eeprom_sck_period
xcall _EEPROMread
sts _clock_speed,R16
.dbline 83
; if (clock_speed==0xFF) clock_speed=SPI_SPEED_125KHZ;
cpi R16,255
brne L3
X0:
.dbline 83
ldi R24,5
sts _clock_speed,R24
L3:
.dbline 84
; spi_set_speed(clock_speed);
lds R16,_clock_speed
xcall _spi_set_speed
.dbline 86
;
; SEI();
sei
.dbline 88
;
; LED_GN_ON;
sbi 0x12,2
.dbline 89
; LED_RT_OFF;
ldi R24,-9
ldi R25,-1
in R2,0x12
and R2,R24
out 0x12,R2
xjmp L6
L5:
.dbline 106
;
; /*
; while(2)
; {
; rec_data=interface_getc();
; //if a byte has been received -> process it
; if(rec_data!=-1)
; {
; interface_putc(rec_data);
; LED_GN_TOG;
; LED_RT_TOG;
; }
; }
; */
;
; while (2)
; {
.dbline 108
;
; rec_data=interface_getc();
xcall _interface_getc
movw R10,R16
.dbline 112
;
;
; //if a aviliable byte has been received -> process it.
; if (rec_data!=-1)
movw R24,R10
cpi R16,255
ldi R30,255
cpc R17,R30
brne X14
xjmp L8
X14:
X1:
.dbline 113
; {
.dbline 114
; t=rec_data&0xFF;
andi R25,0
mov R10,R24
.dbline 116
;
; if (state==ST_START)
cpi R20,0
ldi R30,240
cpc R21,R30
brne L10
X2:
.dbline 117
; {
.dbline 118
; if (t==MESSAGE_START)
cpi R24,27
breq X15
xjmp L11
X15:
X3:
.dbline 119
; {
.dbline 120
; state = ST_GET_SEQ_NUM;
ldi R20,61441
ldi R21,240
.dbline 121
; checksum = MESSAGE_START^0;
ldi R22,27
.dbline 122
; }
.dbline 123
; }
xjmp L11
L10:
.dbline 124
; else if (state==ST_GET_SEQ_NUM)
cpi R20,1
ldi R30,240
cpc R21,R30
brne L14
X4:
.dbline 125
; {
.dbline 126
; seq_num = t;
std y+2,R10
.dbline 127
; state = ST_MSG_SIZE_1;
ldi R20,61442
ldi R21,240
.dbline 128
; checksum ^= t;
eor R22,R10
.dbline 129
; }
xjmp L15
L14:
.dbline 130
; else if (state==ST_MSG_SIZE_1)
cpi R20,2
ldi R30,240
cpc R21,R30
brne L16
X5:
.dbline 131
; {
.dbline 132
; msg_size = t<<8;
mov R12,R10
clr R13
mov R13,R12
clr R12
.dbline 133
; state = ST_MSG_SIZE_2;
ldi R20,61443
ldi R21,240
.dbline 134
; checksum ^= t;
eor R22,R10
.dbline 135
; }
xjmp L17
L16:
.dbline 136
; else if (state==ST_MSG_SIZE_2)
cpi R20,3
ldi R30,240
cpc R21,R30
brne L18
X6:
.dbline 137
; {
.dbline 138
; msg_size |= t;
mov R2,R10
clr R3
or R12,R2
or R13,R3
.dbline 139
; state = ST_GET_TOKEN;
ldi R20,61444
ldi R21,240
.dbline 140
; checksum ^= t;
eor R22,R2
.dbline 141
; }
xjmp L19
L18:
.dbline 142
; else if (state==ST_GET_TOKEN)
cpi R20,4
ldi R30,240
cpc R21,R30
brne L20
X7:
.dbline 143
; {
.dbline 144
; if (t==TOKEN)
mov R24,R10
cpi R24,14
brne L22
X8:
.dbline 145
; {
.dbline 146
; state = ST_GET_DATA;
ldi R20,61445
ldi R21,240
.dbline 147
; checksum ^= t;
eor R22,R24
.dbline 148
; i=0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 149
; }
xjmp L21
L22:
.dbline 150
; else state = ST_START;
ldi R20,61440
ldi R21,240
.dbline 151
; }
xjmp L21
L20:
.dbline 152
; else if (state==ST_GET_DATA)
cpi R20,5
ldi R30,240
cpc R21,R30
brne L24
X9:
.dbline 153
; {
.dbline 154
; msg_buffer[i++] = t;
ldd R14,y+0
ldd R15,y+1
movw R24,R14
adiw R24,1
std y+1,R25
std y+0,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R14
add R30,R24
adc R31,R25
std z+0,R10
.dbline 155
; checksum ^= t;
eor R22,R10
.dbline 156
; if (i==msg_size)
ldd R0,y+0
ldd R1,y+1
cp R0,R12
cpc R1,R13
brne L25
X10:
.dbline 157
; {
.dbline 158
; state = ST_GET_CHECK;
ldi R20,61446
ldi R21,240
.dbline 159
; }
.dbline 160
; }
xjmp L25
L24:
.dbline 161
; else if (state==ST_GET_CHECK)
cpi R20,6
ldi R30,240
cpc R21,R30
brne L28
X11:
.dbline 162
; {
.dbline 163
; if (t==checksum)
cp R10,R22
brne L30
X12:
.dbline 164
; {
.dbline 165
; process_command(seq_num);
ldd R16,y+2
xcall _process_command
.dbline 166
; }
L30:
.dbline 168
;
; state = ST_START;
ldi R20,61440
ldi R21,240
.dbline 169
; }
L28:
L25:
L21:
L19:
L17:
L15:
L11:
.dbline 171
;
; }//if(rec_data!=-1)
L8:
.dbline 172
; }//while(2)
L6:
.dbline 105
xjmp L5
X13:
.dbline -2
L2:
.dbline 0 ; func end
adiw R28,4
ret
.dbsym r rec_data1 10 I
.dbsym r t0 10 c
.dbsym r state0 20 i
.dbsym r checksum0 22 c
.dbsym r msg_size0 12 i
.dbsym l seq_num0 2 c
.dbsym l i0 0 i
.dbend
.dbfunc e adc_get _adc_get fc
; n -> R16
.even
_adc_get::
.dbline -1
.dbline 186
;
; return 0;
;
; }
;
; /**
; Returns the value of the selected adc channel
;
; @param n Number of ADC channel
;
; @return Value of ADC channel
; */
; unsigned char adc_get(char n)
; {
.dbline 187
; ADMUX&=0xF0;
in R24,0x7
andi R24,240
out 0x7,R24
.dbline 188
; ADMUX|=n&0x7;
mov R24,R16
andi R24,7
in R2,0x7
or R2,R24
out 0x7,R2
L33:
.dbline 190
;
; while (ADCSRA&0x40);
L34:
.dbline 190
sbic 0x6,6
rjmp L33
X16:
.dbline 191
; ADCSRA|=(1<<ADSC);
sbi 0x6,6
L36:
.dbline 192
; while (ADCSRA&0x40);
L37:
.dbline 192
sbic 0x6,6
rjmp L36
X17:
.dbline 194
;
; return ADCH;
in R16,0x5
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbsym r n 16 c
.dbend
.dbfunc e process_command _process_command fV
; bytes_to_transmit0 -> y+12
; rx_from0 -> y+14
; rx_bytes0 -> R12
; tx_bytes0 -> y+10
; Reg9 -> R12,R13
; Reg80 -> y+14
; Reg26 -> y+16
; Reg48 -> R12,R13
; Reg17 -> y+16
; Reg39 -> R12,R13
; Reg65 -> y+16
; Reg72 -> y+16
; Reg59 -> R12,R13
; Reg29 -> y+20
; Reg12 -> y+16
; i29 -> R12,R13
; tmp47 -> R14
; i23 -> R12,R13
; i20 -> R14,R15
; tmp39 -> R14
; i16 -> R14,R15
; mode7 -> y+12
; block_size6 -> y+14
; i13 -> R14,R15
; tmp37 -> y+14
; block_size4 -> y+12
; i10 -> R14,R15
; tmp31 -> R12
; i6 -> R14,R15
; mode0 -> y+14
; block_size2 -> y+12
; i3 -> R12,R13
; tmp29 -> y+12
; block_size0 -> y+14
; tmp24 -> R14
; tmp23 -> R14
; tmp22 -> R14
; tmp21 -> R14
; tmp16 -> R14
; tmp15 -> R14
; tmp14 -> R14
; tmp13 -> R14
; tmp12 -> R14
; tmp11 -> R14
; tmp10 -> R14
; tmp9 -> R14
; tmp8 -> R14
; tmp7 -> R14
; tmp6 -> R14
; tmp5 -> R14
; tmp2 -> R12
; num_bytes1 -> R10,R11
; i0 -> R14,R15
; cmd0 -> y+10
; start_address0 -> y+6
; polling_address0 -> y+2
; tmp0 -> y+18
; seq_num -> y+32
.even
_process_command::
st -y,r17
st -y,r16
xcall push_xgsetF0FC
sbiw R28,22
.dbline -1
.dbline 203
; }
;
; /**
; Processes a command packet received in main loop and located in the global buffer
;
; @param seq_num The sequence number of the command packet
; */
; void process_command(unsigned char seq_num)
; {
.dbline 205
; unsigned char cmd;
; unsigned char tmp=0;
clr R0
std y+18,R0
.dbline 209
; unsigned char mode;
; unsigned int block_size;
; unsigned int i;
; unsigned int num_bytes=0;
clr R10
clr R11
.dbline 210
; unsigned long polling_address=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std y+2,R20
std y+3,R21
std y+4,R22
std y+5,R23
.dbline 211
; unsigned long start_address = address;
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
std y+6,R2
std y+7,R3
std y+8,R4
std y+9,R5
.dbline 213
;
; cmd = msg_buffer[0];
lds R2,_msg_buffer
std y+10,R2
.dbline 218
;
; //////////////////////////////////////
; //CMD_SIGN_ON
; //////////////////////////////////////
; if (cmd==CMD_SIGN_ON)
mov R24,R2
cpi R24,1
brne L40
X18:
.dbline 219
; {
.dbline 220
; num_bytes = 11;
ldi R24,11
ldi R25,0
movw R10,R24
.dbline 221
; msg_buffer[0] = CMD_SIGN_ON;
ldi R24,1
sts _msg_buffer,R24
.dbline 222
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 223
; msg_buffer[2] = 8;
ldi R24,8
sts _msg_buffer+2,R24
.dbline 224
; memcpy(msg_buffer+3,"AVRISP_2",8);
std y+1,R25
std y+0,R24
ldi R18,<L45
ldi R19,>L45
ldi R16,<_msg_buffer+3
ldi R17,>_msg_buffer+3
xcall _memcpy
.dbline 225
; }
xjmp L41
L40:
.dbline 229
; //////////////////////////////////////
; //CMD_SET_PARAMETER
; //////////////////////////////////////
; else if (cmd==CMD_SET_PARAMETER)
ldd R24,y+10
cpi R24,2
breq X135
xjmp L46
X135:
X19:
.dbline 230
; {
.dbline 231
; switch (msg_buffer[1])
lds R12,_msg_buffer+1
mov R24,R12
cpi R24,152
breq L52
X20:
cpi R24,152
brsh X136
xjmp L48
X136:
X21:
L77:
mov R24,R12
cpi R24,158
brne X137
xjmp L73
X137:
X22:
cpi R24,159
brne X138
xjmp L75
X138:
X23:
xjmp L48
L52:
.dbline 234
; {
; case PARAM_SCK_DURATION:
; clock_speed=SPI_SPEED_2MHZ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -